diff options
author | H. Peter Anvin <hpa@zytor.com> | 2006-06-21 09:54:12 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2006-06-21 09:54:12 -0700 |
commit | a442690dc473e4324a758767beb1c19beb64be14 (patch) | |
tree | cc8e8b21212537e0b7c97d5a696ef480eb86fe62 /usr | |
parent | e09e21aff7659c8c65cef258376dc6439f0d4b89 (diff) | |
parent | 4e51186fb663b57ac7c53517947510d2e1e9de01 (diff) | |
download | linux-2.6-klibc-a442690dc473e4324a758767beb1c19beb64be14.tar.gz |
Merge with klibc-1.4.1
Diffstat (limited to 'usr')
-rw-r--r-- | usr/klibc/arch/arm/MCONFIG | 12 | ||||
-rw-r--r-- | usr/klibc/arch/arm/Makefile.inc | 27 | ||||
-rw-r--r-- | usr/klibc/arch/arm/setjmp-arm.S | 39 | ||||
-rw-r--r-- | usr/klibc/arch/arm/setjmp.S (renamed from usr/klibc/arch/arm/setjmp-thumb.S) | 48 | ||||
-rw-r--r-- | usr/klibc/arch/arm/syscall.S | 4 | ||||
-rw-r--r-- | usr/klibc/arch/arm/sysstub.ph | 25 | ||||
-rw-r--r-- | usr/klibc/syscalls/Kbuild | 2 | ||||
-rw-r--r-- | usr/klibc/version | 2 | ||||
-rw-r--r-- | usr/utils/Kbuild | 12 | ||||
-rw-r--r-- | usr/utils/halt.c | 55 |
10 files changed, 135 insertions, 91 deletions
diff --git a/usr/klibc/arch/arm/MCONFIG b/usr/klibc/arch/arm/MCONFIG index ee099d9b53599b..0023eeeaa1b189 100644 --- a/usr/klibc/arch/arm/MCONFIG +++ b/usr/klibc/arch/arm/MCONFIG @@ -19,8 +19,14 @@ ifeq ($(CONFIG_KLIBC_THUMB),y) CPU_ARCH := $(CPU_ARCH)t KLIBCREQFLAGS += -mthumb KLIBCLDFLAGS += --thumb-entry _start -KLIBCREQFLAGS += -mabi=apcs-gnu +KLIBCEMAIN = --thumb-entry _start +KLIBCREQFLAGS += -mabi=aapcs-linux +KLIBCSHAREDFLAGS = -Ttext 0x380200 else +# Extra linkflags when building the shared version of the library +# This address needs to be reachable using normal inter-module +# calls, and work on the memory models for this architecture +KLIBCSHAREDFLAGS = -Ttext 0x01800200 ifeq ($(CONFIG_AEABI),y) KLIBCREQFLAGS += -mabi=aapcs-linux -mno-thumb-interwork else @@ -28,7 +34,3 @@ KLIBCREQFLAGS += -mabi=apcs-gnu -mno-thumb-interwork endif endif -# Extra linkflags when building the shared version of the library -# This address needs to be reachable using normal inter-module -# calls, and work on the memory models for this architecture -KLIBCSHAREDFLAGS = -Ttext 0x01000200 diff --git a/usr/klibc/arch/arm/Makefile.inc b/usr/klibc/arch/arm/Makefile.inc index 48f066679e5b2c..92229183097ecd 100644 --- a/usr/klibc/arch/arm/Makefile.inc +++ b/usr/klibc/arch/arm/Makefile.inc @@ -8,6 +8,7 @@ # KLIBCARCHOBJS = \ + arch/arm/setjmp.o \ arch/arm/syscall.o \ arch/arm/vfork.o \ arch/arm/aeabi_nonsense.o \ @@ -17,28 +18,6 @@ KLIBCARCHOBJS = \ libgcc/__udivdi3.o \ libgcc/__umoddi3.o \ libgcc/__udivmoddi4.o \ + libgcc/__clzsi2.o \ + libgcc/__clzdi2.o \ -ifeq ($(CONFIG_KLIBC_THUMB),y) -KLIBCLIBGCC := -KLIBCARCHOBJS += arch/arm/setjmp-thumb.o \ - arch/arm/__muldi3.o \ - libgcc/__divsi3.o \ - libgcc/__modsi3.o \ - libgcc/__udivsi3.o \ - libgcc/__umodsi3.o \ - -else -KLIBCARCHOBJS += arch/arm/setjmp-arm.o -endif - -arch/arm/sysstubs.a: arch/arm/sysstubs.pl - mkdir -p arch/arm/sysstubs - $(PERL) $< arch/arm/sysstubs - $(MAKE) $(patsubst %.S,%.o,$(wildcard arch/arm/sysstubs/*.S)) - -rm -f $@ - $(AR) cq $@ arch/arm/sysstubs/*.o - $(RANLIB) $@ - -archclean: - -rm -rf arch/arm/sysstubs - -rm -f arch/arm/sysstubs.a diff --git a/usr/klibc/arch/arm/setjmp-arm.S b/usr/klibc/arch/arm/setjmp-arm.S deleted file mode 100644 index 94facecdfba782..00000000000000 --- a/usr/klibc/arch/arm/setjmp-arm.S +++ /dev/null @@ -1,39 +0,0 @@ -# -# arch/arm/setjmp.S -# -# setjmp/longjmp for the ARM architecture -# - -# -# The jmp_buf is assumed to contain the following, in order: -# r4 -# r5 -# r6 -# r7 -# r8 -# r9 -# r10 -# fp -# sp -# lr -# - - .text - .balign 4 - .globl setjmp - .type setjmp, #function -setjmp: - stmia r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr} - mov r0, #0 - mov pc, lr - .size setjmp,.-setjmp - - .text - .balign 4 - .globl longjmp - .type longjmp, #function -longjmp: - ldmia r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr} - mov r0, r1 - mov pc, lr - .size longjmp,.-longjmp diff --git a/usr/klibc/arch/arm/setjmp-thumb.S b/usr/klibc/arch/arm/setjmp.S index 4b8d789cfe812b..1841bc73993e72 100644 --- a/usr/klibc/arch/arm/setjmp-thumb.S +++ b/usr/klibc/arch/arm/setjmp.S @@ -1,9 +1,51 @@ # -# arch/arm/setjmp-thumb.S +# arch/arm/setjmp.S # -# setjmp/longjmp for the ARM/thumb architecture +# setjmp/longjmp for the ARM architecture # +#ifndef __thumb__ + +# +# "Pure ARM" version +# +# The jmp_buf is assumed to contain the following, in order: +# r4 +# r5 +# r6 +# r7 +# r8 +# r9 +# r10 +# fp +# sp +# lr +# + + .text + .balign 4 + .globl setjmp + .type setjmp, #function +setjmp: + stmia r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr} + mov r0, #0 + mov pc, lr + .size setjmp,.-setjmp + + .text + .balign 4 + .globl longjmp + .type longjmp, #function +longjmp: + ldmia r0, {r4, r5, r6, r7, r8, r9, r10, fp, sp, lr} + mov r0, r1 + mov pc, lr + .size longjmp,.-longjmp + +#else /* __thumb__ */ + +# +# Thumb version # # The jmp_buf is assumed to contain the following, in order: # lr @@ -56,3 +98,5 @@ longjmp: mov r0, #1 1: mov pc, r3 .size longjmp,.-longjmp + +#endif /* __thumb__ */ diff --git a/usr/klibc/arch/arm/syscall.S b/usr/klibc/arch/arm/syscall.S index 153d7237c01e02..5bc291d0751481 100644 --- a/usr/klibc/arch/arm/syscall.S +++ b/usr/klibc/arch/arm/syscall.S @@ -15,6 +15,7 @@ __syscall_common: #ifdef __ARM_EABI__ ldr r4, [sp,#16] ldr r5, [sp,#20] + ldr r7, [lr] swi 0 #endif cmn r0, #4096 @@ -34,8 +35,11 @@ __syscall_common: .thumb_func .balign 2 __syscall_common: + mov r7, lr ldr r4, [sp,#16] + sub r7, #1 /* Remove the Thumb bit */ ldr r5, [sp,#20] + ldrh r7, [r7] swi 0 ldr r1, 2f cmp r0, r1 diff --git a/usr/klibc/arch/arm/sysstub.ph b/usr/klibc/arch/arm/sysstub.ph index 19e79a665dc4f0..d51ace1279b97c 100644 --- a/usr/klibc/arch/arm/sysstub.ph +++ b/usr/klibc/arch/arm/sysstub.ph @@ -18,11 +18,11 @@ sub make_sysstub($$$$$@) { print OUT " .globl ${fname}\n"; print OUT "#ifndef __thumb__\n"; - print OUT " .balign 4\n"; print OUT "#ifndef __ARM_EABI__\n"; # ARM version first + print OUT " .balign 4\n"; print OUT "${fname}:\n"; print OUT " stmfd sp!,{r4,r5,lr}\n"; print OUT " ldr r4,[sp,#12]\n"; @@ -33,35 +33,22 @@ sub make_sysstub($$$$$@) { print OUT "#else /* __ARM_EABI__ */\n"; # ARM EABI version + print out " .balign 4\n"; print OUT "${fname}:\n"; print OUT " stmfd sp!,{r4,r5,r7,lr}\n"; - print OUT "#if ARM_VALID_IMM(__NR_${sname})\n"; - print OUT " mov r7, # __NR_${sname}\n"; - print OUT " b __syscall_common\n"; - print OUT "#else\n"; - print OUT " mov r7, # (__NR_${sname} & 0xff00)\n"; - print OUT " add r7, r7, # (__NR_${sname} & 0xff)\n"; - print OUT " b __syscall_common\n"; - print OUT "#endif\n"; + print OUT " bl __syscall_common\n"; + print OUT " .word __NR_${sname}\n"; print OUT "#endif /* __ARM_EABI__ */\n"; print OUT "#else /* __thumb__ */\n"; # Thumb version - print OUT " .balign 4\n"; + print OUT " .balign 8\n"; print OUT " .thumb_func\n"; print OUT "${fname}:\n"; print OUT " push {r4,r5,r7,lr}\n"; - print OUT "#if __NR_${sname} <= 0xff\n"; - print OUT " mov r7, # __NR_${sname}\n"; - print OUT " bl __syscall_common\n"; - print OUT "#else\n"; - print OUT " ldr r7, 1f\n"; print OUT " bl __syscall_common\n"; - print OUT " .balign 4\n"; - print OUT "1:\n"; - print OUT " .word __NR_${sname}\n"; - print OUT "#endif\n"; + print OUT " .short __NR_${sname}\n"; print OUT "#endif /* __thumb__*/\n"; diff --git a/usr/klibc/syscalls/Kbuild b/usr/klibc/syscalls/Kbuild index debcd16329b1bb..e7ae1d24b40156 100644 --- a/usr/klibc/syscalls/Kbuild +++ b/usr/klibc/syscalls/Kbuild @@ -28,6 +28,8 @@ clean-files += $(KLIBCINC)/klibc/havesyscall.h # All the syscall stubs clean-files += *.o *.S *.c *.list *.bin +EXTRA_KLIBCCFLAGS := -I$(srctree)/$(src) + quiet_cmd_makelist = LIST $@ cmd_makelist = echo '$(filter-out FORCE,$^)' > $@ diff --git a/usr/klibc/version b/usr/klibc/version index c068b2447cc223..347f5833ee6db7 100644 --- a/usr/klibc/version +++ b/usr/klibc/version @@ -1 +1 @@ -1.4 +1.4.1 diff --git a/usr/utils/Kbuild b/usr/utils/Kbuild index f760a6b0dc0163..b3b8d8a18da2c9 100644 --- a/usr/utils/Kbuild +++ b/usr/utils/Kbuild @@ -4,7 +4,7 @@ progs := chroot dd mkdir mkfifo mount pivot_root umount progs += true false sleep ln nuke minips cat -progs += insmod uname +progs += insmod uname halt static-y := $(addprefix static/, $(progs)) shared-y := $(addprefix shared/, $(progs)) @@ -42,6 +42,16 @@ static/insmod-y := insmod.o shared/insmod-y := insmod.o static/uname-y := uname.o shared/uname-y := uname.o +static/halt-y := halt.o +shared/halt-y := halt.o + +# Additionally linked targets +always := static/reboot static/poweroff shared/reboot shared/poweroff + +$(obj)/static/reboot $(obj)/static/poweroff: $(obj)/static/halt + $(call cmd,ln) +$(obj)/shared/reboot $(obj)/shared/poweroff: $(obj)/shared/halt + $(call cmd,ln) # Clean deletes the static and shared dir clean-dirs := static shared diff --git a/usr/utils/halt.c b/usr/utils/halt.c new file mode 100644 index 00000000000000..a6656b5c2209c6 --- /dev/null +++ b/usr/utils/halt.c @@ -0,0 +1,55 @@ +#include <stdlib.h> +#include <unistd.h> +#include <signal.h> +#include <sys/reboot.h> +#include <klibc/compiler.h> + +static __noreturn usage(void) +{ + static char mesg[] = "Usage: {halt|reboot|poweroff} [-n]\n"; + write(2, mesg, sizeof(mesg) - 1); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int cmd = 0; /* initalize to shut gcc up */ + int do_sync = 1; + char *ptr, *ptr2; + + /* Which action (program name)? */ + ptr2 = ptr = argv[0]; + while (*ptr2) + if (*ptr2++ == '/') + ptr = ptr2; + if (*ptr == 'r') + cmd = LINUX_REBOOT_CMD_RESTART; + else if (*ptr == 'h') + cmd = LINUX_REBOOT_CMD_HALT; + else if (*ptr == 'p') + cmd = LINUX_REBOOT_CMD_POWER_OFF; + else + usage(); + + /* Walk options */ + while (*++argv && **argv == '-') + switch (*++*argv) { + case 'f': break; /* -f assumed */ + case 'n': do_sync = 0; break; + default: + usage(); + } + if (*argv) + usage(); /* any args == error */ + + if (do_sync) + sync(); + reboot(LINUX_REBOOT_CMD_CAD_OFF); /* Enable CTRL+ALT+DEL */ + if (!reboot(cmd)) { + /* Success. Currently, CMD_HALT returns, so stop the world */ + /* kill(-1, SIGSTOP); */ + kill(getpid(), SIGSTOP); + } + write(2, "failed.\n", 8); + return 1; +} |