summaryrefslogtreecommitdiff
path: root/sys/src/libc/mips
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-09-21 19:53:27 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-09-21 19:53:27 +0200
commit3d05e77ca1f743e5b4091c6bfe311460175ed9ae (patch)
treed17a262c559e389e3adb6171de308800eb9d3426 /sys/src/libc/mips
parent041e4852d258f05fe5f60964a76c99714905774e (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.s13
-rw-r--r--sys/src/libc/mips/lock.c171
-rw-r--r--sys/src/libc/mips/mkfile1
-rw-r--r--sys/src/libc/mips/tas.s1
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: