From: Shanti K. <ka...@cs...> - 2002-09-15 23:39:51
|
Hi All, For those who are interested, below is the latest patch for UML to add Sparc64 support. This patch is based off of Iain Young's initial work on Sparc64. The patch in it's current stage compiles and creates an executable, with most of the options, turned off in the config. Help from concerned persons in debugging the executable, is highly appreciated. Sparc64 architecture is wierd in the sense that it has a 64-bit kernel, although the user-space is still 32-bit. I have made uml-binaries 64-bit. Two *Most important* things: 1. I used gcc-3.0.4 to create this patch(because that was the only compiler available with 64-bit support that could be used on my Debian(sid) system), and hence it contains some bits in arch/um/Makefile, which are specific to gcc-3.0.4. If you want to use any other compiler with 64-bit support, you need to modify that section. 2. As Iain mentioned earlier, gcc complains about _siginfo_fpu_t and sigcontext structures in files /usr/include/bits/sigcontext.h and /usr/include/asm-sparc64/sigcontext.h, although the structures are defined identically in both files. Hence, I just added: #ifndef <macro-name> #define <macro-name> around both structures in /usr/include/bits/sigcontext.h. And in /usr/include/asm-sparc64/sigcontext.h, I added #ifndef <macro-name>, for both struct's to make sure that only struct's from one of the 2 file's is getting included. Below is the changelog, and the patch. You need to apply the uml-patch-2.4.18-22 from Jeff to the mainline first. Since some parts of the patch are broken(intentional ofcourse ;-)), it might break your top level makefile. Hence, it's advisable to apply the following patch in a separate tree. -Shanti Changes in uml-2.4.18-22-sparc64-1 - Changed top-level Makefile to point to sparc64-linux Cross-compiler. - Added checksum.h and removed arch-signal.h from SYMLINK_HEADERS in arch/um/Makefile. Also changed the linux: entry to include CFLAGS and gcc-3.0.4 specific bits, to help it to compile. - Added Makefile-sparc64. - Added arch/um/include/sysdep-sparc64 dir with files frame.h, frame_kern.h, frame_user.h, ptrace.h, ptrace_user.h,sc.h, sigcontext.h and syscalls.h. - Changed arch/um/kernel/Makefile linker options to force 64-bit build. - Commented out entries for PT_REGS_IP and PT_REGS_SP(which are i386 specific) in frame_kern.c. - Modified irq.c to undef disable_irq_nosync. - Commented out lines for SA_NODEFER and SA_RESTORER macros in signal_kern.c - Commented out syscalls in sys_call_table.c and syscall_kern.c that are not implemented in linux/Sparc. - Modified time_kern.c to include a Sparc64 specific delay loop. - Added arch/um/sys-sparc64 dir with files Makefile, ksyms.c, memstuff.c(which includes stubs for mem functions that are not implemented on Sparc64), misc.c(Miscellaneous functions that need Sparc64 specific implementation), ptrace.c, ptrace_user.c and sigcontext.c in it. - Modified include/asm-sparc64/checksum.h and page.h to comment out definition for "cur_ds" pointer and undef (virt_to_phys, phys_to_virt) macros respectively. - Also in include/asm-sparc64/unistd.h, commented out some macros. -Added archparam-sparc64.h, checksum-generic.h, checksum-sparc64.h, elf-sparc64.h, processor-sparc64.h, ptrace-sparc64.h, sigcontext-sparc64.h, system-sparc64.h and modified page.h diff -Naur -X dontdiff linux-2.4.18-origum/Makefile linux-2.4.18-sparc64um/Makefile --- linux-2.4.18-origum/Makefile 2002-09-12 19:00:35.000000000 -0500 +++ linux-2.4.18-sparc64um/Makefile 2002-09-13 11:33:48.000000000 -0500 @@ -27,7 +27,7 @@ HOSTCC = gcc HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -CROSS_COMPILE = +CROSS_COMPILE = sparc64-linux- # # Include the make variables (CC, etc...) diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/Makefile linux-2.4.18-sparc64um/arch/um/Makefile --- linux-2.4.18-origum/arch/um/Makefile 2002-09-12 19:00:35.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/Makefile 2002-09-13 14:02:27.000000000 -0500 @@ -3,6 +3,7 @@ include arch/$(ARCH)/Makefile-$(SUBARCH) EXTRAVERSION := $(EXTRAVERSION)-22um +EXTRAVERSION := $(EXTRAVERSION)-sparc64-1 include/linux/version.h: arch/$(ARCH)/Makefile # Recalculate MODLIB to reflect the EXTRAVERSION changes (via KERNELRELEASE) @@ -60,12 +61,9 @@ LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc $(ARCH_DIR)/link.ld: $(ARCH_DIR)/link.ld.in - m4 -DSTART=$$(($(START_ADDR) - $(NESTING) * 0x10000000)) \ - -DSUBARCH=$(SUBARCH) -DELF_SUBARCH=$(ELF_SUBARCH) $< > $@ + m4 -DSTART=$$(($(START_ADDR) - $(NESTING) * 0x10000000)) -DSUBARCH=$(SUBARCH) -DELF_SUBARCH=$(ELF_SUBARCH) $< > $@ -SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h \ - include/asm-um/sigcontext.h include/asm-um/processor.h \ - include/asm-um/ptrace.h include/asm-um/arch-signal.h +SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h include/asm-um/sigcontext.h include/asm-um/processor.h include/asm-um/ptrace.h include/asm-um/checksum.h ARCH_SYMLINKS = include/asm-um/arch arch/um/include/sysdep $(SYMLINK_HEADERS) @@ -74,8 +72,8 @@ linux: $(ARCH_SYMLINKS) $(SYS_HEADERS) $(GEN_HEADERS) $(ARCH_DIR)/main.o \ vmlinux $(ARCH_DIR)/link.ld mv vmlinux vmlinux.o - $(CC) -Wl,-T,$(ARCH_DIR)/link.ld $(LINK_PROFILE) $(LINK_WRAPS) \ - -o linux -static $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib -lutil + $(CC) $(CFLAGS) $(ARCH_CFLAGS) -Wl,-T,$(ARCH_DIR)/link.ld $(LINK_PROFILE) $(LINK_WRAPS) \ + -o linux -static $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib/gcc-lib/sparc-linux/3.0.4/64 -L/usr/lib64 -lutil USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) USER_CFLAGS := $(patsubst -Derrno=kernel_errno,,$(USER_CFLAGS)) diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/Makefile-sparc64 linux-2.4.18-sparc64um/arch/um/Makefile-sparc64 --- linux-2.4.18-origum/arch/um/Makefile-sparc64 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/Makefile-sparc64 2002-09-15 12:54:36.000000000 -0500 @@ -0,0 +1,25 @@ +ifeq ($(CONFIG_HOST_2G_2G), y) +START_ADDR = 0x60000000 +else +START_ADDR = 0xa0000000 +endif + +LD := $(LD) -m elf64_sparc +AS := $(AS) -64 --undeclared-regs + +ARCH_CFLAGS = -U__$(SUBARCH)__ -U$(SUBARCH) -m64 -pipe \ + -mno-fpu -mcpu=ultrasparc -mcmodel=medlow -ffixed-g4 \ + -fcall-used-g5 -fcall-used-g7 -Wno-sign-compare \ + -Wa,--undeclared-regs + +ELF_SUBARCH = elf64-sparc + +SYS_HEADERS = $(ARCH_DIR)/include/sysdep-sparc64/sc.h + +$(ARCH_DIR)/include/sysdep-sparc64/sc.h : $(ARCH_DIR)/sys-sparc64/util/mk_sc + $(ARCH_DIR)/sys-sparc64/util/mk_sc > $@ + +$(ARCH_DIR)/sys-sparc64/util/mk_sc : $(ARCH_DIR)/sys-sparc64/util/mk_sc.c + $(MAKE) -C $(ARCH_DIR)/sys-sparc64/util all + +sysclean : diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/frame.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/frame.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/frame.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/frame.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2002 Jeff Dike (jd...@ka...) + * Licensed under the GPL + */ + +#ifndef __FRAME_SPARC64_H +#define __FRAME_SPARC64_H + +struct arch_frame_data_raw { + unsigned long sc_end; +}; + +struct arch_frame_data { + int fpstate_size; +}; + +#endif + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ + + + + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/frame_kern.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/frame_kern.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/frame_kern.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/frame_kern.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2002 Jeff Dike (jd...@ka...) + * Copyright (C) 2002 Shanti Katta (ka...@cs...) + * Licensed under the GPL + */ + +#ifndef __FRAME_KERN_SPARC64_H +#define __FRAME_KERN_SPARC64_H + +/* This is called from sys_sigreturn. It takes the sp at the point of the +* sigreturn system call and returns the address of the sigcontext struct +* on the stack. +*/ + +static inline void *sp_to_sc(unsigned long sp) +{ + return((void *) sp); +} + +static inline void *sp_to_rt_sc(unsigned long sp) +{ + unsigned long sc; + + sc = sp - signal_frame_si.sp_index + signal_frame_si.len - 4; + return((void *) sc); +} + +static inline void *sp_to_mask(unsigned long sp) +{ + unsigned long mask; + + mask = sp - signal_frame_sc.sp_index + signal_frame_sc.len - 8; + return((void *) mask); +} + +extern int sc_size(void *data); + +static inline void *sp_to_rt_mask(unsigned long sp) +{ + unsigned long mask; + + mask = sp - signal_frame_si.sp_index + signal_frame_si.len + sc_size(&signal_frame_sc.arch) - 4; + return((void *) mask); +} + +#endif diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/frame_user.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/frame_user.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/frame_user.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/frame_user.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2002 Jeff Dike (jd...@ka...) + * Copyright (C) 2002 Shanti Katta (ka...@cs...) + * Licensed under the GPL + */ + +#ifndef __FRAME_USER_I386_H +#define __FRAME_USER_I386_H + +#include <asm/page.h> +#include "sysdep/frame.h" + +/* This stuff is to calculate the size of the fp state struct at runtime +* because it has changed between 2.2 and 2.4 and it would be good for a +* UML compiled on one to work on the other. +* So, setup_arch_frame_raw fills in the arch struct with the raw data, which +* just contains the address of the end of the sigcontext. This is invoked +* from the signal handler. +* setup_arch_frame uses that data to figure out what +* arch_frame_data.fpstate_size should be. It really has no idea, since it's +* not allowed to do sizeof(struct fpstate) but it's safe to consider that it's + * everything from the end of the sigcontext up to the top of the stack. So, +* it masks off the page number to get the offset within the page and subtracts + * that from the page size, and that's how big the fpstate struct will be +* considered to be. +*/ + +static inline void setup_arch_frame_raw(struct arch_frame_data_raw *data, + struct sigcontext *sc) +{ + data->sc_end = (unsigned long) sc; + data->sc_end += sizeof(*sc); +} + +static inline void setup_arch_frame(struct arch_frame_data_raw *in, + struct arch_frame_data *out) +{ + unsigned long fpstate_start = in->sc_end; + + fpstate_start &= ~PAGE_MASK; + out->fpstate_size = PAGE_SIZE - fpstate_start; +} + +/* This figures out where on the stack the SA_RESTORER function address +* is stored. For i386, it's the signal handler return address, so it's +* located next to the frame pointer. +* This is inlined, so __builtin_frame_address(0) is correct. Otherwise, +* it would have to be __builtin_frame_address(1). +*/ + +static inline unsigned long frame_restorer(void) +{ + unsigned long *fp; + + fp = __builtin_frame_address(0); + return((unsigned long) (fp + 1)); +} + +/* Similarly, this returns the value of sp when the handler was first + * entered. This is used to calculate the proper sp when delivering + * signals. + */ + +static inline unsigned long frame_sp(void) +{ + unsigned long *fp; + + fp = __builtin_frame_address(0); + return((unsigned long) (fp + 1)); +} + +#endif diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/ptrace.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/ptrace.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/ptrace.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/ptrace.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,206 @@ + +#ifndef __SYSDEP_SPARC64_PTRACE_H +#define __SYSDEP_SPARC64_PTRACE_H + +/* Note that only the first 16 are the realu_regs. 17-19 are hacks */ +/* to let us access things like the program counter. The defines below + set indexes up for us. +*/ + +#include "sysdep/sc.h" + +#define UM_MAX_REG (19) + +#define UREG_TSTATE 17 +#define UREG_TPC 18 +#define UREG_TNPC 19 + +struct uml_pt_regs { + unsigned long args[6]; + long syscall; + int is_user; + void *sc; +}; + +#define EMPTY_UML_PT_REGS { \ + syscall : -1, \ + args : { [0 ... 5] = 0 }, \ + is_user : 0, \ + sc : NULL } + +struct sys_pt_regs { + unsigned long u_regs[UM_MAX_REG]; + unsigned int y; + unsigned int fprs; +}; + +/*#define EMPTY_REGS { { [ 0 ... UM_MAX_REG - 1 ] = 0 } }*/ + +#define UM_REG(r, n) ((r)->regs[n]) + +/* These next two will prolly need to be fixed, but it will help compile */ +/* And since the ptrace stuff still needs to be fixed, all these could be + wrong. +*/ + +#define UPT_U_REGS[x](regs) SC_U_REGS[x]((regs)->sc) +/*#define UPT_U_REGS[1](regs) SC_U_REGS[1]((regs)->sc) +#define UPT_U_REGS[2](regs) SC_U_REGS[2]((regs)->sc) +#define UPT_U_REGS[3](regs) SC_U_REGS[3]((regs)->sc) +#define UPT_U_REGS[4](regs) SC_U_REGS[4]((regs)->sc) +#define UPT_U_REGS[5](regs) SC_U_REGS[5]((regs)->sc) +#define UPT_U_REGS[6](regs) SC_U_REGS[6]((regs)->sc) +#define UPT_U_REGS[7](regs) SC_U_REGS[7]((regs)->sc) +#define UPT_U_REGS[8](regs) SC_U_REGS[8]((regs)->sc) +#define UPT_U_REGS[9](regs) SC_U_REGS[9]((regs)->sc) +#define UPT_U_REGS[10](regs) SC_U_REGS[10]((regs)->sc) +#define UPT_U_REGS[11](regs) SC_U_REGS[11]((regs)->sc) +#define UPT_U_REGS[12](regs) SC_U_REGS[12]((regs)->sc) +#define UPT_U_REGS[13](regs) SC_U_REGS[13]((regs)->sc) +#define UPT_U_REGS[14](regs) SC_U_REGS[14]((regs)->sc) +#define UPT_U_REGS[15](regs) SC_U_REGS[15]((regs)->sc)*/ +#define UPT_TSTATE(regs) SC_TSTATE((regs)->sc) +#define UPT_FP(regs) SC_FP((regs)->sc) +#define UPT_RETPC(regs) SC_RETPC((regs)->sc) + +#define UPT_TPC(regs) SC_TPC((regs)->sc) +#define UPT_TNPC(regs) SC_TNPC((regs)->sc) + +#define UPT_IP(regs) SC_IP((regs)->sc) +#define UPT_SP(regs) SC_SP((regs)->sc) + +#define UPT_SC(regs) ((regs)->sc) + +#define UPT_REG(regs, reg) \ +({ unsigned long val; \ + switch(reg){ \ + case UREG_G0: val = UPT_U_REGS[0](regs); break; \ + case UREG_G1: val = UPT_U_REGS[1](regs); break; \ + case UREG_G2: val = UPT_U_REGS[2](regs); break; \ + case UREG_G3: val = UPT_U_REGS[3](regs); break; \ + case UREG_G4: val = UPT_U_REGS[4](regs); break; \ + case UREG_G5: val = UPT_U_REGS[5](regs); break; \ + case UREG_G6: val = UPT_U_REGS[6](regs); break; \ + case UREG_G7: val = UPT_U_REGS[7](regs); break; \ + case UREG_I0: val = UPT_U_REGS[8](regs); break; \ + case UREG_I1: val = UPT_U_REGS[9](regs); break; \ + case UREG_I2: val = UPT_U_REGS[10](regs); break; \ + case UREG_I3: val = UPT_U_REGS[11](regs); break; \ + case UREG_I4: val = UPT_U_REGS[12](regs); break; \ + case UREG_I5: val = UPT_U_REGS[13](regs); break; \ + case UREG_I6: val = UPT_U_REGS[14](regs); break; \ + case UREG_I7: val = UPT_U_REGS[15](regs); break; \ + case UREG_TPC: val = UPT_IP(regs); break; \ + case UREG_TSTATE: val = UPT_SP(regs); break; \ + case UREG_TNPC: val = UPT_TNPC(regs); break; \ + case UREG_FP: val = UPT_FP(regs); break; \ + case UREG_RETPC: val = UPT_RETPC(regs); break; \ + default: \ + panic("Bad register in UPT_REG : %d\n", reg); \ + val = -1; \ + }\ + val; \ +}) + +#define UPT_SET(regs, reg, val) \ + do { \ + switch(reg){ \ + case UREG_G0: UPT_U_REGS[0](reg) = val; break; \ + case UREG_G1: UPT_U_REGS[1](reg) = val; break; \ + case UREG_G2: UPT_U_REGS[2](reg) = val; break; \ + case UREG_G3: UPT_U_REGS[3](reg) = val; break; \ + case UREG_G4: UPT_U_REGS[4](reg) = val; break; \ + case UREG_G5: UPT_U_REGS[5](reg) = val; break; \ + case UREG_G6: UPT_U_REGS[6](reg) = val; break; \ + case UREG_G7: UPT_U_REGS[7](reg) = val; break; \ + case UREG_I0: UPT_U_REGS[8](reg) = val; break; \ + case UREG_I1: UPT_U_REGS[9](reg) = val; break; \ + case UREG_I2: UPT_U_REGS[10](reg) = val; break; \ + case UREG_I3: UPT_U_REGS[11](reg) = val; break; \ + case UREG_I4: UPT_U_REGS[12](reg) = val; break; \ + case UREG_I5: UPT_U_REGS[13](reg) = val; break; \ + case UREG_I6: UPT_U_REGS[14](reg) = val; break; \ + case UREG_I7: UPT_U_REGS[15](reg) = val; break; \ + case UREG_TPC: UPT_IP(reg) = val; break; \ + case UREG_TSTATE: UPT_SP(reg) = val; break; \ + case UREG_TNPC: UPT_TNPC(reg) = val; break; \ + case UREG_FP: UPT_FP(reg) = val; break; \ + case UREG_RETPC: UPT_RETPC(reg) = val; break; \ + default: \ + panic("Bad register in UPT_SET : %d\n", reg); \ + break; \ + } \ +} while (0) + +#define UPT_SET_SYSCALL_RETURN(regs, res) \ + SC_SET_SYSCALL_RETURN((regs)->sc, (res)) +#define UPT_RESTART_SYSCALL(regs) SC_RESTART_SYSCALL((regs)->sc) +#define UPT_ORIG_SYSCALL(regs) UPT_FP(regs) +#define UPT_SYSCALL_NR(regs) ((regs)->syscall) +#define UPT_SYSCALL_RET(regs) UPT_RETPC(regs) + +#define UM_IP(r) UM_REG(r, UREG_TPC) +#define UM_IP_OFFSET (UREG_TPC * sizeof(long)) + +#define UM_SYSCALL_NR(r) UM_REG(r, UREG_IO) +#define UM_SYSCALL_RR_OFFSET (UREG_IO * sizeof(long)) + +#define UM_SYSCALL_SP(r) UM_REG(r, UREG_TSTATE) +#define UM_SYSCALL_SP_OFFSET(r) (UREG_TSTATE * sizeof(long)) + +/* This certainly is broken. No clue (yet) what this should be */ + +#define UM_ELF_ZERO UMREG(r, 0) +#define UM_ELF_ZERO_OFFSET (0, * sizeof(long)) + +/* OK, now on i386 this is null, on PPC the stack needs moving to a 16 + byte boundary. I'll bet on SPARC64 it will want it on a 64 byte boundary. + More code to write for when the ptrace stuff gets fixed. +*/ + +#define UM_FIX_EXEC_STACK(sp) do ; while(0) + +/* This is also broken... */ + +#define UM_SYSCALL_RET(r) UM_REG(r, UREG_I7) +#define UM_SYSCALL_RET_OFFSET (UREG_I7 * sizeof(long)) + +/* This is likely broken.... */ + +#define UM_SET_SYSCALL_RETURN(r, result) UM_REG(r, UREG_I7) = (result) + +/* The args to ptrace. Again, this might well be seriously wrong */ + +#define UM_SYSCALL_ARG1(r) UM_REG(r, UREG_I0) +#define UM_SYSCALL_ARG2(r) UM_REG(r, UREG_I1) +#define UM_SYSCALL_ARG3(r) UM_REG(r, UREG_I2) +#define UM_SYSCALL_ARG4(r) UM_REG(r, UREG_I3) +#define UM_SYSCALL_ARG5(r) UM_REG(r, UREG_I4) +#define UM_SYSCALL_ARG6(r) UM_REG(0) /* This is prolly wrong */ + +#define UM_SYSCALL_ARG1_OFFSET (UREG_IO * sizeof(long)) +#define UM_SYSCALL_ARG2_OFFSET (UREG_I1 * sizeof(long)) +#define UM_SYSCALL_ARG3_OFFSET (UREG_I2 * sizeof(long)) +#define UM_SYSCALL_ARG4_OFFSET (UREG_I3 * sizeof(long)) +#define UM_SYSCALL_ARG5_OFFSET (UREG_I4 * sizeof(long)) +#define UM_SYSCALL_ARG6_OFFSET (UREG_I5 * sizeof(long)) + +#endif + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ + + + + + + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/ptrace_user.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/ptrace_user.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/ptrace_user.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/ptrace_user.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2002 Jeff Dike (jd...@ka...) + * Copyright (C) 2002 Shanti Katta (ka...@cs...) + * Licensed under the GPL + */ + +#ifndef __SYSDEP_SPARC64_PTRACE_USER_H__ +#define __SYSDEP_SPARC64_PTRACE_USER_H__ + +#include <asm/ptrace.h> + +#define PT_OFFSET(r) ((r) * sizeof(long)) + +#define PT_SYSCALL_NR(regs) ((regs)[UREG_FP]) +#define PT_SYSCALL_NR_OFFSET PT_OFFSET(UREG_FP) + +#define PT_SYSCALL_ARG1_OFFSET PT_OFFSET(UREG_I0) +#define PT_SYSCALL_ARG2_OFFSET PT_OFFSET(UREG_I1) +#define PT_SYSCALL_ARG3_OFFSET PT_OFFSET(UREG_I2) +#define PT_SYSCALL_ARG4_OFFSET PT_OFFSET(UREG_I3) +#define PT_SYSCALL_ARG5_OFFSET PT_OFFSET(UREG_I4) + +#define PT_SYSCALL_RET_OFFSET PT_OFFSET(UREG_RETPC) + +#define PT_IP_OFFSET PT_OFFSET(UREG_TPC) +#define PT_IP(regs) ((regs)[UREG_TPC]) +#define PT_SP(regs) ((regs)[UREG_TSTATE]) + +#ifndef FRAME_SIZE +#define FRAME_SIZE (32) +#endif +#define FRAME_SIZE_OFFSET (22 * sizeof(unsigned long)) /* 22 stands for PTRACE_GETREGS in SPARC64 */ + +#define FP_FRAME_SIZE (32) /* Sparc64 defines 32 double-precision floating point registers */ + +#ifdef PTRACE_GETREGS +#define UM_HAVE_GETREGS +#endif + +#ifdef PTRACE_SETREGS +#define UM_HAVE_SETREGS +#endif + +#ifdef PTRACE_GETFPREGS +#define UM_HAVE_GETFPREGS +#endif + +#ifdef PTRACE_SETFPREGS +#define UM_HAVE_SETFPREGS +#endif + +#endif + + + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/sc.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/sc.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/sc.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/sc.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,10 @@ +#define SC_IP(sc) *((unsigned long *) &(((char *) (sc))[264])) +#define SC_SP(sc) *((unsigned long *) &(((char *) (sc))[256])) +#define SC_FP(sc) *((unsigned long *) &(((char *) (sc))[240])) +#define SC_UREG_I0(sc) *((unsigned long *) &(((char *) (sc))[192])) +#define SC_UREG_I1(sc) *((unsigned long *) &(((char *) (sc))[200])) +#define SC_UREG_I2(sc) *((unsigned long *) &(((char *) (sc))[208])) +#define SC_UREG_I3(sc) *((unsigned long *) &(((char *) (sc))[216])) +#define SC_UREG_I4(sc) *((unsigned long *) &(((char *) (sc))[224])) +#define SC_UREG_I5(sc) *((unsigned long *) &(((char *) (sc))[232])) +#define SC_RETPC(sc) *((unsigned long *) &(((char *) (sc))[248])) diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/sigcontext.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/sigcontext.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/sigcontext.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/sigcontext.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,47 @@ +/* + Copyright (C) 2002 Shanti Katta(ka...@cs...) + Copyright (C) 2001 Iain Young(ia...@g7...) + Copyright (C) 2000 Jeff Dike(jd...@ka...) + Licensed under the GPL +*/ + +/* Again, stolen from the IA64 placekeeper. then nicked bits from + the PPC and i386 ports +*/ + +#ifndef __SYS_SIGCONTEXT_SPARC64_H +#define __SYS_SIGCONTEXT_SPARC64_H + +/*#define UM_ALLOCATE_SC(name) struct sigcontext name*/ + +#define SC_RESTART_SYSCALL(sc) (SC_IP(sc) -= 2) +#define SC_SET_SYSCALL_RETURN(sc, result) do SC_FP(sc) = (result) ; while(0) + +#define SC_FAULT_ADDR(sc) SC_UREG_I1(sc) +#define SC_FAULT_WRITE(sc) (SC_UREG_I2(sc) & 2) + +#define SC_START_SYSCALL(sc) do ; while(0) + +/*#define SC_IP(sc) ((sc)->eip) +#define SC_SP(sc) ((sc)->esp_at_signal)*/ + +#define SEGV_IS_FIXABLE(sc) ((SC_UREG_I3(sc) == 13) || (SC_UREG_I3(sc) == 14)) + +static inline void sc_to_regs(struct uml_pt_regs *regs, struct sigcontext *sc, unsigned long syscall) +{ + regs->syscall = syscall; + regs->args[0] = SC_UREG_I0(sc); + regs->args[1] = SC_UREG_I1(sc); + regs->args[2] = SC_UREG_I2(sc); + regs->args[3] = SC_UREG_I3(sc); + regs->args[4] = SC_UREG_I4(sc); + regs->args[5] = SC_UREG_I5(sc); +} + +extern unsigned long *sc_sigmask(void *sc_ptr); +extern int sc_get_fpregs(unsigned long buf, void *sc_ptr); + +#endif + + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/sysdep-sparc64/syscalls.h linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/syscalls.h --- linux-2.4.18-origum/arch/um/include/sysdep-sparc64/syscalls.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/sysdep-sparc64/syscalls.h 2002-09-12 21:12:08.000000000 -0500 @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2000 Jeff Dike (jd...@ka...) + * Copyright (C) 2001 Iain Young (ia...@g7...) + * Copyright (C) 2002 Shanti Katta (ka...@cs...) + * Licensed under the GPL + */ + +/* Again, mostly nicked from Jeff's code, and ported to SPARC64 */ + +#ifndef __SYSDEP_SPARC64_SYSCALLS_H +#define __SYSDEP_SPARC64_SYSCALLS_H + +#include "asm/unistd.h" + +typedef long syscall_handler_t(struct pt_regs); + +#define EXECUTE_SYSCALL(syscall, regs) (*sys_call_table[syscall])(*regs) + +#define ARCH_SYSCALLS \ + [ __NR_exit ] = sys_exit, \ + [ __NR_fork ] = sys_fork, \ + [ __NR_read ] = sys_read, \ + [ __NR_write ] = sys_write, \ + [ __NR_open ] = sys_open, \ + [ __NR_close ] = sys_close, \ + [ __NR_wait4 ] = sys_wait4, \ + [ __NR_creat ] = sys_creat, \ + [ __NR_link ] = sys_link, \ + [ __NR_unlink ] = sys_unlink, \ + [ __NR_chdir ] = sys_chdir, \ + [ __NR_chown ] = sys_chown, \ + [ __NR_mknod ] = sys_mknod, \ + [ __NR_chmod ] = sys_chmod, \ + [ __NR_lchown ] = sys_lchown, \ + [ __NR_lseek ] = sys_lseek, \ + [ __NR_getpid ] = sys_getpid, \ + [ __NR_capget ] = sys_capget, \ + [ __NR_capset ] = sys_capset, \ + [ __NR_getuid ] = sys_getuid, \ + [ __NR_ptrace ] = sys_ptrace, \ + [ __NR_alarm ] = sys_alarm, \ + [ __NR_sigaltstack ] = sys_sigaltstack, \ + [ __NR_pause ] = sys_pause, \ + [ __NR_utime ] = sys_utime, \ + [ __NR_access ] = sys_access, \ + [ __NR_nice ] = sys_nice, \ + [ __NR_sync ] = sys_sync, \ + [ __NR_kill ] = sys_kill, \ + [ __NR_sendfile ] = sys_sendfile, \ + [ __NR_dup ] = sys_dup, \ + [ __NR_pipe ] = sys_pipe, \ + [ __NR_times ] = sys_times, \ + [ __NR_setgid ] = sys_setgid, \ + [ __NR_getgid ] = sys_getgid, \ + [ __NR_signal ] = sys_signal, \ + [ __NR_geteuid ] = sys_geteuid, \ + [ __NR_acct ] = sys_acct, \ + [ __NR_ioctl ] = sys_ioctl, \ + [ __NR_reboot ] = sys_reboot, \ + [ __NR_symlink ] = sys_symlink, \ + [ __NR_readlink ] = sys_readlink, \ + [ __NR_execve ] = sys_execve, \ + [ __NR_umask ] = sys_umask, \ + [ __NR_chroot ] = sys_chroot, \ + [ __NR_msync ] = sys_msync, \ + [ __NR_vfork ] = sys_vfork, \ + [ __NR_pread ] = sys_pread, \ + [ __NR_pwrite ] = sys_pwrite, \ + [ __NR_munmap ] = sys_munmap, \ + [ __NR_mprotect ] = sys_mprotect, \ + [ __NR_madvise ] = sys_madvise, \ + [ __NR_vhangup ] = sys_vhangup, \ + [ __NR_mincore ] = sys_mincore, \ + [ __NR_getgroups ] = sys_getgroups, \ + [ __NR_setgroups ] = sys_setgroups, \ + [ __NR_getpgrp ] = sys_getpgrp, \ + [ __NR_setitimer ] = sys_setitimer, \ + [ __NR_swapon ] = sys_swapon, \ + [ __NR_getitimer ] = sys_getitimer, \ + [ __NR_sethostname ] = sys_sethostname, \ + [ __NR_dup2 ] = sys_dup2, \ + [ __NR_fcntl ] = sys_fcntl, \ + [ __NR_select ] = sys_select, \ + [ __NR_fsync ] = sys_fsync, \ + [ __NR_setpriority ] = sys_setpriority, \ + [ __NR_getpriority ] = sys_getpriority, \ + [ __NR_rt_sigreturn ] = sys_rt_sigreturn, \ + [ __NR_rt_sigprocmask ] = sys_rt_sigprocmask, \ + [ __NR_rt_sigpending ] = sys_rt_sigpending, \ + [ __NR_rt_sigtimedwait ] = sys_rt_sigtimedwait, \ + [ __NR_rt_sigqueueinfo ] = sys_rt_sigqueueinfo, \ + [ __NR_rt_sigsuspend ] = sys_rt_sigsuspend, \ + [ __NR_setresuid ] = sys_setresuid, \ + [ __NR_getresuid ] = sys_getresuid, \ + [ __NR_setresgid ] = sys_setresgid, \ + [ __NR_getresgid ] = sys_getresgid, \ + [ __NR_gettimeofday ] = sys_gettimeofday, \ + [ __NR_getrusage ] = sys_getrusage, \ + [ __NR_getcwd ] = sys_getcwd, \ + [ __NR_readv ] = sys_readv, \ + [ __NR_writev ] = sys_writev, \ + [ __NR_settimeofday ] = sys_settimeofday, \ + [ __NR_fchown ] = sys_fchown, \ + [ __NR_fchmod ] = sys_fchmod, \ + [ __NR_setreuid ] = sys_setreuid, \ + [ __NR_setregid ] = sys_setregid, \ + [ __NR_rename ] = sys_rename, \ + [ __NR_truncate ] = sys_truncate, \ + [ __NR_ftruncate ] = sys_ftruncate, \ + [ __NR_flock ] = sys_flock, \ + [ __NR_mkdir ] = sys_mkdir, \ + [ __NR_rmdir ] = sys_rmdir, \ + [ __NR_gettid ] = sys_gettid, \ + [ __NR_getrlimit ] = sys_getrlimit, \ + [ __NR_setrlimit ] = sys_setrlimit, \ + [ __NR_pivot_root ] = sys_pivot_root, \ + [ __NR_prctl ] = sys_prctl, \ + [ __NR_poll ] = sys_poll, \ + [ __NR_getdents64 ] = sys_getdents64, \ + [ __NR_statfs ] = sys_statfs, \ + [ __NR_fstatfs ] = sys_fstatfs, \ + [ __NR_umount ] = sys_umount, \ + [ __NR_setdomainname ] = sys_setdomainname, \ + [ __NR_quotactl ] = sys_quotactl, \ + [ __NR_mount ] = sys_mount, \ + [ __NR_ustat ] = sys_ustat, \ + [ __NR_getdents ] = sys_getdents, \ + [ __NR_setsid ] = sys_setsid, \ + [ __NR_fchdir ] = sys_fchdir, \ + [ __NR_sigpending ] = sys_sigpending, \ + [ __NR_query_module ] = sys_query_module, \ + [ __NR_setpgid ] = sys_setpgid, \ + [ __NR_uname ] = sys_uname, \ + [ __NR_init_module ] = sys_init_module, \ + [ __NR_personality ] = sys_personality, \ + [ __NR_getppid ] = sys_getppid, \ + [ __NR_sigaction ] = sys_sigaction, \ + [ __NR_sgetmask ] = sys_sgetmask, \ + [ __NR_ssetmask ] = sys_ssetmask, \ + [ __NR_sigsuspend ] = sys_sigsuspend, \ + [ __NR_uselib ] = sys_uselib, \ + [ __NR_readahead ] = sys_readahead, \ + [ __NR_socketcall ] = sys_socketcall, \ + [ __NR_syslog ] = sys_syslog, \ + [ __NR_waitpid ] = sys_waitpid, \ + [ __NR_swapoff ] = sys_swapoff, \ + [ __NR_sysinfo ] = sys_sysinfo, \ + [ __NR_ipc ] = sys_ipc, \ + [ __NR_sigreturn ] = sys_sigreturn, \ + [ __NR_clone ] = sys_clone, \ + [ __NR_adjtimex ] = sys_adjtimex, \ + [ __NR_sigprocmask ] = sys_sigprocmask, \ + [ __NR_create_module ] = sys_create_module, \ + [ __NR_delete_module ] = sys_delete_module, \ + [ __NR_get_kernel_syms ] = sys_get_kernel_syms, \ + [ __NR_getpgid ] = sys_getpgid, \ + [ __NR_bdflush ] = sys_bdflush, \ + [ __NR_sysfs ] = sys_sysfs, \ + [ __NR_setfsuid ] = sys_setfsuid, \ + [ __NR_setfsgid ] = sys_setfsgid, \ + [ __NR__llseek ] = sys_llseek, \ + [ __NR_mlock ] = sys_mlock, \ + [ __NR_munlock ] = sys_munlock, \ + [ __NR_mlockall ] = sys_mlockall, \ + [ __NR_munlockall ] = sys_munlockall, \ + [ __NR_sched_setparam ] = sys_sched_setparam, \ + [ __NR_sched_getparam ] = sys_sched_getparam, \ + [ __NR_sched_setscheduler ] = sys_sched_setscheduler, \ + [ __NR_sched_getscheduler ] = sys_sched_getscheduler, \ + [ __NR_sched_yield ] = sys_sched_yield, \ + [ __NR_sched_get_priority_max ] = sys_sched_get_priority_max, \ + [ __NR_sched_get_priority_min ] = sys_sched_get_priority_min, \ + [ __NR_sched_rr_get_interval ] = sys_sched_rr_get_interval, \ + [ __NR_nanosleep ] = sys_nanosleep, \ + [ __NR_mremap ] = sys_mremap, \ + [ __NR__sysctl ] = sys_sysctl, \ + [ __NR_getsid ] = sys_getsid, \ + [ __NR_fdatasync ] = sys_fdatasync, \ + [ __NR_nfsservctl ] = sys_nfsservctl, \ + [ 222 ] = sys_ni_syscall, + +/*#define LAST_ARCH_SYSCALL __NR__exit*/ + +#define LAST_ARCH_SYSCALL 222 + +#endif + + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ + + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/include/task.h linux-2.4.18-sparc64um/arch/um/include/task.h --- linux-2.4.18-origum/arch/um/include/task.h 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/include/task.h 2002-09-13 20:02:57.000000000 -0500 @@ -0,0 +1,11 @@ +/* + * Generated by mk_task + */ + +#ifndef __TASK_H +#define __TASK_H + +#define TASK_REGS(task) ((struct uml_pt_regs *) &(((char *) (task))[1016])) +#define TASK_PID(task) *((int *) &(((char *) (task))[228])) + +#endif diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/Makefile linux-2.4.18-sparc64um/arch/um/kernel/Makefile --- linux-2.4.18-origum/arch/um/kernel/Makefile 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/Makefile 2002-09-12 22:03:09.000000000 -0500 @@ -57,7 +57,7 @@ $(CC) $(CFLAGS_$@) -c -o $@ $< unmap_fin.o : unmap.o - ld -r -o $@ $< -lc -L/usr/lib + ld -m elf64_sparc --multilib-dir 64 -r -o $@ $< -lc -L/usr/lib64 QUOTE = 'my $$config=`cat $(TOPDIR)/.config`; $$config =~ s/"/\\"/g ; while(<STDIN>) { $$_ =~ s/CONFIG/$$config/; print $$_ }' diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/exec_kern.c linux-2.4.18-sparc64um/arch/um/kernel/exec_kern.c --- linux-2.4.18-origum/arch/um/kernel/exec_kern.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/exec_kern.c 2002-09-12 21:46:47.000000000 -0500 @@ -17,6 +17,7 @@ #include "tlb.h" #include "2_5compat.h" + /* See comment above fork_tramp for why sigstop is defined and used like * this */ diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/frame_kern.c linux-2.4.18-sparc64um/arch/um/kernel/frame_kern.c --- linux-2.4.18-origum/arch/um/kernel/frame_kern.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/frame_kern.c 2002-09-12 21:48:21.000000000 -0500 @@ -87,8 +87,8 @@ signal_frame_si.sr_relative)) return(1); - PT_REGS_IP(regs) = handler; - PT_REGS_SP(regs) = start + signal_frame_sc.sp_index; + /*PT_REGS_IP(regs) = handler; + PT_REGS_SP(regs) = start + signal_frame_sc.sp_index;*/ return(0); } diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/irq.c linux-2.4.18-sparc64um/arch/um/kernel/irq.c --- linux-2.4.18-origum/arch/um/kernel/irq.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/irq.c 2002-09-12 21:51:58.000000000 -0500 @@ -181,6 +181,8 @@ * This function may be called from IRQ context. */ +#undef disable_irq_nosync + void inline disable_irq_nosync(unsigned int irq) { irq_desc_t *desc = irq_desc + irq; diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/signal_kern.c linux-2.4.18-sparc64um/arch/um/kernel/signal_kern.c --- linux-2.4.18-origum/arch/um/kernel/signal_kern.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/signal_kern.c 2002-09-12 22:02:19.000000000 -0500 @@ -98,14 +98,14 @@ if (ka->sa.sa_flags & SA_ONESHOT) ka->sa.sa_handler = SIG_DFL; - if (!(ka->sa.sa_flags & SA_NODEFER)) { + /*if (!(ka->sa.sa_flags & SA_NODEFER)) { spin_lock_irq(¤t->sigmask_lock); sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); sigaddset(¤t->blocked, signr); recalc_sigpending(current); spin_unlock_irq(¤t->sigmask_lock); - } + }*/ sp = PT_REGS_SP(regs); @@ -116,8 +116,8 @@ sp -= 4 * sizeof(void *); - if (ka->sa.sa_flags & SA_RESTORER) restorer = ka->sa.sa_restorer; - else restorer = NULL; + /*if (ka->sa.sa_flags & SA_RESTORER) restorer = ka->sa.sa_restorer; + else restorer = NULL;*/ if(ka->sa.sa_flags & SA_SIGINFO) err = setup_signal_stack_si(sp, signr, (unsigned long) handler, diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/sys_call_table.c linux-2.4.18-sparc64um/arch/um/kernel/sys_call_table.c --- linux-2.4.18-origum/arch/um/kernel/sys_call_table.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/sys_call_table.c 2002-09-12 21:59:19.000000000 -0500 @@ -84,7 +84,7 @@ extern syscall_handler_t sys_getgroups16; extern syscall_handler_t sys_setgroups16; extern syscall_handler_t sys_symlink; -extern syscall_handler_t sys_lstat; +/*extern syscall_handler_t sys_lstat;*/ extern syscall_handler_t sys_readlink; extern syscall_handler_t sys_uselib; extern syscall_handler_t sys_swapon; @@ -174,7 +174,7 @@ extern syscall_handler_t sys_getresgid16; extern syscall_handler_t sys_prctl; extern syscall_handler_t sys_ni_syscall; -extern syscall_handler_t sys_rt_sigaction; +/*extern syscall_handler_t sys_rt_sigaction;*/ extern syscall_handler_t sys_rt_sigprocmask; extern syscall_handler_t sys_rt_sigpending; extern syscall_handler_t sys_rt_sigtimedwait; @@ -259,8 +259,8 @@ [ __NR_mknod ] = sys_mknod, [ __NR_chmod ] = sys_chmod, [ __NR_lchown ] = sys_lchown16, - [ __NR_break ] = sys_ni_syscall, - [ __NR_oldstat ] = sys_stat, + /*[ __NR_break ] = sys_ni_syscall,*/ + /*[ __NR_oldstat ] = sys_stat,*/ [ __NR_lseek ] = sys_lseek, [ __NR_getpid ] = sys_getpid, [ __NR_mount ] = um_mount, @@ -270,14 +270,14 @@ [ __NR_stime ] = um_stime, [ __NR_ptrace ] = sys_ptrace, [ __NR_alarm ] = sys_alarm, - [ __NR_oldfstat ] = sys_fstat, + /*[ __NR_oldfstat ] = sys_fstat,*/ [ __NR_pause ] = sys_pause, [ __NR_utime ] = sys_utime, - [ __NR_stty ] = sys_ni_syscall, - [ __NR_gtty ] = sys_ni_syscall, + /*[ __NR_stty ] = sys_ni_syscall, + [ __NR_gtty ] = sys_ni_syscall,*/ [ __NR_access ] = sys_access, [ __NR_nice ] = sys_nice, - [ __NR_ftime ] = sys_ni_syscall, + /*[ __NR_ftime ] = sys_ni_syscall,*/ [ __NR_sync ] = sys_sync, [ __NR_kill ] = sys_kill, [ __NR_rename ] = sys_rename, @@ -288,7 +288,7 @@ [ __NR_dup ] = (syscall_handler_t *) sys_dup, [ __NR_pipe ] = sys_pipe, [ __NR_times ] = sys_times, - [ __NR_prof ] = sys_ni_syscall, + /*[ __NR_prof ] = sys_ni_syscall,*/ [ __NR_brk ] = sys_brk, [ __NR_setgid ] = sys_setgid16, [ __NR_getgid ] = sys_getgid16, @@ -297,13 +297,13 @@ [ __NR_getegid ] = sys_getegid16, [ __NR_acct ] = sys_acct, [ __NR_umount2 ] = sys_umount, - [ __NR_lock ] = sys_ni_syscall, + /*[ __NR_lock ] = sys_ni_syscall,*/ [ __NR_ioctl ] = sys_ioctl, [ __NR_fcntl ] = sys_fcntl, - [ __NR_mpx ] = sys_ni_syscall, + /*[ __NR_mpx ] = sys_ni_syscall,*/ [ __NR_setpgid ] = sys_setpgid, - [ __NR_ulimit ] = sys_ni_syscall, - [ __NR_oldolduname ] = sys_olduname, + /*[ __NR_ulimit ] = sys_ni_syscall, + [ __NR_oldolduname ] = sys_olduname,*/ [ __NR_umask ] = sys_umask, [ __NR_chroot ] = sys_chroot, [ __NR_ustat ] = sys_ustat, @@ -327,7 +327,7 @@ [ __NR_getgroups ] = sys_getgroups16, [ __NR_setgroups ] = sys_setgroups16, [ __NR_symlink ] = sys_symlink, - [ __NR_oldlstat ] = sys_lstat, + /*[ __NR_oldlstat ] = sys_lstat,*/ [ __NR_readlink ] = sys_readlink, [ __NR_uselib ] = sys_uselib, [ __NR_swapon ] = sys_swapon, @@ -340,10 +340,10 @@ [ __NR_fchown ] = sys_fchown16, [ __NR_getpriority ] = sys_getpriority, [ __NR_setpriority ] = sys_setpriority, - [ __NR_profil ] = sys_ni_syscall, + /*[ __NR_profil ] = sys_ni_syscall,*/ [ __NR_statfs ] = sys_statfs, [ __NR_fstatfs ] = sys_fstatfs, - [ __NR_ioperm ] = sys_ni_syscall, + /*[ __NR_ioperm ] = sys_ni_syscall,*/ [ __NR_socketcall ] = sys_socketcall, [ __NR_syslog ] = sys_syslog, [ __NR_setitimer ] = sys_setitimer, @@ -351,10 +351,10 @@ [ __NR_stat ] = sys_newstat, [ __NR_lstat ] = sys_newlstat, [ __NR_fstat ] = sys_newfstat, - [ __NR_olduname ] = sys_uname, - [ __NR_iopl ] = sys_ni_syscall, + /*[ __NR_olduname ] = sys_uname, + [ __NR_iopl ] = sys_ni_syscall,*/ [ __NR_vhangup ] = sys_vhangup, - [ __NR_idle ] = sys_ni_syscall, + /*[ __NR_idle ] = sys_ni_syscall,*/ [ __NR_wait4 ] = (syscall_handler_t *) sys_wait4, [ __NR_swapoff ] = sys_swapoff, [ __NR_sysinfo ] = sys_sysinfo, @@ -406,7 +406,7 @@ [ __NR_mremap ] = sys_mremap, [ __NR_setresuid ] = sys_setresuid16, [ __NR_getresuid ] = sys_getresuid16, - [ __NR_vm86 ] = sys_ni_syscall, + /*[ __NR_vm86 ] = sys_ni_syscall,*/ [ __NR_query_module ] = sys_query_module, [ __NR_poll ] = sys_poll, [ __NR_nfsservctl ] = sys_nfsservctl, @@ -414,7 +414,7 @@ [ __NR_getresgid ] = sys_getresgid16, [ __NR_prctl ] = sys_prctl, [ __NR_rt_sigreturn ] = sys_rt_sigreturn, - [ __NR_rt_sigaction ] = sys_rt_sigaction, + /*[ __NR_rt_sigaction ] = sys_rt_sigaction,*/ [ __NR_rt_sigprocmask ] = sys_rt_sigprocmask, [ __NR_rt_sigpending ] = sys_rt_sigpending, [ __NR_rt_sigtimedwait ] = sys_rt_sigtimedwait, @@ -428,22 +428,22 @@ [ __NR_capset ] = sys_capset, [ __NR_sigaltstack ] = sys_sigaltstack, [ __NR_sendfile ] = sys_sendfile, - [ __NR_getpmsg ] = sys_ni_syscall, - [ __NR_putpmsg ] = sys_ni_syscall, + /*[ __NR_getpmsg ] = sys_ni_syscall, + [ __NR_putpmsg ] = sys_ni_syscall,*/ [ __NR_vfork ] = sys_vfork, - [ __NR_ugetrlimit ] = sys_getrlimit, + /*[ __NR_ugetrlimit ] = sys_getrlimit, [ __NR_mmap2 ] = sys_mmap2, [ __NR_truncate64 ] = sys_truncate64, [ __NR_ftruncate64 ] = sys_ftruncate64, [ __NR_stat64 ] = sys_stat64, [ __NR_lstat64 ] = sys_lstat64, [ __NR_fstat64 ] = sys_fstat64, - [ __NR_fcntl64 ] = sys_fcntl64, + [ __NR_fcntl64 ] = sys_fcntl64,*/ [ __NR_getdents64 ] = sys_getdents64, - [ __NR_security ] = sys_ni_syscall, + /*[ __NR_security ] = sys_ni_syscall,*/ [ __NR_gettid ] = sys_gettid, [ __NR_readahead ] = sys_readahead, - [ __NR_setxattr ] = sys_ni_syscall, + /*[ __NR_setxattr ] = sys_ni_syscall, [ __NR_lsetxattr ] = sys_ni_syscall, [ __NR_fsetxattr ] = sys_ni_syscall, [ __NR_getxattr ] = sys_ni_syscall, @@ -454,7 +454,7 @@ [ __NR_flistxattr ] = sys_ni_syscall, [ __NR_removexattr ] = sys_ni_syscall, [ __NR_lremovexattr ] = sys_ni_syscall, - [ __NR_fremovexattr ] = sys_ni_syscall, + [ __NR_fremovexattr ] = sys_ni_syscall,*/ ARCH_SYSCALLS [ LAST_SYSCALL + 1 ... NR_syscalls ] = diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/syscall_kern.c linux-2.4.18-sparc64um/arch/um/kernel/syscall_kern.c --- linux-2.4.18-origum/arch/um/kernel/syscall_kern.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/syscall_kern.c 2002-09-12 21:55:29.000000000 -0500 @@ -321,11 +321,11 @@ sizeof(struct utimbuf))); } -static int check_oldstat(struct pt_regs *regs) +/*static int check_oldstat(struct pt_regs *regs) { return(check_area((void *) regs->regs.args[2], sizeof(struct __old_kernel_stat))); -} +}*/ static int check_stat(struct pt_regs *regs) { @@ -369,12 +369,12 @@ [ __NR_chown ] = { 1, NULL }, [ __NR_lchown ] = { 1, NULL }, [ __NR_utime ] = { 1, check_utime }, - [ __NR_oldlstat ] = { 1, check_oldstat }, - [ __NR_oldstat ] = { 1, check_oldstat }, + /*[ __NR_oldlstat ] = { 1, check_oldstat },*/ + /*[ __NR_oldstat ] = { 1, check_oldstat },*/ [ __NR_stat ] = { 1, check_stat }, - [ __NR_lstat ] = { 1, check_stat }, - [ __NR_stat64 ] = { 1, check_stat64 }, - [ __NR_lstat64 ] = { 1, check_stat64 }, + [ __NR_lstat ] = { 1, check_stat } + /*[ __NR_stat64 ] = { 1, check_stat64 },*/ + /*[ __NR_lstat64 ] = { 1, check_stat64 }*/ }; /* sys_utimes */ diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/kernel/time_kern.c linux-2.4.18-sparc64um/arch/um/kernel/time_kern.c --- linux-2.4.18-origum/arch/um/kernel/time_kern.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/kernel/time_kern.c 2002-09-12 22:00:12.000000000 -0500 @@ -15,6 +15,7 @@ #include "asm/current.h" #include "kern_util.h" #include "user_util.h" +#include "asm/irq.h" extern rwlock_t xtime_lock; @@ -85,19 +86,31 @@ void __delay(um_udelay_t time) { - /* Stolen from the i386 __loop_delay */ - int d0; + /* Stolen from the i386 __loop_delay + int d0; __asm__ __volatile__( "\tjmp 1f\n" - ".align 16\n" + ".align 32\n" "1:\tjmp 2f\n" ".align 16\n" "2:\tdecl %0\n\tjns 2b" :"=&a" (d0) - :"0" (time)); + :"0" (time));*/ + + /* Stolen from sparc64 __delay */ + __asm__ __volatile__( + " b,pt %%xcc, 1f\n" + " cmp %0, 0\n" + " .align 32\n" + "1:\n" + " bne,pt %%xcc, 1b\n" + " subcc %0, 1, %0\n" + : "=&r" (time) + : "0" (time) + : "cc"); } -void __udelay(um_udelay_t usecs) +void __udelay(um_udelay_t usecs, um_udelay_t lps) { int i, n; diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/link.ld linux-2.4.18-sparc64um/arch/um/link.ld --- linux-2.4.18-origum/arch/um/link.ld 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/link.ld 2002-09-12 23:06:02.000000000 -0500 @@ -0,0 +1,133 @@ +OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc") +OUTPUT_ARCH(sparc:v9a) +ENTRY(_start) + +SECTIONS +{ + . = 2684354560 + SIZEOF_HEADERS; + + . = ALIGN(4096); + .thread_private : { + __start_thread_private = .; + errno = .; + . += 4; + arch/um/kernel/unmap_fin.o (.data) + __end_thread_private = .; + } + . = ALIGN(4096); + .remap : { arch/um/kernel/unmap_fin.o (.text) } + + . = ALIGN(4096); /* Init code and data */ + _stext = .; + __init_begin = .; + .text.init : { *(.text.init) } + . = ALIGN(4096); + .text : + { + *(.text) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + } + .kstrtab : { *(.kstrtab) } + + . = ALIGN(16); /* Exception table */ + __start___ex_table = .; + __ex_table : { *(__ex_table) } + __stop___ex_table = .; + + __start___ksymtab = .; /* Kernel symbol table */ + __ksymtab : { *(__ksymtab) } + __stop___ksymtab = .; + .fini : { *(.fini) } =0x9090 + .rodata : { *(.rodata) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + _etext = .; + PROVIDE (etext = .); + + . = ALIGN(4096); + PROVIDE (_sdata = .); + + .unprotected : { *(.unprotected) } + . = ALIGN(4096); + PROVIDE (_unprotected_end = .); + + . = ALIGN(4096); + __uml_setup_start = .; + .uml.setup.init : { *(.uml.setup.init) } + __uml_setup_end = .; + __uml_help_start = .; + .uml.help.init : { *(.uml.help.init) } + __uml_help_end = .; + __uml_postsetup_start = .; + .uml.postsetup.init : { *(.uml.postsetup.init) } + __uml_postsetup_end = .; + __setup_start = .; + .setup.init : { *(.setup.init) } + __setup_end = .; + __initcall_start = .; + .initcall.init : { *(.initcall.init) } + __initcall_end = .; + __uml_initcall_start = .; + .uml.initcall.init : { *(.uml.initcall.init) } + __uml_initcall_end = .; + __init_end = .; + __exitcall_begin = .; + .exitcall : { *(.exitcall.exit) } + __exitcall_end = .; + __uml_exitcall_begin = .; + .uml.exitcall : { *(.uml.exitcall.exit) } + __uml_exitcall_end = .; + + .data.init : { *(.data.init) } + .data : + { + . = ALIGN(16384); /* init_task */ + *(.data.init_task) + *(.data) + *(.gnu.linkonce.d*) + CONSTRUCTORS + } + .data1 : { *(.data1) } + .ctors : + { + *(.ctors) + } + .dtors : + { + *(.dtors) + } + + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : { *(.sdata) } + _edata = .; + PROVIDE (edata = .); + . = ALIGN(0x1000); + .sbss : + { + __bss_start = .; + PROVIDE(_bss_start = .); + *(.sbss) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(COMMON) + } + _end = . ; + PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } +} diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/link.ld.in linux-2.4.18-sparc64um/arch/um/link.ld.in --- linux-2.4.18-origum/arch/um/link.ld.in 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/link.ld.in 2002-09-12 22:06:42.000000000 -0500 @@ -1,5 +1,5 @@ -OUTPUT_FORMAT("elf32-ELF_SUBARCH") -OUTPUT_ARCH(ELF_SUBARCH) +OUTPUT_FORMAT("ELF_SUBARCH", "ELF_SUBARCH", "ELF_SUBARCH") +OUTPUT_ARCH(sparc:v9a) ENTRY(_start) SECTIONS diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/Makefile linux-2.4.18-sparc64um/arch/um/sys-sparc64/Makefile --- linux-2.4.18-origum/arch/um/sys-sparc64/Makefile 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/Makefile 2002-09-15 13:39:16.000000000 -0500 @@ -0,0 +1,54 @@ +OBJ = sys.o + +OBJS = ptrace.o ptrace_user.o semaphore.o sigcontext.o \ + atomic.o bitops.o strncmp.o memstuff.o misc.o + +ARCH_DIR := arch/um +ARCH_INCLUDE := $(TOPDIR)/$(ARCH_DIR)/include + +EXTRA_AFLAGS := -I$(ARCH_INCLUDE) + +USER_OBJS = ptrace_user.o sigcontext.o memstuff.o misc.o + +SYMLINKS = semaphore.c atomic.S bitops.S strncmp.S + +all: $(OBJ) + +$(OBJ): $(OBJS) + rm -f $@ + $(LD) $(LINKFLAGS) --start-group $^ --end-group -o $@ + +$(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< + +atomic.S bitops.S strncmp.S: + rm -f $@ + ln -s $(TOPDIR)/arch/sparc64/lib/$@ $@ + +AFLAGS += -m64 -mcpu=ultrasparc -Wa,--undeclared-regs + +semaphore.c: + rm -f $@ + ln -s $(TOPDIR)/arch/sparc64/kernel/$@ $@ + +.S.o: + $(CC) $(AFLAGS) $(EXTRA_AFLAGS) -ansi -c $< -o $*.o + +clean: + rm -f $(OBJS) + rm -f $(SYMLINKS) + +fastdep: + +archmrproper: + rm -f $(SYMLINKS) +archclean: + rm -f link.ld + @$(MAKEBOOT) clean + +archdep: + @$(MAKEBOOT) dep + +modules: + +include $(TOPDIR)/Rules.make diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/ksyms.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/ksyms.c --- linux-2.4.18-origum/arch/um/sys-sparc64/ksyms.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/ksyms.c 2002-09-15 12:22:42.000000000 -0500 @@ -0,0 +1,11 @@ +#include "linux/module.h" +#include "linux/in6.h" +#include "linux/rwsem.h" +#include "asm/byteorder.h" +#include "asm/semaphore.h" +#include "asm/uaccess.h" +#include "asm/checksum.h" +#include "asm/errno.h" + +/* Networking helper routines. */ +EXPORT_SYMBOL(csum_partial_copy_generic); diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/memstuff.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/memstuff.c --- linux-2.4.18-origum/arch/um/sys-sparc64/memstuff.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/memstuff.c 2002-09-12 21:01:34.000000000 -0500 @@ -0,0 +1,39 @@ +/* This is to get rid of "undefined references" to __memcpy, __memmove, __memset */ + +#include <string.h> + +extern int stop_a_enabled = 1; + +void *__memcpy(void *dst, const void *src, int num) +{ + /* calls the libc memcpy */ + return(memcpy(dst,src,num)); +} + +void *__memset(void *buf, int ch, size_t num) +{ + return(memset(buf,ch,num)); +} + +void *__memmove(void *dst, const void *src, int num) +{ + return(memmove(dst,src,num)); +} + +/* Some page stuff goes here */ + +void _clear_page(void *page) +{ + panic("_clear_page"); +} + +extern void clear_user_page(void *page, unsigned long vaddr) +{ + panic("clear_user_page"); +} + +extern void copy_user_page(void *to, void *from, unsigned long vaddr) +{ + panic("copy_user_page"); +} + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/misc.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/misc.c --- linux-2.4.18-origum/arch/um/sys-sparc64/misc.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/misc.c 2002-09-12 21:01:34.000000000 -0500 @@ -0,0 +1,65 @@ +/* This is to stub csum functions to help UML compile */ + +extern unsigned int csum_partial_copy_user_sparc64(const char *src, char *dst, int len, unsigned int sum) +{ + panic("csum_partial_copy_user_sparc64"); + return 0; +} + +extern unsigned int csum_partial_copy_sparc64(const char *src, char *dst, int len, unsigned int sum) +{ + panic("csum_partial_copy_sparc64"); + return 0; +} + +extern unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum) +{ + panic("csum_partial"); + return 0; +} + +/* Some more miscellaneous stuff here */ + +extern int sc_size(void *data) +{ + panic("sc_size"); + return 0; +} + +extern int copy_sc_to_user(void *to_ptr, void *from_ptr, void *date) +{ + panic("copy_sc_to_user"); + return 0; +} + +extern int copy_sc_from_user(void *to_ptr, void *from_ptr, void *data) +{ + panic("copy_sc_from_user"); + return 0; +} + +extern void sc_to_sc(void *to_ptr, void *from_ptr) +{ + panic("sc_to_sc"); +} + +extern unsigned long *sc_sigmask(void *sc_ptr) +{ + panic("sc_sigmask"); + return 0; +} + +extern int arch_handle_signal(int sig, struct uml_pt_regs *regs) +{ + panic("arch_handle_signal"); + return 0; +} + +extern void arch_check_bugs(void) +{ + panic("arch_check_bugs"); +} + + + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/ptrace.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/ptrace.c --- linux-2.4.18-origum/arch/um/sys-sparc64/ptrace.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/ptrace.c 2002-09-12 21:01:33.000000000 -0500 @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2002 Shanti Katta (ka...@cs...) + * Licensed under the GPL + */ + +#include "linux/sched.h" +#include "asm/ptrace.h" +#include "asm/uaccess.h" +#include "ptrace_user.h" +#include "sysdep/sigcontext.h" +#include "sysdep/sc.h" + +int putreg(struct task_struct *child, int regno, unsigned long value) +{ + return 0; +} + +unsigned long getreg(struct task_struct *child, int regno) +{ + unsigned long retval = ~0UL; + return retval; +} + +int get_fpregs(unsigned long buf, struct task_struct *child) +{ + int err; + return(0); +} + +int set_fpregs(unsigned long buf, struct task_struct *child) +{ + int err; + return(0); +} + +/* + Overrides for Emacs so that we follow Linus's tabbing style. + Emacs will notice this stuff at the end of the file and automatically + adjust the settings for this buffer only. This must remain at the end + of the file. + --------------------------------------------------------------------- + Local variables: + c-file-style: "linux" + End: +*/ diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/ptrace_user.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/ptrace_user.c --- linux-2.4.18-origum/arch/um/sys-sparc64/ptrace_user.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/ptrace_user.c 2002-09-12 21:01:33.000000000 -0500 @@ -0,0 +1,24 @@ +#include <sys/ptrace.h> +#include <errno.h> +#include <asm/ptrace.h> +#include "sysdep/ptrace.h" + +int ptrace_getregs(long pid, struct sys_pt_regs *regs_out) +{ + return(ptrace(PTRACE_GETREGS, pid, 0, regs_out)); +} + +int ptrace_setregs(long pid, struct sys_pt_regs *regs) +{ + return(ptrace(PTRACE_SETREGS, pid, 0, regs)); +} + +/* Overrides for Emacs so that we follow Linus's tabbing style. + Emacs will notice this stuff at the end of the file and automatically + adjust the settings for this buffer only. This must remain at the end + of the file. + --------------------------------------------------------------------- + Local variables: + c-file-style: "linux" + End: +*/ diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/sigcontext.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/sigcontext.c --- linux-2.4.18-origum/arch/um/sys-sparc64/sigcontext.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/sigcontext.c 2002-09-12 21:01:33.000000000 -0500 @@ -0,0 +1,13 @@ +#include <asm/ptrace.h> +#include <asm/sigcontext.h> +#include "sysdep/ptrace.h" + +void fill_in_sigcontext(void *sc_ptr, struct sys_pt_regs *regs, unsigned long cr2, int err) +{ + while(0); +} + +void fill_in_regs(struct sys_pt_regs *refs, void *sc_ptr) +{ + while(0); +} diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/util/Makefile linux-2.4.18-sparc64um/arch/um/sys-sparc64/util/Makefile --- linux-2.4.18-origum/arch/um/sys-sparc64/util/Makefile 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/util/Makefile 2002-09-15 12:57:35.000000000 -0500 @@ -0,0 +1,6 @@ +all : mk_sc + +mk_sc : mk_sc.c + +clean : + rm mk_sc diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/sys-sparc64/util/mk_sc.c linux-2.4.18-sparc64um/arch/um/sys-sparc64/util/mk_sc.c --- linux-2.4.18-origum/arch/um/sys-sparc64/util/mk_sc.c 1969-12-31 19:00:00.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/sys-sparc64/util/mk_sc.c 2002-09-12 21:01:34.000000000 -0500 @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <signal.h> +#include <linux/stddef.h> + +#define SC_OFFSET(name, field) printf("#define " name "(sc) *((unsigned long *) &(((char *) (sc))[%d]))\n", offsetof(struct sigcontext, field)) + + /* +#define SC_FP_OFFSET(name, field) \ + printf("#define " name \ + "(sc) *((unsigned long *) &(((char *) (SC_FPSTATE(sc)))[%d]))\n",\ + offsetof(struct _fpstate, field)) + +#define SC_FP_OFFSET_PTR(name, field, type) \ + printf("#define " name \ + "(sc) ((" type " *) &(((char *) (SC_FPSTATE(sc)))[%d]))\n",\ + offsetof(struct _fpstate, field)) + */ + +int main(int argc, char **argv) +{ + SC_OFFSET("SC_IP", sigc_regs.tpc); + SC_OFFSET("SC_SP", sigc_regs.tstate); + SC_OFFSET("SC_FP", sigc_regs.u_regs[14]); + /*SC_OFFSET("SC_GS", gs); + SC_OFFSET("SC_DS", ds); + SC_OFFSET("SC_ES", es); + SC_OFFSET("SC_SS", ss); + SC_OFFSET("SC_CS", cs); + SC_OFFSET("SC_EFLAGS", eflags);*/ + SC_OFFSET("SC_UREG_I0", sigc_regs.u_regs[8]); + SC_OFFSET("SC_UREG_I1", sigc_regs.u_regs[9]); + SC_OFFSET("SC_UREG_I2", sigc_regs.u_regs[10]); + SC_OFFSET("SC_UREG_I3", sigc_regs.u_regs[11]); + SC_OFFSET("SC_UREG_I4", sigc_regs.u_regs[12]); + SC_OFFSET("SC_UREG_I5", sigc_regs.u_regs[13]); + SC_OFFSET("SC_RETPC", sigc_regs.u_regs[15]); + /*SC_OFFSET("SC_TRAPNO", trapno); + SC_OFFSET("SC_ERR", err); + SC_OFFSET("SC_CR2", cr2); + SC_OFFSET("SC_FPSTATE", fpstate); + SC_FP_OFFSET("SC_FP_CW", cw); + SC_FP_OFFSET("SC_FP_SW", sw); + SC_FP_OFFSET("SC_FP_TAG", tag); + SC_FP_OFFSET("SC_FP_IPOFF", ipoff); + SC_FP_OFFSET("SC_FP_CSSEL", cssel); + SC_FP_OFFSET("SC_FP_DATAOFF", dataoff); + SC_FP_OFFSET("SC_FP_DATASEL", datasel); + SC_FP_OFFSET_PTR("SC_FP_ST", _st, "struct _fpstate"); + SC_FP_OFFSET_PTR("SC_FXSR_ENV", _fxsr_env, "void");*/ + return(0); +} + + diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/util/Makefile linux-2.4.18-sparc64um/arch/um/util/Makefile --- linux-2.4.18-origum/arch/um/util/Makefile 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/util/Makefile 2002-09-13 20:02:48.000000000 -0500 @@ -1,10 +1,10 @@ all : mk_task mk_task : mk_task_user.o mk_task_kern.o - $(CC) -o mk_task mk_task_user.o mk_task_kern.o + $(CC) $(CFLAGS) -o mk_task mk_task_user.o mk_task_kern.o mk_task_user.o : mk_task_user.c - $(CC) -c $< + $(CC) -m64 -c $< mk_task_kern.o : mk_task_kern.c $(CC) $(CFLAGS) -c $< diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/util/mk_task_kern.c linux-2.4.18-sparc64um/arch/um/util/mk_task_kern.c --- linux-2.4.18-origum/arch/um/util/mk_task_kern.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/util/mk_task_kern.c 2002-09-13 14:50:50.000000000 -0500 @@ -9,8 +9,7 @@ int main(int argc, char **argv) { print_head(); - print_ptr("TASK_REGS", "struct uml_pt_regs", - offsetof(struct task_struct, thread.regs)); + print_ptr("TASK_REGS", "struct uml_pt_regs", offsetof(struct task_struct, thread.regs)); print("TASK_PID", "int", offsetof(struct task_struct, pid)); print_tail(); return(0); diff -Naur -X dontdiff linux-2.4.18-origum/arch/um/util/mk_task_user.c linux-2.4.18-sparc64um/arch/um/util/mk_task_user.c --- linux-2.4.18-origum/arch/um/util/mk_task_user.c 2002-09-12 19:00:36.000000000 -0500 +++ linux-2.4.18-sparc64um/arch/um/util/mk_task_user.c 2002-09-12 22:45:09.000000000 -0500 @@ -2,14 +2,12 @@ void print(char *name, char *type, int off... [truncated message content] |
From: Matt Z. <md...@de...> - 2002-09-15 23:52:46
|
On Sun, Sep 15, 2002 at 07:49:52PM -0400, Shanti Katta wrote: > For those who are interested, below is the latest patch for UML to add > Sparc64 support. This patch is based off of Iain Young's initial work on > Sparc64. The patch in it's current stage compiles and creates an > executable, with most of the options, turned off in the config. Help from > concerned persons in debugging the executable, is highly appreciated. Thanks for continuing to work on this; I am interested in seeing UML work on sparc64 but have not had the time to devote to it. > 1. I used gcc-3.0.4 to create this patch(because that was the only > compiler available with 64-bit support that could be used on my > Debian(sid) system), and hence it contains some bits in arch/um/Makefile, > which are specific to gcc-3.0.4. If you want to use any other compiler > with 64-bit support, you need to modify that section. Was this the only one which worked for you? Debian sid, as far as I know, contains 3 64-bit compilers for sparc: egcs64, gcc 3.0.4 and gcc 3.2.1. -- - mdz |
From: Shanti K. <ka...@cs...> - 2002-09-16 00:11:50
|
On Sun, 2002-09-15 at 19:51, Matt Zimmerman wrote: > Was this the only one which worked for you? Debian sid, as far as I know, > contains 3 64-bit compilers for sparc: egcs64, gcc 3.0.4 and gcc 3.2.1. > egcs64 gave a bunch of compiler errors and did not work for uml build. I could apt-get install gcc 3.2.1, but that did not have support for 64-bit compilations. -Shanti |
From: <ia...@g7...> - 2002-09-16 18:05:39
|
Hi Shanti, > For those who are interested, below is the latest patch for UML to add > Sparc64 support. This patch is based off of Iain Young's initial work on > Sparc64. The patch in it's current stage compiles and creates an > executable, with most of the options, turned off in the config. Help > from concerned persons in debugging the executable, is highly > appreciated. Great, thats much further than I got, I'll go download 2.4.18 and um22, and let you know how it goes. > 1. I used gcc-3.0.4 to create this patch(because that was the only > compiler available with 64-bit support that could be used on my > Debian(sid) system), and hence it contains some bits in > arch/um/Makefile, which are specific to gcc-3.0.4. If you want to use > any other compiler with 64-bit support, you need to modify that section. Hurm, I'm having trouble locating this particular debian package. My dpkg --list reports: ii gcc-3.0 3.0.4-11 The GNU C compiler. ii gcc-3.0-base 3.0.4-11 The GNU Compiler Collection (base package). rc gcc-3.0-sparc6 3.0.3-1 The 64bit UltraSPARC gcc libraries Unfortunatley, gcc-3.0-sparc64 doesn't seem to be in the archive any more. Also, sparc64-linux-{gcc|ld|etc etc...} don't seem to exist on my system. Searching packages.debian.org, I can only find sparc64-linux-gcc in egcs64, and you had problems with that, correct ? Could you point me towards the correct packages ? Iain. |
From: Shanti K. <ka...@cs...> - 2002-09-16 19:07:41
|
On Mon, 2002-09-16 at 13:28, Iain Young wrote: > > 1. I used gcc-3.0.4 to create this patch(because that was the only > > compiler available with 64-bit support that could be used on my > > Debian(sid) system), and hence it contains some bits in > > arch/um/Makefile, which are specific to gcc-3.0.4. If you want to use > > any other compiler with 64-bit support, you need to modify that section. > > Hurm, I'm having trouble locating this particular debian package. My > dpkg --list reports: > > ii gcc-3.0 3.0.4-11 The GNU C compiler. > ii gcc-3.0-base 3.0.4-11 The GNU Compiler Collection (base package). > rc gcc-3.0-sparc6 3.0.3-1 The 64bit UltraSPARC gcc libraries > Unfortunatley, gcc-3.0-sparc64 doesn't seem to be in the archive any more. > Also, sparc64-linux-{gcc|ld|etc etc...} don't seem to exist on my system. > > Searching packages.debian.org, I can only find sparc64-linux-gcc in egcs64, > and you had problems with that, correct ? Could you point me towards the > correct packages ? AFAIK, gcc-3.0-sparc64 is no more available. I have the following compiler(woody) packages installed: ii gcc-3.0 3.0.4-7 The GNU C compiler. ii gcc-3.0-base 3.0.4-7 The GNU Compiler Collection (base package). To support 64-bit compilations, you need to have these 2 additional packages: 1. (libc6-dev-sparc64) libc6-dev-spar 2.2.5-6 GNU C Library: 64bit Development Libraries 2. (libc6-sparc64) libc6-sparc64 2.2.5-6 GNU C Library: 64bit Shared libraries for Ul And, you are right. sparc64-linux-gcc is only available with egcs64. But I just used gcc-3.0.4 with libc6-dev-sparc64. I might try once again with sparc64-linux-gcc. During builds, I just say CC=gcc-3.0. -Shanti |
From: Shanti K. <ka...@cs...> - 2002-09-16 21:49:14
|
On Mon, 2002-09-16 at 16:44, Iain Young wrote: > Ah. Bingo. Only here comes the next problem. ld is looking in /lib > instead of /lib64 for libc, and thus bombing out. I've tried > adding -L/lib64 to arch/um/Makefile-sparc64, but no luck ? > > Any ideas ? It might just be a bad gcc/libc combo, as I'm using > Debian sid, so my gcc-3.0 and libc's are a little later than > yours. For this reason, The Debian packet maintainer for gcc, Ben Collins suggested me to make sure /lib/64 and /usr/lib/64 are symlinks to /lib64 and /usr/lib64 respectively. Good luck -Shanti |