Index: sys/dev/hwpmc/hwpmc_mod.c =================================================================== --- sys/dev/hwpmc/hwpmc_mod.c +++ sys/dev/hwpmc/hwpmc_mod.c @@ -57,8 +57,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -89,7 +91,7 @@ * The offset in sysent where the syscall is allocated. */ -static int pmc_syscall_num = NO_SYSCALL; +static int pmc_syscall_num = SYS_pmc_syscall; struct pmc_cpu **pmc_pcpu; /* per-cpu state */ pmc_value_t *pmc_pcpu_saved; /* saved PMC values: CSW handling */ @@ -222,7 +224,6 @@ static void pmc_select_cpu(int cpu); static int pmc_start(struct pmc *pm); static int pmc_stop(struct pmc *pm); -static int pmc_syscall_handler(struct thread *td, void *syscall_args); static void pmc_unlink_target_process(struct pmc *pmc, struct pmc_process *pp); static int generic_switch_in(struct pmc_cpu *pc, struct pmc_process *pp); @@ -314,7 +315,7 @@ /* The `sysent' for the new syscall */ static struct sysent pmc_sysent = { .sy_narg = 2, - .sy_call = pmc_syscall_handler, + .sy_call = (sy_call_t *)sys_pmc_syscall, }; static struct syscall_module_data pmc_syscall_mod = { @@ -2852,17 +2853,15 @@ is_sx_downgraded = 1; \ } while (0) -static int -pmc_syscall_handler(struct thread *td, void *syscall_args) +int +sys_pmc_syscall(struct thread *td, struct pmc_syscall_args *uap) { int error, is_sx_downgraded, op; - struct pmc_syscall_args *c; void *pmclog_proc_handle; void *arg; - c = (struct pmc_syscall_args *)syscall_args; - op = c->pmop_code; - arg = c->pmop_data; + op = uap->pmop_code; + arg = uap->pmop_data; if (op == PMC_OP_CONFIGURELOG) { /* * We cannot create the logging process inside Index: sys/kern/init_sysent.c =================================================================== --- sys/kern/init_sysent.c +++ sys/kern/init_sysent.c @@ -614,4 +614,5 @@ { AS(kevent_args), (sy_call_t *)sys_kevent, AUE_KEVENT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 560 = kevent */ { AS(cpuset_getdomain_args), (sy_call_t *)sys_cpuset_getdomain, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 561 = cpuset_getdomain */ { AS(cpuset_setdomain_args), (sy_call_t *)sys_cpuset_setdomain, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 562 = cpuset_setdomain */ + { AS(pmc_syscall_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 563 = pmc_syscall */ }; Index: sys/kern/syscalls.c =================================================================== --- sys/kern/syscalls.c +++ sys/kern/syscalls.c @@ -569,4 +569,5 @@ "kevent", /* 560 = kevent */ "cpuset_getdomain", /* 561 = cpuset_getdomain */ "cpuset_setdomain", /* 562 = cpuset_setdomain */ + "pmc_syscall", /* 563 = pmc_syscall */ }; Index: sys/kern/syscalls.master =================================================================== --- sys/kern/syscalls.master +++ sys/kern/syscalls.master @@ -1027,6 +1027,8 @@ cpuwhich_t which, id_t id, \ size_t domainsetsize, domainset_t *mask, \ int policy); } +563 AUE_NULL NOSTD { int pmc_syscall(uint64_t pmop_code, \ + void *pmop_data); } ; Please copy any additions and changes to the following compatability tables: ; sys/compat/freebsd32/syscalls.master Index: sys/kern/systrace_args.c =================================================================== --- sys/kern/systrace_args.c +++ sys/kern/systrace_args.c @@ -3282,6 +3282,14 @@ *n_args = 6; break; } + /* pmc_syscall */ + case 563: { + struct pmc_syscall_args *p = params; + uarg[0] = p->pmop_code; /* uint64_t */ + uarg[1] = (intptr_t) p->pmop_data; /* void * */ + *n_args = 2; + break; + } default: *n_args = 0; break; @@ -8752,6 +8760,19 @@ break; }; break; + /* pmc_syscall */ + case 563: + switch(ndx) { + case 0: + p = "uint64_t"; + break; + case 1: + p = "userland void *"; + break; + default: + break; + }; + break; default: break; }; @@ -10638,6 +10659,11 @@ if (ndx == 0 || ndx == 1) p = "int"; break; + /* pmc_syscall */ + case 563: + if (ndx == 0 || ndx == 1) + p = "int"; + break; default: break; }; Index: sys/sys/pmc.h =================================================================== --- sys/sys/pmc.h +++ sys/sys/pmc.h @@ -640,15 +640,6 @@ * (o) - po->po_mtx (spin lock) */ -/* - * PMC commands - */ - -struct pmc_syscall_args { - register_t pmop_code; /* one of PMC_OP_* */ - void *pmop_data; /* syscall parameter */ -}; - /* * Interface to processor specific s1tuff */ Index: sys/sys/syscall.h =================================================================== --- sys/sys/syscall.h +++ sys/sys/syscall.h @@ -478,4 +478,5 @@ #define SYS_kevent 560 #define SYS_cpuset_getdomain 561 #define SYS_cpuset_setdomain 562 -#define SYS_MAXSYSCALL 563 +#define SYS_pmc_syscall 563 +#define SYS_MAXSYSCALL 564 Index: sys/sys/syscall.mk =================================================================== --- sys/sys/syscall.mk +++ sys/sys/syscall.mk @@ -405,4 +405,5 @@ mknodat.o \ kevent.o \ cpuset_getdomain.o \ - cpuset_setdomain.o + cpuset_setdomain.o \ + pmc_syscall.o Index: sys/sys/sysproto.h =================================================================== --- sys/sys/sysproto.h +++ sys/sys/sysproto.h @@ -1768,6 +1768,10 @@ char mask_l_[PADL_(domainset_t *)]; domainset_t * mask; char mask_r_[PADR_(domainset_t *)]; char policy_l_[PADL_(int)]; int policy; char policy_r_[PADR_(int)]; }; +struct pmc_syscall_args { + char pmop_code_l_[PADL_(uint64_t)]; uint64_t pmop_code; char pmop_code_r_[PADR_(uint64_t)]; + char pmop_data_l_[PADL_(void *)]; void * pmop_data; char pmop_data_r_[PADR_(void *)]; +}; int nosys(struct thread *, struct nosys_args *); void sys_sys_exit(struct thread *, struct sys_exit_args *); int sys_fork(struct thread *, struct fork_args *); @@ -2148,6 +2152,7 @@ int sys_kevent(struct thread *, struct kevent_args *); int sys_cpuset_getdomain(struct thread *, struct cpuset_getdomain_args *); int sys_cpuset_setdomain(struct thread *, struct cpuset_setdomain_args *); +int sys_pmc_syscall(struct thread *, struct pmc_syscall_args *); #ifdef COMPAT_43 @@ -3040,6 +3045,7 @@ #define SYS_AUE_kevent AUE_KEVENT #define SYS_AUE_cpuset_getdomain AUE_NULL #define SYS_AUE_cpuset_setdomain AUE_NULL +#define SYS_AUE_pmc_syscall AUE_NULL #undef PAD_ #undef PADL_