Date: Wed, 12 Nov 2014 13:19:31 +0000 (UTC) From: Andrew Turner <andrew@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r274431 - in projects/arm64: lib/libc/arm64 lib/libc/arm64/sys sys/arm64/arm64 sys/arm64/include Message-ID: <201411121319.sACDJVs3070455@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: andrew Date: Wed Nov 12 13:19:30 2014 New Revision: 274431 URL: https://svnweb.freebsd.org/changeset/base/274431 Log: Set the C bit in spsr to indicate when syscalls fail, and use it to set errno on failure. Added: projects/arm64/lib/libc/arm64/sys/cerror.S - copied, changed from r274430, projects/arm64/sys/arm64/include/asm.h Modified: projects/arm64/lib/libc/arm64/SYS.h projects/arm64/lib/libc/arm64/sys/Makefile.inc projects/arm64/sys/arm64/arm64/vm_machdep.c projects/arm64/sys/arm64/include/asm.h Modified: projects/arm64/lib/libc/arm64/SYS.h ============================================================================== --- projects/arm64/lib/libc/arm64/SYS.h Wed Nov 12 13:19:25 2014 (r274430) +++ projects/arm64/lib/libc/arm64/SYS.h Wed Nov 12 13:19:30 2014 (r274431) @@ -48,6 +48,7 @@ END(__sys_##name) ENTRY(__sys_##name); \ WEAK_REFERENCE(__sys_##name, _##name); \ _SYSCALL(name); \ + b.cs PIC_SYM(cerror, PLT); \ ret; \ END(__sys_##name) @@ -56,6 +57,7 @@ ENTRY(__sys_##name); \ WEAK_REFERENCE(__sys_##name, name); \ WEAK_REFERENCE(__sys_##name, _##name); \ _SYSCALL(name); \ + b.cs PIC_SYM(cerror, PLT); \ ret; \ END(__sys_##name) Modified: projects/arm64/lib/libc/arm64/sys/Makefile.inc ============================================================================== --- projects/arm64/lib/libc/arm64/sys/Makefile.inc Wed Nov 12 13:19:25 2014 (r274430) +++ projects/arm64/lib/libc/arm64/sys/Makefile.inc Wed Nov 12 13:19:30 2014 (r274431) @@ -2,7 +2,8 @@ SRCS+= __vdso_gettc.c -#MDASM= Ovfork.S brk.S cerror.S pipe.S ptrace.S sbrk.S shmat.S sigreturn.S syscall.S +#MDASM= Ovfork.S brk.S pipe.S ptrace.S sbrk.S shmat.S sigreturn.S syscall.S +MDASM= cerror.S # Don't generate default code for these syscalls: NOASM= break.o exit.o getlogin.o openbsd_poll.o sstk.o vfork.o yield.o Copied and modified: projects/arm64/lib/libc/arm64/sys/cerror.S (from r274430, projects/arm64/sys/arm64/include/asm.h) ============================================================================== --- projects/arm64/sys/arm64/include/asm.h Wed Nov 12 13:19:25 2014 (r274430, copy source) +++ projects/arm64/lib/libc/arm64/sys/cerror.S Wed Nov 12 13:19:30 2014 (r274431) @@ -25,26 +25,17 @@ * */ -#ifndef _MACHINE_ASM_H_ -#define _MACHINE_ASM_H_ +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); -#undef __FBSDID -#if !defined(lint) && !defined(STRIP_FBSDID) -#define __FBSDID(s) .ident s -#else -#define __FBSDID(s) /* nothing */ -#endif - -#define _C_LABEL(x) x - -#define ENTRY(sym) \ - .text; .globl sym; .align 2; sym: -#define END(sym) .size sym, . - sym - -#define WEAK_REFERENCE(sym, alias) \ - .weak alias; \ - .set alias,sym - -#define UINT64_C(x) (x) - -#endif /* _MACHINE_ASM_H_ */ +ENTRY(cerror) + sub sp, sp, #16 + stp x0, lr, [sp] + bl PIC_SYM(_C_LABEL(__error), PLT) + ldp x1, lr, [sp] + str x1, [x0] + movn x0, #0 + movn x1, #0 + add sp, sp, #16 + ret +END(cerror) Modified: projects/arm64/sys/arm64/arm64/vm_machdep.c ============================================================================== --- projects/arm64/sys/arm64/arm64/vm_machdep.c Wed Nov 12 13:19:25 2014 (r274430) +++ projects/arm64/sys/arm64/arm64/vm_machdep.c Wed Nov 12 13:19:30 2014 (r274431) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <vm/uma.h> #include <vm/uma_int.h> +#include <machine/armreg.h> #include <machine/cpu.h> #include <machine/pcb.h> #include <machine/frame.h> @@ -115,6 +116,7 @@ cpu_set_syscall_retval(struct thread *td case 0: frame->tf_x[0] = td->td_retval[0]; frame->tf_x[1] = td->td_retval[1]; + frame->tf_spsr &= ~PSR_C; /* carry bit */ break; case ERESTART: frame->tf_elr -= 4; @@ -122,6 +124,7 @@ cpu_set_syscall_retval(struct thread *td case EJUSTRETURN: break; default: + frame->tf_spsr |= PSR_C; /* carry bit */ frame->tf_x[0] = error; break; } Modified: projects/arm64/sys/arm64/include/asm.h ============================================================================== --- projects/arm64/sys/arm64/include/asm.h Wed Nov 12 13:19:25 2014 (r274430) +++ projects/arm64/sys/arm64/include/asm.h Wed Nov 12 13:19:30 2014 (r274431) @@ -47,4 +47,10 @@ #define UINT64_C(x) (x) +#if defined(PIC) +#define PIC_SYM(x,y) x ## @ ## y +#else +#define PIC_SYM(x,y) x +#endif + #endif /* _MACHINE_ASM_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411121319.sACDJVs3070455>