* Read an array of N counters in kernel memory into array of N uint64_t's. */
| 866 | * Read an array of N counters in kernel memory into array of N uint64_t's. |
| 867 | */ |
| 868 | int |
| 869 | kread_counters(u_long addr, void *buf, size_t size) |
| 870 | { |
| 871 | uint64_t *c; |
| 872 | u_long *counters; |
| 873 | size_t i, n; |
| 874 | |
| 875 | if (kvmd_init() < 0) |
| 876 | return (-1); |
| 877 | |
| 878 | if (size % sizeof(uint64_t) != 0) { |
| 879 | xo_warnx("kread_counters: invalid counter set size"); |
| 880 | return (-1); |
| 881 | } |
| 882 | |
| 883 | n = size / sizeof(uint64_t); |
| 884 | if ((counters = malloc(n * sizeof(u_long))) == NULL) |
| 885 | xo_err(-1, "malloc"); |
| 886 | if (kread(addr, counters, n * sizeof(u_long)) < 0) { |
| 887 | free(counters); |
| 888 | return (-1); |
| 889 | } |
| 890 | |
| 891 | c = buf; |
| 892 | for (i = 0; i < n; i++) |
| 893 | c[i] = kvm_counter_u64_fetch(kvmd, counters[i]); |
| 894 | |
| 895 | free(counters); |
| 896 | return (0); |
| 897 | } |
| 898 | |
| 899 | #else |
| 900 | int |