On 7/13/06, Jeff Dike <[EMAIL PROTECTED]> wrote:
>
> Instead of the patch mentioned earlier, you might also try the one
> below - it depends on klibc, so you need to apply it to a recent -mm
> UML.  I'm thinking about sending this to Andrew, despite it's
> nastinesses.
>
> It applies on top of (and backs out) the other jmpbuf patch.
>

Is there any drawbacks in applying this directly on top of a pure
vanilla kernel (2.6.17.7) or do I need to apply the other jmpbuf patch
before this one?

/Samuel


>
> Index: linux-2.6.17/arch/um/os-Linux/sys-i386/registers.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/sys-i386/registers.c     2006-07-12 
> 11:51:15.000000000 -0400
> +++ linux-2.6.17/arch/um/os-Linux/sys-i386/registers.c  2006-07-12 
> 11:51:17.000000000 -0400
> @@ -5,12 +5,12 @@
>
>  #include <errno.h>
>  #include <string.h>
> -#include <setjmp.h>
>  #include "sysdep/ptrace_user.h"
>  #include "sysdep/ptrace.h"
>  #include "uml-config.h"
>  #include "skas_ptregs.h"
>  #include "registers.h"
> +#include "longjmp.h"
>  #include "user.h"
>
>  /* These are set once at boot time and not changed thereafter */
> @@ -130,17 +130,11 @@ void get_safe_registers(unsigned long *r
>                        HOST_FP_SIZE * sizeof(unsigned long));
>  }
>
> -#ifndef JB_PC
> -#define JB_PC 5
> -#define JB_SP 4
> -#define JB_BP 3
> -#endif
> -
>  void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)
>  {
> -       struct __jmp_buf_tag *jmpbuf = buffer;
> +       struct __jmp_buf *jmpbuf = buffer;
>
> -       UPT_SET(uml_regs, EIP, jmpbuf->__jmpbuf[JB_PC]);
> -       UPT_SET(uml_regs, UESP, jmpbuf->__jmpbuf[JB_SP]);
> -       UPT_SET(uml_regs, EBP, jmpbuf->__jmpbuf[JB_BP]);
> +       UPT_SET(uml_regs, EIP, jmpbuf->__eip);
> +       UPT_SET(uml_regs, UESP, jmpbuf->__esp);
> +       UPT_SET(uml_regs, EBP, jmpbuf->__ebp);
>  }
> Index: linux-2.6.17/arch/um/os-Linux/sys-x86_64/registers.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/sys-x86_64/registers.c   2006-07-12 
> 11:51:15.000000000 -0400
> +++ linux-2.6.17/arch/um/os-Linux/sys-x86_64/registers.c        2006-07-12 
> 11:51:17.000000000 -0400
> @@ -5,11 +5,11 @@
>
>  #include <errno.h>
>  #include <string.h>
> -#include <setjmp.h>
>  #include "ptrace_user.h"
>  #include "uml-config.h"
>  #include "skas_ptregs.h"
>  #include "registers.h"
> +#include "longjmp.h"
>  #include "user.h"
>
>  /* These are set once at boot time and not changed thereafter */
> @@ -78,17 +78,11 @@ void get_safe_registers(unsigned long *r
>                        HOST_FP_SIZE * sizeof(unsigned long));
>  }
>
> -#ifndef JB_PC
> -#define JB_PC 7
> -#define JB_RSP 6
> -#define JB_RBP 1
> -#endif
> -
>  void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)
>  {
> -       struct __jmp_buf_tag *jmpbuf = buffer;
> +       struct __jmp_buf *jmpbuf = buffer;
>
> -       UPT_SET(uml_regs, RIP, jmpbuf->__jmpbuf[JB_PC]);
> -       UPT_SET(uml_regs, RSP, jmpbuf->__jmpbuf[JB_RSP]);
> -       UPT_SET(uml_regs, RBP, jmpbuf->__jmpbuf[JB_RBP]);
> +       UPT_SET(uml_regs, RIP, jmpbuf->__rip);
> +       UPT_SET(uml_regs, RSP, jmpbuf->__rsp);
> +       UPT_SET(uml_regs, RBP, jmpbuf->__rbp);
>  }
> Index: linux-2.6.17/arch/um/Makefile
> ===================================================================
> --- linux-2.6.17.orig/arch/um/Makefile  2006-07-12 11:51:15.000000000 -0400
> +++ linux-2.6.17/arch/um/Makefile       2006-07-12 11:51:17.000000000 -0400
> @@ -29,7 +29,8 @@ SYMLINK_HEADERS := $(foreach header,$(SY
>  # These are cleaned up during mrproper. Please DO NOT fix it again, this is
>  # the Correct Thing(tm) to do!
>  ARCH_SYMLINKS = include/asm-um/arch $(ARCH_DIR)/include/sysdep 
> $(ARCH_DIR)/os \
> -       $(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h
> +       $(ARCH_DIR)/include/klibc $(SYMLINK_HEADERS) \
> +       $(ARCH_DIR)/include/uml-config.h
>
>  um-modes-$(CONFIG_MODE_TT) += tt
>  um-modes-$(CONFIG_MODE_SKAS) += skas
> @@ -52,6 +53,12 @@ SYS_DIR              := $(ARCH_DIR)/include/sysdep-$
>
>  KLIBCARCH      := $(SUBARCH)
>
> +ifneq ($(KBUILD_SRC),)
> +KLIBC_ARCH_INCLUDE := -I$(srctree)/usr/include/arch/$(SUBARCH)
> +else
> +KLIBC_ARCH_INCLUDE := -Iusr/include/arch/$(SUBARCH)
> +endif
> +
>  # -Dvmap=kernel_vmap prevents anything from referencing the libpcap.o symbol 
> so
>  # named - it's a common symbol in libpcap, so we get a binary which crashes.
>  #
> @@ -68,7 +75,7 @@ AFLAGS += $(ARCH_INCLUDE)
>
>  USER_CFLAGS := $(patsubst -I%,,$(CFLAGS))
>  USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \
> -       $(MODE_INCLUDE) -D_FILE_OFFSET_BITS=64
> +       $(MODE_INCLUDE) $(KLIBC_ARCH_INCLUDE) -D_FILE_OFFSET_BITS=64
>
>  # -Derrno=kernel_errno - This turns all kernel references to errno into
>  # kernel_errno to separate them from the libc errno.  This allows -fno-common
> @@ -202,6 +209,14 @@ else
>         $(Q)cd $(ARCH_DIR) && ln -sf os-$(OS) os
>  endif
>
> +$(ARCH_DIR)/include/klibc:
> +       @echo '  SYMLINK $@'
> +ifneq ($(KBUILD_SRC),)
> +       $(Q)ln -fsn $(srctree)/usr/include/klibc $(ARCH_DIR)/include/klibc
> +else
> +       $(Q)ln -sf usr/include/klibc $(ARCH_DIR)/include/klibc
> +endif
> +
>  # Generated files
>  define filechk_umlconfig
>         sed 's/ CONFIG/ UML_CONFIG/'
> Index: linux-2.6.17/arch/um/include/longjmp.h
> ===================================================================
> --- linux-2.6.17.orig/arch/um/include/longjmp.h 2006-07-12 11:51:15.000000000 
> -0400
> +++ linux-2.6.17/arch/um/include/longjmp.h      2006-07-12 11:51:17.000000000 
> -0400
> @@ -1,7 +1,7 @@
>  #ifndef __UML_LONGJMP_H
>  #define __UML_LONGJMP_H
>
> -#include <setjmp.h>
> +#include "../../../usr/include/setjmp.h"
>  #include "os.h"
>
>  #define UML_LONGJMP(buf, val) do { \
> Index: linux-2.6.17/arch/um/os-Linux/trap.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/trap.c   2006-07-12 11:51:15.000000000 
> -0400
> +++ linux-2.6.17/arch/um/os-Linux/trap.c        2006-07-12 11:51:17.000000000 
> -0400
> @@ -5,7 +5,6 @@
>
>  #include <stdlib.h>
>  #include <signal.h>
> -#include <setjmp.h>
>  #include "kern_util.h"
>  #include "user_util.h"
>  #include "os.h"
> Index: linux-2.6.17/arch/um/os-Linux/uaccess.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/uaccess.c        2006-07-12 
> 11:51:15.000000000 -0400
> +++ linux-2.6.17/arch/um/os-Linux/uaccess.c     2006-07-12 11:51:17.000000000 
> -0400
> @@ -4,8 +4,7 @@
>   * Licensed under the GPL
>   */
>
> -#include <setjmp.h>
> -#include <string.h>
> +#include <stddef.h>
>  #include "longjmp.h"
>
>  unsigned long __do_user_copy(void *to, const void *from, int n,
> Index: linux-2.6.17/arch/um/os-Linux/util.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/util.c   2006-07-12 11:51:15.000000000 
> -0400
> +++ linux-2.6.17/arch/um/os-Linux/util.c        2006-07-12 12:04:38.000000000 
> -0400
> @@ -7,7 +7,6 @@
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include <limits.h>
> -#include <setjmp.h>
>  #include <sys/mman.h>
>  #include <sys/stat.h>
>  #include <sys/utsname.h>
> @@ -107,11 +106,11 @@ int setjmp_wrapper(void (*proc)(void *,
>         jmp_buf buf;
>         int n;
>
> -       n = sigsetjmp(buf, 1);
> +       n = UML_SETJMP(&buf);
>         if(n == 0){
>                 va_start(args, proc);
>                 (*proc)(&buf, &args);
>         }
>         va_end(args);
> -       return(n);
> +       return n;
>  }
> Index: linux-2.6.17/arch/um/os-Linux/process.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/process.c        2006-07-12 
> 11:51:15.000000000 -0400
> +++ linux-2.6.17/arch/um/os-Linux/process.c     2006-07-12 12:04:41.000000000 
> -0400
> @@ -7,7 +7,6 @@
>  #include <stdio.h>
>  #include <errno.h>
>  #include <signal.h>
> -#include <setjmp.h>
>  #include <linux/unistd.h>
>  #include <sys/mman.h>
>  #include <sys/wait.h>
> Index: linux-2.6.17/arch/um/os-Linux/skas/process.c
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/skas/process.c   2006-07-12 
> 11:51:15.000000000 -0400
> +++ linux-2.6.17/arch/um/os-Linux/skas/process.c        2006-07-12 
> 12:04:41.000000000 -0400
> @@ -8,7 +8,6 @@
>  #include <unistd.h>
>  #include <errno.h>
>  #include <signal.h>
> -#include <setjmp.h>
>  #include <sched.h>
>  #include "ptrace_user.h"
>  #include <sys/wait.h>
> @@ -470,7 +469,7 @@ void thread_wait(void *sw, void *fb)
>         *switch_buf = &buf;
>         fork_buf = fb;
>         if(UML_SETJMP(&buf) == 0)
> -               siglongjmp(*fork_buf, INIT_JMP_REMOVE_SIGSTACK);
> +               UML_LONGJMP(fork_buf, INIT_JMP_REMOVE_SIGSTACK);
>  }
>
>  void switch_threads(void *me, void *next)
> Index: linux-2.6.17/arch/um/os-Linux/Makefile
> ===================================================================
> --- linux-2.6.17.orig/arch/um/os-Linux/Makefile 2006-07-12 11:51:15.000000000 
> -0400
> +++ linux-2.6.17/arch/um/os-Linux/Makefile      2006-07-12 11:51:17.000000000 
> -0400
> @@ -5,7 +5,8 @@
>
>  obj-y = aio.o elf_aux.o file.o helper.o irq.o main.o mem.o process.o sigio.o 
> \
>         signal.o start_up.o time.o trap.o tt.o tty.o uaccess.o umid.o tls.o \
> -       user_syms.o util.o drivers/ sys-$(SUBARCH)/
> +       user_syms.o util.o setjmp.o \
> +       drivers/ sys-$(SUBARCH)/
>
>  obj-$(CONFIG_MODE_SKAS) += skas/
>  obj-$(CONFIG_TTY_LOG) += tty_log.o
> @@ -22,3 +23,6 @@ HAVE_AIO_ABI := $(shell [ -r /usr/includ
>  CFLAGS_aio.o += $(HAVE_AIO_ABI)
>
>  include arch/um/scripts/Makefile.rules
> +
> +arch/um/os-Linux/setjmp.o :
> +       ln -sf $(objtree)/usr/klibc/arch/$(SUBARCH)/setjmp.o $@
>
>

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
User-mode-linux-user mailing list
User-mode-linux-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-user

Reply via email to