diff --git a/runtime/src/env.c b/runtime/src/env.c index 93c0a6e..60088d7 100644 --- a/runtime/src/env.c +++ b/runtime/src/env.c @@ -1,5 +1,6 @@ /* https://github.com/gwsystems/silverfish/blob/master/runtime/libc/libc_backing.c */ #include +#include extern i32 inner_syscall_handler(i32 n, i32 a, i32 b, i32 c, i32 d, i32 e, i32 f); @@ -33,7 +34,7 @@ INLINE void env_a_and_64(i32 p_off, u64 v) { uint64_t *p = worker_thread_get_memory_ptr_void(p_off, sizeof(uint64_t)); - *p &= v; + ck_pr_and_64(p, v); } INLINE void @@ -41,37 +42,37 @@ env_a_or_64(i32 p_off, i64 v) { assert(sizeof(i64) == sizeof(uint64_t)); uint64_t *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i64)); - *p |= v; + ck_pr_or_64(p, v); } i32 env_a_cas(i32 p_off, i32 t, i32 s) { assert(sizeof(i32) == sizeof(volatile int)); - volatile int *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i32)); + int *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i32)); - return __sync_val_compare_and_swap(p, t, s); + return ck_pr_cas_int(p, t, s); } void env_a_or(i32 p_off, i32 v) { - assert(sizeof(i32) == sizeof(volatile int)); - volatile int *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i32)); - //__asm__("lock ; or %1, %0" : "=m"(*p) : "r"(v) : "memory"); - *p |= v; + assert(sizeof(i32) == sizeof(volatile int)); + int *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i32)); + ck_pr_or_int(p, v); } i32 env_a_swap(i32 x_off, i32 v) { assert(sizeof(i32) == sizeof(volatile int)); - volatile int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); + int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); - //__asm__("xchg %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory"); - int t = *x; - *x = v; - v = t; + int p; + do { + p = ck_pr_load_int(x); + } while (!ck_pr_cas_int(x, p, v)); + v = p; return v; } @@ -80,39 +81,32 @@ i32 env_a_fetch_add(i32 x_off, i32 v) { assert(sizeof(i32) == sizeof(volatile int)); - volatile int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); - - //__asm__("lock ; xadd %0, %1" : "=r"(v), "=m"(*x) : "0"(v) : "memory"); - return __sync_fetch_and_add(x, v); + int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); + return ck_pr_faa_int(x, v); } void env_a_inc(i32 x_off) { assert(sizeof(i32) == sizeof(volatile int)); - volatile int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); - (*x)++; - - //__asm__("lock ; incl %0" : "=m"(*x) : "m"(*x) : "memory"); + int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); + ck_pr_inc_int(x); } void env_a_dec(i32 x_off) { assert(sizeof(i32) == sizeof(volatile int)); - volatile int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); - (*x)--; - - //__asm__("lock ; decl %0" : "=m"(*x) : "m"(*x) : "memory"); + int *x = worker_thread_get_memory_ptr_void(x_off, sizeof(i32)); + ck_pr_dec_int(x); } void env_a_store(i32 p_off, i32 x) { assert(sizeof(i32) == sizeof(volatile int)); - volatile int *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i32)); - *p = x; - //__asm__ __volatile__("mov %1, %0 ; lock ; orl $0,(%%esp)" : "=m"(*p) : "r"(x) : "memory"); + int *p = worker_thread_get_memory_ptr_void(p_off, sizeof(i32)); + ck_pr_store_int(p, x); } int @@ -124,8 +118,7 @@ env_a_ctz_32(i32 x) void env_do_spin(i32 i) { - printf("nope! not happening: %d\n", i); - assert(0); + ck_pr_stall(); } void @@ -138,7 +131,7 @@ env_do_crash(i32 i) void env_do_barrier(i32 x) { - __sync_synchronize(); + ck_pr_barrier(); } // Floating point routines