Date: Wed, 6 May 2009 04:32:11 GMT From: Arnar Mar Sig <antab@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 161647 for review Message-ID: <200905060432.n464WBD3081755@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=161647 Change 161647 by antab@antab_farm on 2009/05/06 04:31:26 * Start implementing syscalls * Build world with -fno-omit-frame-pointer to make debugging possible Affected files ... .. //depot/projects/avr32/src/lib/csu/avr32/crt1.c#3 edit .. //depot/projects/avr32/src/lib/csu/avr32/crti.S#2 edit .. //depot/projects/avr32/src/lib/csu/avr32/crtn.S#2 edit .. //depot/projects/avr32/src/lib/libc/avr32/SYS.h#3 edit .. //depot/projects/avr32/src/lib/libc/avr32/sys/Ovfork.S#2 edit .. //depot/projects/avr32/src/lib/libc/avr32/sys/brk.S#2 edit .. //depot/projects/avr32/src/lib/libc/avr32/sys/cerror.S#2 edit .. //depot/projects/avr32/src/lib/libc/avr32/sys/pipe.S#2 edit .. //depot/projects/avr32/src/lib/libc/avr32/sys/ptrace.S#2 edit .. //depot/projects/avr32/src/lib/libc/avr32/sys/sbrk.S#2 edit .. //depot/projects/avr32/src/share/mk/bsd.cpu.mk#5 edit Differences ... ==== //depot/projects/avr32/src/lib/csu/avr32/crt1.c#3 (text+ko) ==== @@ -39,12 +39,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef lint -#ifndef __GNUC__ -#error "GCC is needed to compile this file" -#endif -#endif /* lint */ - #include <stdlib.h> #include "libc_private.h" @@ -57,11 +51,12 @@ extern int _DYNAMIC; #pragma weak _DYNAMIC +typedef void (*fptr)(void); + extern void _fini(void); extern void _init(void); extern int main(int, char **, char **); -extern void _start(int, char **, char **, struct ps_strings *, - const struct Struct_Obj_Entry *, void (*cleanup)(void)); +extern void _start(char *ap, struct ps_strings *, ...); #ifdef GCRT extern void _mcleanup(void); @@ -75,11 +70,18 @@ struct ps_strings *__ps_strings; void -_start(int argc, char **argv, char **env, struct ps_strings *ps_strings, - const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void)) +_start(char *ap, struct ps_strings *ps_strings, ...) { + fptr cleanup; + int argc; + char **argv; + char **env; const char *s; + //cleanup = get_rtld_cleanup(); + argv = ≈ + argc = *(int *)(void *)(argv - 1); + env = argv + argc + 1; environ = env; if (argc > 0 && argv[0] != NULL) { @@ -96,6 +98,7 @@ atexit(cleanup); else _init_tls(); + #ifdef GCRT atexit(_mcleanup); #endif @@ -104,7 +107,7 @@ monstartup(&eprol, &etext); #endif _init(); - exit( main(argc, argv, env) ); + exit(main(argc, argv, env)); } #ifdef GCRT ==== //depot/projects/avr32/src/lib/csu/avr32/crti.S#2 (text+ko) ==== @@ -2,15 +2,17 @@ __FBSDID("$FreeBSD: $"); .section .init,"ax",%progbits -.align 4 -.globl _init +.align 2 +.global _init .type _init,%function _init: - breakpoint + stm --sp, r6,lr + /* gcc crti loads got, should we? */ .section .fini,"ax",%progbits -.align 4 -.globl _fini +.align 2 +.global _fini .type _fini,%function _fini: - breakpoint + stm --sp, r6,lr + /* gcc crti loads got, should we? */ ==== //depot/projects/avr32/src/lib/csu/avr32/crtn.S#2 (text+ko) ==== @@ -2,7 +2,7 @@ __FBSDID("$FreeBSD: $"); .section .init,"ax",%progbits - breakpoint + ldm sp++, r6,pc .section .fini,"ax",%progbits - breakpoint + ldm sp++, r6,pc ==== //depot/projects/avr32/src/lib/libc/avr32/SYS.h#3 (text+ko) ==== @@ -1,16 +1,18 @@ #include <sys/syscall.h> #include <machine/asm.h> -#define RSYSCALL(x) \ +#define RSYSCALL(x) \ PSEUDO(x) -#define PSEUDO(x) \ - ENTRY(__CONCAT(__sys_, x)); \ - .weak _C_LABEL(x); \ - .set _C_LABEL(x), _C_LABEL(__CONCAT(__sys_,x)); \ - .weak _C_LABEL(__CONCAT(_,x)); \ - .set _C_LABEL(__CONCAT(_,x)),_C_LABEL(__CONCAT(__sys_,x)); \ - SCALL(x); \ - retal sp; \ +#define PSEUDO(x) \ + .text ;\ + ENTRY(__CONCAT(__sys_, x)) ;\ + .weak _C_LABEL(x) ;\ + .set _C_LABEL(x), _C_LABEL(__CONCAT(__sys_, x)) ;\ + .weak _C_LABEL(__CONCAT(_, x)) ;\ + .set _C_LABEL(__CONCAT(_, x)),_C_LABEL(__CONCAT(__sys_, x)) ;\ + SCALL(x) ;\ + retcc r12 ;\ + rjmp _C_LABEL(cerror) ;\ END(__CONCAT(__sys_, x)) ==== //depot/projects/avr32/src/lib/libc/avr32/sys/Ovfork.S#2 (text+ko) ==== @@ -36,10 +36,9 @@ * r0 == pid of child in parent, r0 == pid of parent in child. * XXX: Finish implementing */ - .text - .align 0 - +.text ENTRY(vfork) breakpoint SCALL(vfork) retal sp +END(vfork) ==== //depot/projects/avr32/src/lib/libc/avr32/sys/brk.S#2 (text+ko) ==== @@ -40,7 +40,9 @@ /* XXX: This needs work */ +.text ENTRY(brk) breakpoint SCALL(break) - retal sp + retal r11 +END(brk) ==== //depot/projects/avr32/src/lib/libc/avr32/sys/cerror.S#2 (text+ko) ==== @@ -36,14 +36,17 @@ .global _C_LABEL(__error) .type _C_LABEL(__error), %function -.data -_C_LABEL(minbrk): - .word _C_LABEL(_end) -_C_LABEL(curbrk): - .word _C_LABEL(_end) +/** + * r12: errno value to safe, set when returning from SCALL() + */ +.text +ENTRY(cerror) + stm --sp, r6,r7,lr /* Create call frame and save r6 */ + mov r7, sp /* Set framepointer */ + mov r6, r12 /* Save r12 (errno) */ - -ENTRY(cerror) - breakpoint - /* This need work... */ - retal sp + call _C_LABEL(__error) /* Call __error() to get pointer to errno */ + st.w r12, r6 /* Store errno */ + mov r12, -1 /* Return -1 */ + ldm sp++, r6,r7,pc /* Return */ +END(cerror) ==== //depot/projects/avr32/src/lib/libc/avr32/sys/pipe.S#2 (text+ko) ==== @@ -28,7 +28,9 @@ __FBSDID("$FreeBSD: $"); #include "SYS.h" +.text ENTRY(pipe) breakpoint SCALL(pipe) retal sp +END(pipe) ==== //depot/projects/avr32/src/lib/libc/avr32/sys/ptrace.S#2 (text+ko) ==== @@ -28,7 +28,9 @@ __FBSDID("$FreeBSD: $"); #include "SYS.h" +.text ENTRY(ptrace) breakpoint SCALL(ptrace) retal sp +END(ptrace) ==== //depot/projects/avr32/src/lib/libc/avr32/sys/sbrk.S#2 (text+ko) ==== @@ -35,8 +35,39 @@ _C_LABEL(__curbrk): .word _C_LABEL(_end) -/* XXX: This need work */ +/* + * r10: new curbrk + * r9: old curbrk + * r8: Pointer to curbrk + */ +.text ENTRY(sbrk) - breakpoint - SCALL(break) - retal sp + stm --sp, r7,lr /* Create call frame amd save r5,r6 */ + + lddpc r8, sbrk_curbrk /* Pointer to curbrk */ + ld.w r9, r8 /* Load old curbrk */ + cp.w r12, 0 /* sbrk(0) ? */ + breq sbrk_return /* yes, just return curbrk */ + + add r10, r12, r9 /* Calculate new break, hold in r10 */ + mov r12, r10 + SCALL(break) /* Do syscall, r12 and r11 hold return values */ + cp.w r12, 0 /* Error from syscall? */ + brne sbrk_error /* Yes */ + + st.w r8, r10 /* Save new curbrk */ + mov r12, r9 /* return old curbrk */ + ldm sp++, r7,pc /* return */ + +sbrk_error: + call _C_LABEL(cerror) /* Call cerror(errno) to safe errno */ + mov r12, -1 /* Return -1 */ + ldm sp++, r7,pc /* Return */ + +sbrk_return: + mov r12, r9 /* Return curbrk */ + ldm sp++, r7,pc /* Return */ + +sbrk_curbrk: + .word _C_LABEL(__curbrk) +END(sbrk) ==== //depot/projects/avr32/src/share/mk/bsd.cpu.mk#5 (text+ko) ==== @@ -202,6 +202,11 @@ LD += -EB .endif +.if ${MACHINE_ARCH} == "avr32" +# XXX: Needed for debugging +CFLAGS += -fno-omit-frame-pointer +.endif + .if ${MACHINE_ARCH} == "mips" . if defined(TARGET_BIG_ENDIAN) CFLAGS += -EB
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905060432.n464WBD3081755>