We were missing __volatile__ on some bits of asm in the segfault handlers. On x86_64, this was messing up the move from %rdx to uc because that was moved to after the GET_FAULTINFO_FROM_SC, which changed %rdx. Also changed the other bit of asm and the one in the i386 handler to prevent any similar occurrences. Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
		
			
				
	
	
		
			33 lines
		
	
	
		
			889 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			889 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com)
 | |
|  * Licensed under the GPL
 | |
|  */
 | |
| 
 | |
| #include <signal.h>
 | |
| #include <sys/select.h> /* The only way I can see to get sigset_t */
 | |
| #include <asm/unistd.h>
 | |
| #include "uml-config.h"
 | |
| #include "sysdep/stub.h"
 | |
| #include "sysdep/sigcontext.h"
 | |
| #include "sysdep/faultinfo.h"
 | |
| 
 | |
| void __attribute__ ((__section__ (".__syscall_stub")))
 | |
| stub_segv_handler(int sig)
 | |
| {
 | |
| 	struct sigcontext *sc = (struct sigcontext *) (&sig + 1);
 | |
| 	int pid;
 | |
| 
 | |
| 	GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA),
 | |
| 			      sc);
 | |
| 
 | |
| 	pid = stub_syscall0(__NR_getpid);
 | |
| 	stub_syscall2(__NR_kill, pid, SIGUSR1);
 | |
| 
 | |
| 	/* Load pointer to sigcontext into esp, since we need to leave
 | |
| 	 * the stack in its original form when we do the sigreturn here, by
 | |
| 	 * hand.
 | |
| 	 */
 | |
| 	__asm__ __volatile__("mov %0,%%esp ; movl %1, %%eax ; "
 | |
| 			     "int $0x80" : : "a" (sc), "g" (__NR_sigreturn));
 | |
| }
 |