Generate illegal instruction fault if LWS syscall returns -EFAULT.
2022-01-02 John David Anglin <danglin@gcc.gnu.org> libgcc/ChangeLog: * config/pa/linux-atomic.c (_ASM_EFAULT): Define. (__kernel_cmpxchg): Nullify illegal iitlbp instruction if error return is not equal _ASM_EFAULT. (__kernel_cmpxchg2): Likewise.
This commit is contained in:
parent
4759c16bee
commit
4620531ea9
1 changed files with 6 additions and 0 deletions
|
@ -28,6 +28,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|||
#define EBUSY 16
|
||||
#define ENOSYS 251
|
||||
|
||||
#define _ASM_EFAULT "-14"
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef short unsigned int u16;
|
||||
#ifdef __LP64__
|
||||
|
@ -58,6 +60,8 @@ __kernel_cmpxchg (volatile void *mem, int oldval, int newval)
|
|||
register long lws_errno asm("r21");
|
||||
asm volatile ( "ble 0xb0(%%sr2, %%r0) \n\t"
|
||||
"ldi %2, %%r20 \n\t"
|
||||
"cmpiclr,<> " _ASM_EFAULT ", %%r21, %%r0\n\t"
|
||||
"iitlbp %%r0,(%%sr0, %%r0) \n\t"
|
||||
: "=r" (lws_ret), "=r" (lws_errno)
|
||||
: "i" (LWS_CAS), "r" (lws_mem), "r" (lws_old), "r" (lws_new)
|
||||
: "r1", "r20", "r22", "r23", "r29", "r31", "memory"
|
||||
|
@ -84,6 +88,8 @@ __kernel_cmpxchg2 (volatile void *mem, const void *oldval, const void *newval,
|
|||
register long lws_errno asm("r21");
|
||||
asm volatile ( "ble 0xb0(%%sr2, %%r0) \n\t"
|
||||
"ldi %6, %%r20 \n\t"
|
||||
"cmpiclr,<> " _ASM_EFAULT ", %%r21, %%r0\n\t"
|
||||
"iitlbp %%r0,(%%sr0, %%r0) \n\t"
|
||||
: "=r" (lws_ret), "=r" (lws_errno), "+r" (lws_mem),
|
||||
"+r" (lws_old), "+r" (lws_new), "+r" (lws_size)
|
||||
: "i" (2)
|
||||
|
|
Loading…
Add table
Reference in a new issue