diff options
author | Yunsup Lee <yunsup@cs.berkeley.edu> | 2010-10-11 22:42:56 -0700 |
---|---|---|
committer | Yunsup Lee <yunsup@cs.berkeley.edu> | 2010-10-11 22:43:32 -0700 |
commit | 2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02 (patch) | |
tree | a4d0c0c5a7b3fe88ff8efcabedca300ab8b2b4b5 | |
parent | 3aaacd44769a04e4aff3a3c788183e6a7fa75081 (diff) | |
download | pk-2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02.zip pk-2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02.tar.gz pk-2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02.tar.bz2 |
[pk] no amos for now, add a sync before triggering the frontend
-rw-r--r-- | pk/atomic.h | 10 | ||||
-rw-r--r-- | pk/frontend.c | 2 |
2 files changed, 10 insertions, 2 deletions
diff --git a/pk/atomic.h b/pk/atomic.h index 942c398..88bb239 100644 --- a/pk/atomic.h +++ b/pk/atomic.h @@ -7,12 +7,18 @@ typedef struct { atomic_t lock; } spinlock_t; static inline long atomic_add(atomic_t* a, long inc) { - return __sync_fetch_and_add(&a->val, inc); + //return __sync_fetch_and_add(&a->val, inc); + long ret = a->val; + a->val++; + return ret; } static inline long atomic_swap(atomic_t* a, long val) { - return __sync_lock_test_and_set(&a->val, val); + //return __sync_lock_test_and_set(&a->val, val); + long reg = a->val; + a->val = val; + return reg; } static inline void atomic_set(atomic_t* a, long val) diff --git a/pk/frontend.c b/pk/frontend.c index c28dca4..5c0fdc0 100644 --- a/pk/frontend.c +++ b/pk/frontend.c @@ -17,6 +17,8 @@ sysret_t frontend_syscall(long n, long a0, long a1, long a2, long a3) magic_mem[3] = a2; magic_mem[4] = a3; + asm volatile ("sync"); + mtpcr(magic_mem,PCR_TOHOST); while(mfpcr(PCR_FROMHOST) == 0); |