|
@@ -100,14 +100,12 @@ set_thread_pointer:
|
|
.endr
|
|
.endr
|
|
|
|
|
|
/* This address must remain fixed at 0x100 for glibc's syscalls to work */
|
|
/* This address must remain fixed at 0x100 for glibc's syscalls to work */
|
|
- .align 256
|
|
|
|
|
|
+ .align LINUX_GATEWAY_ADDR
|
|
linux_gateway_entry:
|
|
linux_gateway_entry:
|
|
gate .+8, %r0 /* become privileged */
|
|
gate .+8, %r0 /* become privileged */
|
|
mtsp %r0,%sr4 /* get kernel space into sr4 */
|
|
mtsp %r0,%sr4 /* get kernel space into sr4 */
|
|
mtsp %r0,%sr5 /* get kernel space into sr5 */
|
|
mtsp %r0,%sr5 /* get kernel space into sr5 */
|
|
mtsp %r0,%sr6 /* get kernel space into sr6 */
|
|
mtsp %r0,%sr6 /* get kernel space into sr6 */
|
|
- mfsp %sr7,%r1 /* save user sr7 */
|
|
|
|
- mtsp %r1,%sr3 /* and store it in sr3 */
|
|
|
|
|
|
|
|
#ifdef CONFIG_64BIT
|
|
#ifdef CONFIG_64BIT
|
|
/* for now we can *always* set the W bit on entry to the syscall
|
|
/* for now we can *always* set the W bit on entry to the syscall
|
|
@@ -133,6 +131,14 @@ linux_gateway_entry:
|
|
depdi 0, 31, 32, %r21
|
|
depdi 0, 31, 32, %r21
|
|
1:
|
|
1:
|
|
#endif
|
|
#endif
|
|
|
|
+
|
|
|
|
+ /* We use a rsm/ssm pair to prevent sr3 from being clobbered
|
|
|
|
+ * by external interrupts.
|
|
|
|
+ */
|
|
|
|
+ mfsp %sr7,%r1 /* save user sr7 */
|
|
|
|
+ rsm PSW_SM_I, %r0 /* disable interrupts */
|
|
|
|
+ mtsp %r1,%sr3 /* and store it in sr3 */
|
|
|
|
+
|
|
mfctl %cr30,%r1
|
|
mfctl %cr30,%r1
|
|
xor %r1,%r30,%r30 /* ye olde xor trick */
|
|
xor %r1,%r30,%r30 /* ye olde xor trick */
|
|
xor %r1,%r30,%r1
|
|
xor %r1,%r30,%r1
|
|
@@ -147,6 +153,7 @@ linux_gateway_entry:
|
|
*/
|
|
*/
|
|
|
|
|
|
mtsp %r0,%sr7 /* get kernel space into sr7 */
|
|
mtsp %r0,%sr7 /* get kernel space into sr7 */
|
|
|
|
+ ssm PSW_SM_I, %r0 /* enable interrupts */
|
|
STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */
|
|
STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */
|
|
mfctl %cr30,%r1 /* get task ptr in %r1 */
|
|
mfctl %cr30,%r1 /* get task ptr in %r1 */
|
|
LDREG TI_TASK(%r1),%r1
|
|
LDREG TI_TASK(%r1),%r1
|
|
@@ -474,11 +481,6 @@ lws_start:
|
|
comiclr,>> __NR_lws_entries, %r20, %r0
|
|
comiclr,>> __NR_lws_entries, %r20, %r0
|
|
b,n lws_exit_nosys
|
|
b,n lws_exit_nosys
|
|
|
|
|
|
- /* WARNING: Trashing sr2 and sr3 */
|
|
|
|
- mfsp %sr7,%r1 /* get userspace into sr3 */
|
|
|
|
- mtsp %r1,%sr3
|
|
|
|
- mtsp %r0,%sr2 /* get kernel space into sr2 */
|
|
|
|
-
|
|
|
|
/* Load table start */
|
|
/* Load table start */
|
|
ldil L%lws_table, %r1
|
|
ldil L%lws_table, %r1
|
|
ldo R%lws_table(%r1), %r28 /* Scratch use of r28 */
|
|
ldo R%lws_table(%r1), %r28 /* Scratch use of r28 */
|
|
@@ -627,9 +629,9 @@ cas_action:
|
|
stw %r1, 4(%sr2,%r20)
|
|
stw %r1, 4(%sr2,%r20)
|
|
#endif
|
|
#endif
|
|
/* The load and store could fail */
|
|
/* The load and store could fail */
|
|
-1: ldw,ma 0(%sr3,%r26), %r28
|
|
|
|
|
|
+1: ldw,ma 0(%r26), %r28
|
|
sub,<> %r28, %r25, %r0
|
|
sub,<> %r28, %r25, %r0
|
|
-2: stw,ma %r24, 0(%sr3,%r26)
|
|
|
|
|
|
+2: stw,ma %r24, 0(%r26)
|
|
/* Free lock */
|
|
/* Free lock */
|
|
stw,ma %r20, 0(%sr2,%r20)
|
|
stw,ma %r20, 0(%sr2,%r20)
|
|
#if ENABLE_LWS_DEBUG
|
|
#if ENABLE_LWS_DEBUG
|
|
@@ -706,9 +708,9 @@ lws_compare_and_swap_2:
|
|
nop
|
|
nop
|
|
|
|
|
|
/* 8bit load */
|
|
/* 8bit load */
|
|
-4: ldb 0(%sr3,%r25), %r25
|
|
|
|
|
|
+4: ldb 0(%r25), %r25
|
|
b cas2_lock_start
|
|
b cas2_lock_start
|
|
-5: ldb 0(%sr3,%r24), %r24
|
|
|
|
|
|
+5: ldb 0(%r24), %r24
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
@@ -716,9 +718,9 @@ lws_compare_and_swap_2:
|
|
nop
|
|
nop
|
|
|
|
|
|
/* 16bit load */
|
|
/* 16bit load */
|
|
-6: ldh 0(%sr3,%r25), %r25
|
|
|
|
|
|
+6: ldh 0(%r25), %r25
|
|
b cas2_lock_start
|
|
b cas2_lock_start
|
|
-7: ldh 0(%sr3,%r24), %r24
|
|
|
|
|
|
+7: ldh 0(%r24), %r24
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
@@ -726,9 +728,9 @@ lws_compare_and_swap_2:
|
|
nop
|
|
nop
|
|
|
|
|
|
/* 32bit load */
|
|
/* 32bit load */
|
|
-8: ldw 0(%sr3,%r25), %r25
|
|
|
|
|
|
+8: ldw 0(%r25), %r25
|
|
b cas2_lock_start
|
|
b cas2_lock_start
|
|
-9: ldw 0(%sr3,%r24), %r24
|
|
|
|
|
|
+9: ldw 0(%r24), %r24
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
@@ -737,14 +739,14 @@ lws_compare_and_swap_2:
|
|
|
|
|
|
/* 64bit load */
|
|
/* 64bit load */
|
|
#ifdef CONFIG_64BIT
|
|
#ifdef CONFIG_64BIT
|
|
-10: ldd 0(%sr3,%r25), %r25
|
|
|
|
-11: ldd 0(%sr3,%r24), %r24
|
|
|
|
|
|
+10: ldd 0(%r25), %r25
|
|
|
|
+11: ldd 0(%r24), %r24
|
|
#else
|
|
#else
|
|
/* Load new value into r22/r23 - high/low */
|
|
/* Load new value into r22/r23 - high/low */
|
|
-10: ldw 0(%sr3,%r25), %r22
|
|
|
|
-11: ldw 4(%sr3,%r25), %r23
|
|
|
|
|
|
+10: ldw 0(%r25), %r22
|
|
|
|
+11: ldw 4(%r25), %r23
|
|
/* Load new value into fr4 for atomic store later */
|
|
/* Load new value into fr4 for atomic store later */
|
|
-12: flddx 0(%sr3,%r24), %fr4
|
|
|
|
|
|
+12: flddx 0(%r24), %fr4
|
|
#endif
|
|
#endif
|
|
|
|
|
|
cas2_lock_start:
|
|
cas2_lock_start:
|
|
@@ -794,30 +796,30 @@ cas2_action:
|
|
ldo 1(%r0),%r28
|
|
ldo 1(%r0),%r28
|
|
|
|
|
|
/* 8bit CAS */
|
|
/* 8bit CAS */
|
|
-13: ldb,ma 0(%sr3,%r26), %r29
|
|
|
|
|
|
+13: ldb,ma 0(%r26), %r29
|
|
sub,= %r29, %r25, %r0
|
|
sub,= %r29, %r25, %r0
|
|
b,n cas2_end
|
|
b,n cas2_end
|
|
-14: stb,ma %r24, 0(%sr3,%r26)
|
|
|
|
|
|
+14: stb,ma %r24, 0(%r26)
|
|
b cas2_end
|
|
b cas2_end
|
|
copy %r0, %r28
|
|
copy %r0, %r28
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
|
|
/* 16bit CAS */
|
|
/* 16bit CAS */
|
|
-15: ldh,ma 0(%sr3,%r26), %r29
|
|
|
|
|
|
+15: ldh,ma 0(%r26), %r29
|
|
sub,= %r29, %r25, %r0
|
|
sub,= %r29, %r25, %r0
|
|
b,n cas2_end
|
|
b,n cas2_end
|
|
-16: sth,ma %r24, 0(%sr3,%r26)
|
|
|
|
|
|
+16: sth,ma %r24, 0(%r26)
|
|
b cas2_end
|
|
b cas2_end
|
|
copy %r0, %r28
|
|
copy %r0, %r28
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
|
|
/* 32bit CAS */
|
|
/* 32bit CAS */
|
|
-17: ldw,ma 0(%sr3,%r26), %r29
|
|
|
|
|
|
+17: ldw,ma 0(%r26), %r29
|
|
sub,= %r29, %r25, %r0
|
|
sub,= %r29, %r25, %r0
|
|
b,n cas2_end
|
|
b,n cas2_end
|
|
-18: stw,ma %r24, 0(%sr3,%r26)
|
|
|
|
|
|
+18: stw,ma %r24, 0(%r26)
|
|
b cas2_end
|
|
b cas2_end
|
|
copy %r0, %r28
|
|
copy %r0, %r28
|
|
nop
|
|
nop
|
|
@@ -825,22 +827,22 @@ cas2_action:
|
|
|
|
|
|
/* 64bit CAS */
|
|
/* 64bit CAS */
|
|
#ifdef CONFIG_64BIT
|
|
#ifdef CONFIG_64BIT
|
|
-19: ldd,ma 0(%sr3,%r26), %r29
|
|
|
|
|
|
+19: ldd,ma 0(%r26), %r29
|
|
sub,*= %r29, %r25, %r0
|
|
sub,*= %r29, %r25, %r0
|
|
b,n cas2_end
|
|
b,n cas2_end
|
|
-20: std,ma %r24, 0(%sr3,%r26)
|
|
|
|
|
|
+20: std,ma %r24, 0(%r26)
|
|
copy %r0, %r28
|
|
copy %r0, %r28
|
|
#else
|
|
#else
|
|
/* Compare first word */
|
|
/* Compare first word */
|
|
-19: ldw,ma 0(%sr3,%r26), %r29
|
|
|
|
|
|
+19: ldw,ma 0(%r26), %r29
|
|
sub,= %r29, %r22, %r0
|
|
sub,= %r29, %r22, %r0
|
|
b,n cas2_end
|
|
b,n cas2_end
|
|
/* Compare second word */
|
|
/* Compare second word */
|
|
-20: ldw,ma 4(%sr3,%r26), %r29
|
|
|
|
|
|
+20: ldw,ma 4(%r26), %r29
|
|
sub,= %r29, %r23, %r0
|
|
sub,= %r29, %r23, %r0
|
|
b,n cas2_end
|
|
b,n cas2_end
|
|
/* Perform the store */
|
|
/* Perform the store */
|
|
-21: fstdx %fr4, 0(%sr3,%r26)
|
|
|
|
|
|
+21: fstdx %fr4, 0(%r26)
|
|
copy %r0, %r28
|
|
copy %r0, %r28
|
|
#endif
|
|
#endif
|
|
|
|
|