aboutsummaryrefslogtreecommitdiffstats
path: root/usr
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2006-06-21 09:54:12 -0700
committerH. Peter Anvin <hpa@zytor.com>2006-06-21 09:54:12 -0700
commita442690dc473e4324a758767beb1c19beb64be14 (patch)
treecc8e8b21212537e0b7c97d5a696ef480eb86fe62 /usr
parente09e21aff7659c8c65cef258376dc6439f0d4b89 (diff)
parent4e51186fb663b57ac7c53517947510d2e1e9de01 (diff)
downloadlinux-2.6-klibc-a442690dc473e4324a758767beb1c19beb64be14.tar.gz
Merge with klibc-1.4.1
Diffstat (limited to 'usr')
-rw-r--r--usr/klibc/arch/arm/MCONFIG12
-rw-r--r--usr/klibc/arch/arm/Makefile.inc27
-rw-r--r--usr/klibc/arch/arm/setjmp-arm.S39
-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.S4
-rw-r--r--usr/klibc/arch/arm/sysstub.ph25
-rw-r--r--usr/klibc/syscalls/Kbuild2
-rw-r--r--usr/klibc/version2
-rw-r--r--usr/utils/Kbuild12
-rw-r--r--usr/utils/halt.c55
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;
+}