diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-21 19:53:27 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-21 19:53:27 +0200 |
commit | 3d05e77ca1f743e5b4091c6bfe311460175ed9ae (patch) | |
tree | d17a262c559e389e3adb6171de308800eb9d3426 /sys/src/libc/mips | |
parent | 041e4852d258f05fe5f60964a76c99714905774e (diff) |
libc: change tas/sleep locks to cas/semacquire/semrelease locks (from sources)
spinlocks have been changed to use the new semacquire/semrelease
syscalls in combination with atomic compare and swap operations.
Diffstat (limited to 'sys/src/libc/mips')
-rw-r--r-- | sys/src/libc/mips/atom.s | 13 | ||||
-rw-r--r-- | sys/src/libc/mips/lock.c | 171 | ||||
-rw-r--r-- | sys/src/libc/mips/mkfile | 1 | ||||
-rw-r--r-- | sys/src/libc/mips/tas.s | 1 |
4 files changed, 5 insertions, 181 deletions
diff --git a/sys/src/libc/mips/atom.s b/sys/src/libc/mips/atom.s index 8975ac569..b907f7f59 100644 --- a/sys/src/libc/mips/atom.s +++ b/sys/src/libc/mips/atom.s @@ -12,7 +12,8 @@ TEXT _xinc(SB), 1, $-4 /* void _xinc(long *); */ loop: MOVW $1, R3 LL(2, 1) NOOP - ADD R1,R3,R3 + ADDU R1, R3 + MOVW R3, R1 /* return new value */ SC(2, 3) NOOP BEQ R3,loop @@ -24,8 +25,8 @@ TEXT _xdec(SB), 1, $-4 /* long _xdec(long *); */ loop1: MOVW $-1, R3 LL(2, 1) NOOP - ADD R1,R3,R3 - MOVW R3, R1 + ADDU R1, R3 + MOVW R3, R1 /* return new value */ SC(2, 3) NOOP BEQ R3,loop1 @@ -49,9 +50,3 @@ spincas: fail: MOVW $0, R1 RET - -/* general-purpose abort */ -_trap: - MOVD $0, R0 - MOVD 0(R0), R0 - RET diff --git a/sys/src/libc/mips/lock.c b/sys/src/libc/mips/lock.c deleted file mode 100644 index 9c9bd2208..000000000 --- a/sys/src/libc/mips/lock.c +++ /dev/null @@ -1,171 +0,0 @@ -#include <u.h> -#include <libc.h> - -enum -{ - Pagesize = 4096, - Semperpg = Pagesize/(16*sizeof(uint)), - Lockaddr = 0x60000000, - - POWER = 0x320, - MAGNUM = 0x330, - MAGNUMII = 0x340, - R4K = 0x500, -}; - -static int arch; -extern int C_3ktas(int*); -extern int C_4ktas(int*); -extern int C_fcr0(void); - -static void -lockinit(void) -{ - void *v; - - if(arch != 0) - return; /* allow multiple calls */ - arch = C_fcr0(); - switch(arch) { - case POWER: - v = (void*)Lockaddr; - if(segattach(SG_CEXEC, "lock", v, Pagesize) == (void*)-1) { - arch = MAGNUM; - break; - } - memset(v, 0, Pagesize); - break; - case MAGNUM: - case MAGNUMII: - case R4K: - break; - default: - arch = R4K; - break; - } -} - -void -lock(Lock *lk) -{ - int *hwsem; - int hash; - -retry: - switch(arch) { - case 0: - lockinit(); - goto retry; - case MAGNUM: - case MAGNUMII: - while(C_3ktas(&lk->val)) - sleep(0); - return; - case R4K: - for(;;){ - while(lk->val) - ; - if(C_4ktas(&lk->val) == 0) - return; - } - break; - case POWER: - /* Use low order lock bits to generate hash */ - hash = ((int)lk/sizeof(int)) & (Semperpg-1); - hwsem = (int*)Lockaddr+hash; - - for(;;) { - if((*hwsem & 1) == 0) { - if(lk->val) - *hwsem = 0; - else { - lk->val = 1; - *hwsem = 0; - return; - } - } - while(lk->val) - ; - } - } -} - -int -canlock(Lock *lk) -{ - int *hwsem; - int hash; - -retry: - switch(arch) { - case 0: - lockinit(); - goto retry; - case MAGNUM: - case MAGNUMII: - if(C_3ktas(&lk->val)) - return 0; - return 1; - case R4K: - if(C_4ktas(&lk->val)) - return 0; - return 1; - case POWER: - /* Use low order lock bits to generate hash */ - hash = ((int)lk/sizeof(int)) & (Semperpg-1); - hwsem = (int*)Lockaddr+hash; - - if((*hwsem & 1) == 0) { - if(lk->val) - *hwsem = 0; - else { - lk->val = 1; - *hwsem = 0; - return 1; - } - } - break; - } - return 0; -} - -void -unlock(Lock *lk) -{ - lk->val = 0; -} - -int -_tas(int *p) -{ - int *hwsem; - int hash; - -retry: - switch(arch) { - case 0: - lockinit(); - goto retry; - case MAGNUM: - case MAGNUMII: - return C_3ktas(p); - case R4K: - return C_4ktas(p); - case POWER: - /* Use low order lock bits to generate hash */ - hash = ((int)p/sizeof(int)) & (Semperpg-1); - hwsem = (int*)Lockaddr+hash; - - if((*hwsem & 1) == 0) { - if(*p) - *hwsem = 0; - else { - *p = 1; - *hwsem = 0; - return 0; - } - } - break; - } - return 1; -} diff --git a/sys/src/libc/mips/mkfile b/sys/src/libc/mips/mkfile index 3b902f6e3..460f7cd2f 100644 --- a/sys/src/libc/mips/mkfile +++ b/sys/src/libc/mips/mkfile @@ -23,7 +23,6 @@ SFILES=\ CFILES=\ cycles.c\ - lock.c\ notejmp.c\ sqrt.c\ vlrt.c\ diff --git a/sys/src/libc/mips/tas.s b/sys/src/libc/mips/tas.s index d754b21f6..a9bf40721 100644 --- a/sys/src/libc/mips/tas.s +++ b/sys/src/libc/mips/tas.s @@ -17,6 +17,7 @@ btas: BLTZ R1, btas RET + TEXT _tas(SB),$0 TEXT C_4ktas(SB), $0 MOVW R1, R2 /* address of key */ tas1: |