slkern/sync.c

70 lines
1.1 KiB
C

// This is NEW CODE to implement the sync operations supported by other C compilers
#include "sync.h"
#ifdef _ZCC
void __naked __sync_synchronize() __asm {
//fence
fence rw,rw
ret
}
unsigned int __naked __sync_lock_test_and_set(unsigned int* p, unsigned int v) __asm {
amoswap.w.aq a1, a1, (a0)
mv a0, a1
ret
// a5 = 1
// s1 = &lk->locked
// amoswap.w.aq a5, a5, (s1)
//uint old = *p;
// *p = v;
//return old;
}
void __naked __sync_lock_release(unsigned int* p) __asm {
amoswap.w zero, zero, (a0)
ret
// *p = 0;
}
/*
void __naked __sync_synchronize() __asm {
addi sp,sp,-16
sd s0,8(sp)
addi s0,sp,16
fence rw,rw
nop
ld s0,8(sp)
addi sp,sp,16
jr ra
}
uint __naked __sync_lock_test_and_set(uint*p, uint v) __asm {
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
sd a0,-24(s0)
mv a5,a1
sw a5,-28(s0)
ld a5,-24(s0)
lw a4,-28(s0)
amoswap.w.aq a4,a4,0(a5)
sext.w a5,a4
mv a0,a5
ld s0,24(sp)
addi sp,sp,32
jr ra
}
void __naked __sync_lock_release(uint* p) __asm {
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
sd a0,-24(s0)
ld a5,-24(s0)
fence rw,w
sw zero,0(a5)
nop
ld s0,24(sp)
addi sp,sp,32
jr ra
}
*/
#endif