aboutsummaryrefslogtreecommitdiff
path: root/pk
diff options
context:
space:
mode:
authorYunsup Lee <yunsup@cs.berkeley.edu>2010-10-11 22:42:56 -0700
committerYunsup Lee <yunsup@cs.berkeley.edu>2010-10-11 22:43:32 -0700
commit2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02 (patch)
treea4d0c0c5a7b3fe88ff8efcabedca300ab8b2b4b5 /pk
parent3aaacd44769a04e4aff3a3c788183e6a7fa75081 (diff)
downloadpk-2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02.zip
pk-2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02.tar.gz
pk-2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02.tar.bz2
[pk] no amos for now, add a sync before triggering the frontend
Diffstat (limited to 'pk')
-rw-r--r--pk/atomic.h10
-rw-r--r--pk/frontend.c2
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);