diff --git a/sys/cddl/compat/opensolaris/sys/atomic.h b/sys/cddl/compat/opensolaris/sys/atomic.h index 9e30f3da666..4546dd97cb7 100644 --- a/sys/cddl/compat/opensolaris/sys/atomic.h +++ b/sys/cddl/compat/opensolaris/sys/atomic.h @@ -43,7 +43,7 @@ #if !defined(__LP64__) && !defined(__mips_n32) && \ !defined(ARM_HAVE_ATOMIC64) && !defined(I386_HAVE_ATOMIC64) -extern void atomic_add_64(volatile uint64_t *target, int64_t delta); +extern void atomic_add_64(volatile uint64_t *target, uint64_t delta); extern void atomic_dec_64(volatile uint64_t *target); extern uint64_t atomic_swap_64(volatile uint64_t *a, uint64_t value); extern uint64_t atomic_load_64(volatile uint64_t *a); diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index 020b959f303..62fb3b0c15d 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -76,7 +76,7 @@ dev/uart/uart_cpu_powerpc.c optional uart dev/usb/controller/ehci_fsl.c optional ehci mpc85xx dev/vt/hw/ofwfb/ofwfb.c optional vt aim kern/kern_clocksource.c standard -#kern/subr_atomic64.c optional powerpc | powerpcspe +kern/subr_atomic64.c optional powerpc | powerpcspe kern/subr_dummy_vdso_tc.c standard kern/syscalls.c optional ktr kern/subr_sfbuf.c standard diff --git a/sys/kern/subr_atomic64.c b/sys/kern/subr_atomic64.c index 8f7982afd23..3c725e95687 100644 --- a/sys/kern/subr_atomic64.c +++ b/sys/kern/subr_atomic64.c @@ -27,9 +27,11 @@ #include #include +#include #include #include #include +#include #include #include @@ -72,6 +74,15 @@ struct atomic64_sysarch_args { #define UNLOCK_A64() if (smp_started) mtx_unlock(_amtx) +#define ATOMIC64_EMU_UN(op, rt, block, ret) \ + rt \ + atomic_##op##_64(volatile u_int64_t *p) { \ + u_int64_t tmp __unused; \ + LOCK_A64(); \ + block; \ + UNLOCK_A64(); \ + ret; } struct hack + #define ATOMIC64_EMU_BIN(op, rt, block, ret) \ rt \ atomic_##op##_64(volatile u_int64_t *p, u_int64_t v) { \ @@ -86,6 +97,7 @@ static struct mtx a64_mtx_pool[A64_POOL_SIZE]; ATOMIC64_EMU_BIN(add, void, (*p = *p + v), return); ATOMIC64_EMU_BIN(clear, void, *p &= ~v, return); ATOMIC64_EMU_BIN(fetchadd, u_int64_t, (*p = *p + v, v = *p - v), return (v)); +ATOMIC64_EMU_UN(load, u_int64_t, (tmp = *p), return (tmp)); ATOMIC64_EMU_BIN(set, void, *p |= v, return); ATOMIC64_EMU_BIN(subtract, void, (*p = *p - v), return); ATOMIC64_EMU_BIN(store, void, *p = v, return); @@ -121,7 +133,7 @@ int atomic_fcmpset_64(volatile u_int64_t *p, u_int64_t *old, u_int64_t new) } static void -atomic64_mtxinit(void) +atomic64_mtxinit(void *x __unused) { int i; @@ -137,7 +149,7 @@ int sysarch_atomic64(void *args) { struct atomic64_sysarch_args a64_args; - u_int64_t p, fv; + u_int64_t p; int err; err = copyin(args, &a64_args, sizeof(a64_args)); @@ -145,44 +157,45 @@ sysarch_atomic64(void *args) return (err); mtx_lock(&atomic64_user_mtx); - err = copyin(a64_args, &p, sizeof(p)); + err = copyin(a64_args.p, &p, sizeof(p)); if (err < 0) { mtx_unlock(&atomic64_user_mtx); goto err; } - switch (a64_args->type) { + switch (a64_args.type) { case ATOMIC64_ADD: - atomic_add_64(&p, a64_args->v); + atomic_add_64(&p, a64_args.v); break; case ATOMIC64_CLEAR: - atomic_clear_64(&p, a64_args->v); + atomic_clear_64(&p, a64_args.v); break; case ATOMIC64_CMPSET: - a64_args->rval = - atomic_cmpset_64(p, a64_args->v, a64_args->arg2); + a64_args.rval = + atomic_cmpset_64(&p, a64_args.v, a64_args.arg2); break; case ATOMIC64_FCMPSET: - a64_args->rval = - atomic_fcmpset_64(p, &a64_args->v, a64_args->arg2); + /* XXX arg2 is a pointer */ + a64_args.rval = + atomic_fcmpset_64(&p, &a64_args.v, a64_args.arg2); break; case ATOMIC64_FETCHADD: - atomic_fetchadd_64(&p, a64_args->v); + atomic_fetchadd_64(&p, a64_args.v); break; case ATOMIC64_LOAD: - a64_args->rval = p; + a64_args.rval = p; break; case ATOMIC64_SET: - atomic_set_64(&p, a64_args->v); + atomic_set_64(&p, a64_args.v); break; case ATOMIC64_SUBTRACT: - atomic_subtract_64(&p, a64_args->v); + atomic_subtract_64(&p, a64_args.v); break; case ATOMIC64_STORE: - copyout(&a64_args->v, a64_args->p, sizeof(a64_args->p)); + copyout(&a64_args.v, a64_args.p, sizeof(a64_args.p)); break; case ATOMIC64_SWAP: - a64_args->rval = p; - copyout(&a64_args->v, a64_args->p, sizeof(a64_args->p)); + a64_args.rval = p; + copyout(&a64_args.v, a64_args.p, sizeof(a64_args.p)); break; }; diff --git a/sys/powerpc/powerpc/sys_machdep.c b/sys/powerpc/powerpc/sys_machdep.c index ab5527ad69e..17edc2659a4 100644 --- a/sys/powerpc/powerpc/sys_machdep.c +++ b/sys/powerpc/powerpc/sys_machdep.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #ifdef COMPAT_FREEBSD32 #include diff --git a/sys/sys/_atomic64e.h b/sys/sys/_atomic64e.h index e195113ad2d..b48f299cf40 100644 --- a/sys/sys/_atomic64e.h +++ b/sys/sys/_atomic64e.h @@ -55,7 +55,7 @@ int atomic_fcmpset_64(volatile u_int64_t *, u_int64_t *, u_int64_t); u_int64_t atomic_fetchadd_64(volatile u_int64_t *, u_int64_t); -void atomic_load_64(volatile u_int64_t *); +u_int64_t atomic_load_64(volatile u_int64_t *); #define atomic_load_acq_64 atomic_load_64 void atomic_readandclear_64(volatile u_int64_t *);