diff options
31 files changed, 201 insertions, 340 deletions
diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common index 20a49ba93cb..43ef890d292 100644 --- a/arch/um/Kconfig.common +++ b/arch/um/Kconfig.common @@ -56,11 +56,6 @@ config GENERIC_CLOCKEVENTS  	bool  	default y -# Used in kernel/irq/manage.c and include/linux/irq.h -config IRQ_RELEASE_METHOD -	bool -	default y -  config HZ  	int  	default 100 diff --git a/arch/um/defconfig b/arch/um/defconfig index fdc97e2c3d7..7823ab12e6a 100644 --- a/arch/um/defconfig +++ b/arch/um/defconfig @@ -12,7 +12,6 @@ CONFIG_LOCKDEP_SUPPORT=y  CONFIG_GENERIC_CALIBRATE_DELAY=y  CONFIG_GENERIC_BUG=y  CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_IRQ_RELEASE_METHOD=y  CONFIG_HZ=100  # diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c index ca4c7ebfd0a..45e248c2f43 100644 --- a/arch/um/drivers/chan_kern.c +++ b/arch/um/drivers/chan_kern.c @@ -8,6 +8,7 @@  #include <linux/tty_flip.h>  #include "chan.h"  #include "os.h" +#include "irq_kern.h"  #ifdef CONFIG_NOCONFIG_CHAN  static void *not_configged_init(char *str, int device, @@ -213,9 +214,9 @@ void free_irqs(void)  		chan = list_entry(ele, struct chan, free_list);  		if (chan->input && chan->enabled) -			free_irq(chan->line->driver->read_irq, chan); +			um_free_irq(chan->line->driver->read_irq, chan);  		if (chan->output && chan->enabled) -			free_irq(chan->line->driver->write_irq, chan); +			um_free_irq(chan->line->driver->write_irq, chan);  		chan->enabled = 0;  	}  } @@ -234,9 +235,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)  	}  	else {  		if (chan->input && chan->enabled) -			free_irq(chan->line->driver->read_irq, chan); +			um_free_irq(chan->line->driver->read_irq, chan);  		if (chan->output && chan->enabled) -			free_irq(chan->line->driver->write_irq, chan); +			um_free_irq(chan->line->driver->write_irq, chan);  		chan->enabled = 0;  	}  	if (chan->ops->close != NULL) diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index 4ab0d9c0911..acfd0e0fd0c 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c @@ -699,7 +699,7 @@ struct winch {  static void __free_winch(struct work_struct *work)  {  	struct winch *winch = container_of(work, struct winch, work); -	free_irq(WINCH_IRQ, winch); +	um_free_irq(WINCH_IRQ, winch);  	if (winch->pid != -1)  		os_kill_process(winch->pid, 1); diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index 95f4416e6d9..0d60c5685c2 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c @@ -195,7 +195,7 @@ static int uml_net_close(struct net_device *dev)  	netif_stop_queue(dev); -	free_irq(dev->irq, dev); +	um_free_irq(dev->irq, dev);  	if (lp->close != NULL)  		(*lp->close)(lp->fd, &lp->user);  	lp->fd = -1; @@ -835,7 +835,7 @@ static void close_devices(void)  	spin_lock(&opened_lock);  	list_for_each(ele, &opened) {  		lp = list_entry(ele, struct uml_net_private, list); -		free_irq(lp->dev->irq, lp->dev); +		um_free_irq(lp->dev->irq, lp->dev);  		if ((lp->close != NULL) && (lp->fd >= 0))  			(*lp->close)(lp->fd, &lp->user);  		if (lp->remove != NULL) diff --git a/arch/um/drivers/port_kern.c b/arch/um/drivers/port_kern.c index e31680e662a..11866ffd45a 100644 --- a/arch/um/drivers/port_kern.c +++ b/arch/um/drivers/port_kern.c @@ -254,7 +254,7 @@ int port_wait(void *data)  		 * connection.  Then we loop here throwing out failed  		 * connections until a good one is found.  		 */ -		free_irq(TELNETD_IRQ, conn); +		um_free_irq(TELNETD_IRQ, conn);  		if (conn->fd >= 0)  			break; diff --git a/arch/um/drivers/xterm_kern.c b/arch/um/drivers/xterm_kern.c index 8bd130f0bda..b68bbe269e0 100644 --- a/arch/um/drivers/xterm_kern.c +++ b/arch/um/drivers/xterm_kern.c @@ -65,7 +65,7 @@ int xterm_fd(int socket, int *pid_out)  	 * isn't set) this will hang... */  	wait_for_completion(&data->ready); -	free_irq(XTERM_IRQ, data); +	um_free_irq(XTERM_IRQ, data);  	ret = data->new_fd;  	*pid_out = data->pid; diff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h index 6a3f9845743..5888f1b8347 100644 --- a/arch/um/include/asm/pgtable.h +++ b/arch/um/include/asm/pgtable.h @@ -273,6 +273,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval)  }  #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) +#define __HAVE_ARCH_PTE_SAME +static inline int pte_same(pte_t pte_a, pte_t pte_b) +{ +	return !((pte_val(pte_a) ^ pte_val(pte_b)) & ~_PAGE_NEWPAGE); +} +  /*   * Conversion functions: convert a page and protection to a page entry,   * and a page entry and page directory to the page they refer to. @@ -348,11 +354,11 @@ extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);  #define update_mmu_cache(vma,address,ptep) do ; while (0)  /* Encode and de-code a swap entry */ -#define __swp_type(x)			(((x).val >> 4) & 0x3f) +#define __swp_type(x)			(((x).val >> 5) & 0x1f)  #define __swp_offset(x)			((x).val >> 11)  #define __swp_entry(type, offset) \ -	((swp_entry_t) { ((type) << 4) | ((offset) << 11) }) +	((swp_entry_t) { ((type) << 5) | ((offset) << 11) })  #define __pte_to_swp_entry(pte) \  	((swp_entry_t) { pte_val(pte_mkuptodate(pte)) })  #define __swp_entry_to_pte(x)		((pte_t) { (x).val }) diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h index 200c4ab1240..c04e5ab68f5 100644 --- a/arch/um/include/asm/thread_info.h +++ b/arch/um/include/asm/thread_info.h @@ -71,6 +71,7 @@ static inline struct thread_info *current_thread_info(void)  #define TIF_MEMDIE		5	/* is terminating due to OOM killer */  #define TIF_SYSCALL_AUDIT	6  #define TIF_RESTORE_SIGMASK	7 +#define TIF_NOTIFY_RESUME	8  #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)  #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING) @@ -78,6 +79,5 @@ static inline struct thread_info *current_thread_info(void)  #define _TIF_POLLING_NRFLAG     (1 << TIF_POLLING_NRFLAG)  #define _TIF_MEMDIE		(1 << TIF_MEMDIE)  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT) -#define _TIF_RESTORE_SIGMASK	(1 << TIF_RESTORE_SIGMASK)  #endif diff --git a/arch/um/include/shared/irq_kern.h b/arch/um/include/shared/irq_kern.h index b05d22f3d84..7a5bfa6291b 100644 --- a/arch/um/include/shared/irq_kern.h +++ b/arch/um/include/shared/irq_kern.h @@ -13,6 +13,6 @@ extern int um_request_irq(unsigned int irq, int fd, int type,  			  irq_handler_t handler,  			  unsigned long irqflags,  const char * devname,  			  void *dev_id); - +void um_free_irq(unsigned int irq, void *dev);  #endif diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 71b8c947e5e..00506c3d5d6 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c @@ -297,6 +297,13 @@ unsigned int do_IRQ(int irq, struct uml_pt_regs *regs)  	return 1;  } +void um_free_irq(unsigned int irq, void *dev) +{ +	free_irq_by_irq_and_dev(irq, dev); +	free_irq(irq, dev); +} +EXPORT_SYMBOL(um_free_irq); +  int um_request_irq(unsigned int irq, int fd, int type,  		   irq_handler_t handler,  		   unsigned long irqflags, const char * devname, @@ -327,7 +334,6 @@ static void dummy(struct irq_data *d)  /* This is used for everything else than the timer. */  static struct irq_chip normal_irq_type = {  	.name = "SIGIO", -	.release = free_irq_by_irq_and_dev,  	.irq_disable = dummy,  	.irq_enable = dummy,  	.irq_ack = dummy, @@ -335,7 +341,6 @@ static struct irq_chip normal_irq_type = {  static struct irq_chip SIGVTALRM_irq_type = {  	.name = "SIGVTALRM", -	.release = free_irq_by_irq_and_dev,  	.irq_disable = dummy,  	.irq_enable = dummy,  	.irq_ack = dummy, diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 2b73dedb44c..3a2235e0abc 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -18,6 +18,7 @@  #include <linux/seq_file.h>  #include <linux/tick.h>  #include <linux/threads.h> +#include <linux/tracehook.h>  #include <asm/current.h>  #include <asm/pgtable.h>  #include <asm/mmu_context.h> @@ -114,8 +115,13 @@ void interrupt_end(void)  {  	if (need_resched())  		schedule(); -	if (test_tsk_thread_flag(current, TIF_SIGPENDING)) +	if (test_thread_flag(TIF_SIGPENDING))  		do_signal(); +	if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) { +		tracehook_notify_resume(¤t->thread.regs); +		if (current->replacement_session_keyring) +			key_replace_session_keyring(); +	}  }  void exit_thread(void) @@ -190,7 +196,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,  	if (current->thread.forking) {  	  	memcpy(&p->thread.regs.regs, ®s->regs,  		       sizeof(p->thread.regs.regs)); -		REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.gp, 0); +		UPT_SET_SYSCALL_RETURN(&p->thread.regs.regs, 0);  		if (sp != 0)  			REGS_SP(p->thread.regs.regs.gp) = sp; diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c index fb12f4c5e64..187118fbe1b 100644 --- a/arch/um/kernel/signal.c +++ b/arch/um/kernel/signal.c @@ -29,9 +29,6 @@ static int handle_signal(struct pt_regs *regs, unsigned long signr,  	unsigned long sp;  	int err; -	/* Always make any pending restarted system calls return -EINTR */ -	current_thread_info()->restart_block.fn = do_no_restart_syscall; -  	/* Did we come from a system call? */  	if (PT_REGS_SYSCALL_NR(regs) >= 0) {  		/* If so, check system call restarting.. */ @@ -77,15 +74,14 @@ static int kern_do_signal(struct pt_regs *regs)  {  	struct k_sigaction ka_copy;  	siginfo_t info; -	sigset_t *oldset;  	int sig, handled_sig = 0; -	if (test_thread_flag(TIF_RESTORE_SIGMASK)) -		oldset = ¤t->saved_sigmask; -	else -		oldset = ¤t->blocked; -  	while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) { +		sigset_t *oldset; +		if (test_thread_flag(TIF_RESTORE_SIGMASK)) +			oldset = ¤t->saved_sigmask; +		else +			oldset = ¤t->blocked;  		handled_sig = 1;  		/* Whee!  Actually deliver the signal.  */  		if (!handle_signal(regs, sig, &ka_copy, &info, oldset)) { diff --git a/arch/um/kernel/skas/syscall.c b/arch/um/kernel/skas/syscall.c index f5173e1ec3a..05fbeb480e0 100644 --- a/arch/um/kernel/skas/syscall.c +++ b/arch/um/kernel/skas/syscall.c @@ -34,7 +34,7 @@ void handle_syscall(struct uml_pt_regs *r)  		result = -ENOSYS;  	else result = EXECUTE_SYSCALL(syscall, regs); -	REGS_SET_SYSCALL_RETURN(r->gp, result); +	UPT_SET_SYSCALL_RETURN(r, result);  	syscall_trace(r, 1);  } diff --git a/arch/um/kernel/tlb.c b/arch/um/kernel/tlb.c index 7f3d4d86431..f819af951c1 100644 --- a/arch/um/kernel/tlb.c +++ b/arch/um/kernel/tlb.c @@ -75,6 +75,7 @@ static int do_ops(struct host_vm_change *hvc, int end,  		default:  			printk(KERN_ERR "Unknown op type %d in do_ops\n",  			       op->type); +			BUG();  			break;  		}  	} diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c index c0afff7af4b..90b310d2917 100644 --- a/arch/um/os-Linux/skas/mem.c +++ b/arch/um/os-Linux/skas/mem.c @@ -48,10 +48,6 @@ __initcall(init_syscall_regs);  extern int proc_mm; -int single_count = 0; -int multi_count = 0; -int multi_op_count = 0; -  static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr)  {  	int n, i; @@ -64,8 +60,6 @@ static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr)  		/* FIXME: Need to look up userspace_pid by cpu */  		pid = userspace_pid[0]; -	multi_count++; -  	n = ptrace_setregs(pid, syscall_regs);  	if (n < 0) {  		printk(UM_KERN_ERR "Registers - \n"); @@ -126,9 +120,6 @@ long run_syscall_stub(struct mm_id * mm_idp, int syscall,  {  	unsigned long *stack = check_init_stack(mm_idp, *addr); -	if (done && *addr == NULL) -		single_count++; -  	*stack += sizeof(long);  	stack += *stack / sizeof(long); @@ -141,7 +132,6 @@ long run_syscall_stub(struct mm_id * mm_idp, int syscall,  	*stack++ = args[5];  	*stack++ = expected;  	*stack = 0; -	multi_op_count++;  	if (!done && ((((unsigned long) stack) & ~UM_KERN_PAGE_MASK) <  		     UM_KERN_PAGE_SIZE - 10 * sizeof(long))) { diff --git a/arch/x86/um/asm/elf.h b/arch/x86/um/asm/elf.h index f3b0633b69a..0e07adc8cbe 100644 --- a/arch/x86/um/asm/elf.h +++ b/arch/x86/um/asm/elf.h @@ -34,25 +34,25 @@  #define ELF_ARCH        EM_386  #define ELF_PLAT_INIT(regs, load_addr) do { \ -	PT_REGS_EBX(regs) = 0; \ -	PT_REGS_ECX(regs) = 0; \ -	PT_REGS_EDX(regs) = 0; \ -	PT_REGS_ESI(regs) = 0; \ -	PT_REGS_EDI(regs) = 0; \ -	PT_REGS_EBP(regs) = 0; \ -	PT_REGS_EAX(regs) = 0; \ +	PT_REGS_BX(regs) = 0; \ +	PT_REGS_CX(regs) = 0; \ +	PT_REGS_DX(regs) = 0; \ +	PT_REGS_SI(regs) = 0; \ +	PT_REGS_DI(regs) = 0; \ +	PT_REGS_BP(regs) = 0; \ +	PT_REGS_AX(regs) = 0; \  } while (0)  /* Shamelessly stolen from include/asm-i386/elf.h */  #define ELF_CORE_COPY_REGS(pr_reg, regs) do {	\ -	pr_reg[0] = PT_REGS_EBX(regs);		\ -	pr_reg[1] = PT_REGS_ECX(regs);		\ -	pr_reg[2] = PT_REGS_EDX(regs);		\ -	pr_reg[3] = PT_REGS_ESI(regs);		\ -	pr_reg[4] = PT_REGS_EDI(regs);		\ -	pr_reg[5] = PT_REGS_EBP(regs);		\ -	pr_reg[6] = PT_REGS_EAX(regs);		\ +	pr_reg[0] = PT_REGS_BX(regs);		\ +	pr_reg[1] = PT_REGS_CX(regs);		\ +	pr_reg[2] = PT_REGS_DX(regs);		\ +	pr_reg[3] = PT_REGS_SI(regs);		\ +	pr_reg[4] = PT_REGS_DI(regs);		\ +	pr_reg[5] = PT_REGS_BP(regs);		\ +	pr_reg[6] = PT_REGS_AX(regs);		\  	pr_reg[7] = PT_REGS_DS(regs);		\  	pr_reg[8] = PT_REGS_ES(regs);		\  	/* fake once used fs and gs selectors? */	\ @@ -130,13 +130,13 @@ do {								\  #define ELF_ARCH        EM_X86_64  #define ELF_PLAT_INIT(regs, load_addr)    do { \ -	PT_REGS_RBX(regs) = 0; \ -	PT_REGS_RCX(regs) = 0; \ -	PT_REGS_RDX(regs) = 0; \ -	PT_REGS_RSI(regs) = 0; \ -	PT_REGS_RDI(regs) = 0; \ -	PT_REGS_RBP(regs) = 0; \ -	PT_REGS_RAX(regs) = 0; \ +	PT_REGS_BX(regs) = 0; \ +	PT_REGS_CX(regs) = 0; \ +	PT_REGS_DX(regs) = 0; \ +	PT_REGS_SI(regs) = 0; \ +	PT_REGS_DI(regs) = 0; \ +	PT_REGS_BP(regs) = 0; \ +	PT_REGS_AX(regs) = 0; \  	PT_REGS_R8(regs) = 0; \  	PT_REGS_R9(regs) = 0; \  	PT_REGS_R10(regs) = 0; \ diff --git a/arch/x86/um/asm/ptrace.h b/arch/x86/um/asm/ptrace.h index c8aca8c501b..950dfb7b841 100644 --- a/arch/x86/um/asm/ptrace.h +++ b/arch/x86/um/asm/ptrace.h @@ -1,5 +1,39 @@ +#ifndef __UM_X86_PTRACE_H +#define __UM_X86_PTRACE_H +  #ifdef CONFIG_X86_32  # include "ptrace_32.h"  #else  # include "ptrace_64.h"  #endif + +#define PT_REGS_AX(r) UPT_AX(&(r)->regs) +#define PT_REGS_BX(r) UPT_BX(&(r)->regs) +#define PT_REGS_CX(r) UPT_CX(&(r)->regs) +#define PT_REGS_DX(r) UPT_DX(&(r)->regs) + +#define PT_REGS_SI(r) UPT_SI(&(r)->regs) +#define PT_REGS_DI(r) UPT_DI(&(r)->regs) +#define PT_REGS_BP(r) UPT_BP(&(r)->regs) +#define PT_REGS_EFLAGS(r) UPT_EFLAGS(&(r)->regs) + +#define PT_REGS_CS(r) UPT_CS(&(r)->regs) +#define PT_REGS_SS(r) UPT_SS(&(r)->regs) +#define PT_REGS_DS(r) UPT_DS(&(r)->regs) +#define PT_REGS_ES(r) UPT_ES(&(r)->regs) + +#define PT_REGS_ORIG_SYSCALL(r) PT_REGS_AX(r) +#define PT_REGS_SYSCALL_RET(r) PT_REGS_AX(r) + +#define PT_FIX_EXEC_STACK(sp) do ; while(0) + +#define profile_pc(regs) PT_REGS_IP(regs) + +#define UPT_RESTART_SYSCALL(r) (UPT_IP(r) -= 2) +#define UPT_SET_SYSCALL_RETURN(r, res) (UPT_AX(r) = (res)) + +static inline long regs_return_value(struct uml_pt_regs *regs) +{ +	return UPT_AX(regs); +} +#endif /* __UM_X86_PTRACE_H */ diff --git a/arch/x86/um/asm/ptrace_32.h b/arch/x86/um/asm/ptrace_32.h index 5d2a5911253..2cf225351b6 100644 --- a/arch/x86/um/asm/ptrace_32.h +++ b/arch/x86/um/asm/ptrace_32.h @@ -11,29 +11,6 @@  #include "linux/compiler.h"  #include "asm/ptrace-generic.h" -#define PT_REGS_EAX(r) UPT_EAX(&(r)->regs) -#define PT_REGS_EBX(r) UPT_EBX(&(r)->regs) -#define PT_REGS_ECX(r) UPT_ECX(&(r)->regs) -#define PT_REGS_EDX(r) UPT_EDX(&(r)->regs) -#define PT_REGS_ESI(r) UPT_ESI(&(r)->regs) -#define PT_REGS_EDI(r) UPT_EDI(&(r)->regs) -#define PT_REGS_EBP(r) UPT_EBP(&(r)->regs) - -#define PT_REGS_CS(r) UPT_CS(&(r)->regs) -#define PT_REGS_SS(r) UPT_SS(&(r)->regs) -#define PT_REGS_DS(r) UPT_DS(&(r)->regs) -#define PT_REGS_ES(r) UPT_ES(&(r)->regs) -#define PT_REGS_FS(r) UPT_FS(&(r)->regs) -#define PT_REGS_GS(r) UPT_GS(&(r)->regs) - -#define PT_REGS_EFLAGS(r) UPT_EFLAGS(&(r)->regs) - -#define PT_REGS_ORIG_SYSCALL(r) PT_REGS_EAX(r) -#define PT_REGS_SYSCALL_RET(r) PT_REGS_EAX(r) -#define PT_FIX_EXEC_STACK(sp) do ; while(0) - -#define profile_pc(regs) PT_REGS_IP(regs) -  #define user_mode(r) UPT_IS_USER(&(r)->regs)  /* diff --git a/arch/x86/um/asm/ptrace_64.h b/arch/x86/um/asm/ptrace_64.h index 706a0d80545..ea7bff39432 100644 --- a/arch/x86/um/asm/ptrace_64.h +++ b/arch/x86/um/asm/ptrace_64.h @@ -15,13 +15,6 @@  #define HOST_AUDIT_ARCH AUDIT_ARCH_X86_64 -#define PT_REGS_RBX(r) UPT_RBX(&(r)->regs) -#define PT_REGS_RCX(r) UPT_RCX(&(r)->regs) -#define PT_REGS_RDX(r) UPT_RDX(&(r)->regs) -#define PT_REGS_RSI(r) UPT_RSI(&(r)->regs) -#define PT_REGS_RDI(r) UPT_RDI(&(r)->regs) -#define PT_REGS_RBP(r) UPT_RBP(&(r)->regs) -#define PT_REGS_RAX(r) UPT_RAX(&(r)->regs)  #define PT_REGS_R8(r) UPT_R8(&(r)->regs)  #define PT_REGS_R9(r) UPT_R9(&(r)->regs)  #define PT_REGS_R10(r) UPT_R10(&(r)->regs) @@ -31,27 +24,8 @@  #define PT_REGS_R14(r) UPT_R14(&(r)->regs)  #define PT_REGS_R15(r) UPT_R15(&(r)->regs) -#define PT_REGS_FS(r) UPT_FS(&(r)->regs) -#define PT_REGS_GS(r) UPT_GS(&(r)->regs) -#define PT_REGS_DS(r) UPT_DS(&(r)->regs) -#define PT_REGS_ES(r) UPT_ES(&(r)->regs) -#define PT_REGS_SS(r) UPT_SS(&(r)->regs) -#define PT_REGS_CS(r) UPT_CS(&(r)->regs) - -#define PT_REGS_ORIG_RAX(r) UPT_ORIG_RAX(&(r)->regs) -#define PT_REGS_RIP(r) UPT_IP(&(r)->regs) -#define PT_REGS_SP(r) UPT_SP(&(r)->regs) - -#define PT_REGS_EFLAGS(r) UPT_EFLAGS(&(r)->regs) -  /* XXX */  #define user_mode(r) UPT_IS_USER(&(r)->regs) -#define PT_REGS_ORIG_SYSCALL(r) PT_REGS_RAX(r) -#define PT_REGS_SYSCALL_RET(r) PT_REGS_RAX(r) - -#define PT_FIX_EXEC_STACK(sp) do ; while(0) - -#define profile_pc(regs) PT_REGS_IP(regs)  struct user_desc; diff --git a/arch/x86/um/shared/sysdep/ptrace.h b/arch/x86/um/shared/sysdep/ptrace.h index 2bbe1ec2d96..6ce2d76eb90 100644 --- a/arch/x86/um/shared/sysdep/ptrace.h +++ b/arch/x86/um/shared/sysdep/ptrace.h @@ -1,15 +1,74 @@  #ifndef __SYSDEP_X86_PTRACE_H  #define __SYSDEP_X86_PTRACE_H +#include <generated/user_constants.h> +#include "sysdep/faultinfo.h" + +#define MAX_REG_OFFSET (UM_FRAME_SIZE) +#define MAX_REG_NR ((MAX_REG_OFFSET) / sizeof(unsigned long)) + +#define REGS_IP(r) ((r)[HOST_IP]) +#define REGS_SP(r) ((r)[HOST_SP]) +#define REGS_EFLAGS(r) ((r)[HOST_EFLAGS]) +#define REGS_AX(r) ((r)[HOST_AX]) +#define REGS_BX(r) ((r)[HOST_BX]) +#define REGS_CX(r) ((r)[HOST_CX]) +#define REGS_DX(r) ((r)[HOST_DX]) +#define REGS_SI(r) ((r)[HOST_SI]) +#define REGS_DI(r) ((r)[HOST_DI]) +#define REGS_BP(r) ((r)[HOST_BP]) +#define REGS_CS(r) ((r)[HOST_CS]) +#define REGS_SS(r) ((r)[HOST_SS]) +#define REGS_DS(r) ((r)[HOST_DS]) +#define REGS_ES(r) ((r)[HOST_ES]) + +#define UPT_IP(r) REGS_IP((r)->gp) +#define UPT_SP(r) REGS_SP((r)->gp) +#define UPT_EFLAGS(r) REGS_EFLAGS((r)->gp) +#define UPT_AX(r) REGS_AX((r)->gp) +#define UPT_BX(r) REGS_BX((r)->gp) +#define UPT_CX(r) REGS_CX((r)->gp) +#define UPT_DX(r) REGS_DX((r)->gp) +#define UPT_SI(r) REGS_SI((r)->gp) +#define UPT_DI(r) REGS_DI((r)->gp) +#define UPT_BP(r) REGS_BP((r)->gp) +#define UPT_CS(r) REGS_CS((r)->gp) +#define UPT_SS(r) REGS_SS((r)->gp) +#define UPT_DS(r) REGS_DS((r)->gp) +#define UPT_ES(r) REGS_ES((r)->gp) +  #ifdef __i386__  #include "ptrace_32.h"  #else  #include "ptrace_64.h"  #endif -static inline long regs_return_value(struct uml_pt_regs *regs) -{ -	return UPT_SYSCALL_RET(regs); -} +struct syscall_args { +	unsigned long args[6]; +}; + +#define SYSCALL_ARGS(r) ((struct syscall_args) \ +			 { .args = { UPT_SYSCALL_ARG1(r),	 \ +				     UPT_SYSCALL_ARG2(r),	 \ +				     UPT_SYSCALL_ARG3(r),	 \ +				     UPT_SYSCALL_ARG4(r),	 \ +				     UPT_SYSCALL_ARG5(r),	 \ +				     UPT_SYSCALL_ARG6(r) } } ) + +struct uml_pt_regs { +	unsigned long gp[MAX_REG_NR]; +	unsigned long fp[MAX_FP_NR]; +	struct faultinfo faultinfo; +	long syscall; +	int is_user; +}; + +#define EMPTY_UML_PT_REGS { } + +#define UPT_SYSCALL_NR(r) ((r)->syscall) +#define UPT_FAULTINFO(r) (&(r)->faultinfo) +#define UPT_IS_USER(r) ((r)->is_user) + +extern int user_context(unsigned long sp);  #endif /* __SYSDEP_X86_PTRACE_H */ diff --git a/arch/x86/um/shared/sysdep/ptrace_32.h b/arch/x86/um/shared/sysdep/ptrace_32.h index befd1df32ed..b94a108de1d 100644 --- a/arch/x86/um/shared/sysdep/ptrace_32.h +++ b/arch/x86/um/shared/sysdep/ptrace_32.h @@ -6,11 +6,7 @@  #ifndef __SYSDEP_I386_PTRACE_H  #define __SYSDEP_I386_PTRACE_H -#include <generated/user_constants.h> -#include "sysdep/faultinfo.h" - -#define MAX_REG_NR (UM_FRAME_SIZE / sizeof(unsigned long)) -#define MAX_REG_OFFSET (UM_FRAME_SIZE) +#define MAX_FP_NR HOST_FPX_SIZE  static inline void update_debugregs(int seq) {} @@ -24,90 +20,16 @@ void set_using_sysemu(int value);  int get_using_sysemu(void);  extern int sysemu_supported; -#define REGS_IP(r) ((r)[HOST_IP]) -#define REGS_SP(r) ((r)[HOST_SP]) -#define REGS_EFLAGS(r) ((r)[HOST_EFLAGS]) -#define REGS_EAX(r) ((r)[HOST_AX]) -#define REGS_EBX(r) ((r)[HOST_BX]) -#define REGS_ECX(r) ((r)[HOST_CX]) -#define REGS_EDX(r) ((r)[HOST_DX]) -#define REGS_ESI(r) ((r)[HOST_SI]) -#define REGS_EDI(r) ((r)[HOST_DI]) -#define REGS_EBP(r) ((r)[HOST_BP]) -#define REGS_CS(r) ((r)[HOST_CS]) -#define REGS_SS(r) ((r)[HOST_SS]) -#define REGS_DS(r) ((r)[HOST_DS]) -#define REGS_ES(r) ((r)[HOST_ES]) -#define REGS_FS(r) ((r)[HOST_FS]) -#define REGS_GS(r) ((r)[HOST_GS]) - -#define REGS_SET_SYSCALL_RETURN(r, res) REGS_EAX(r) = (res) - -#define IP_RESTART_SYSCALL(ip) ((ip) -= 2) -#define REGS_RESTART_SYSCALL(r) IP_RESTART_SYSCALL(REGS_IP(r)) -  #ifndef PTRACE_SYSEMU_SINGLESTEP  #define PTRACE_SYSEMU_SINGLESTEP 32  #endif -struct uml_pt_regs { -	unsigned long gp[MAX_REG_NR]; -	unsigned long fp[HOST_FPX_SIZE]; -	struct faultinfo faultinfo; -	long syscall; -	int is_user; -}; - -#define EMPTY_UML_PT_REGS { } - -#define UPT_IP(r) REGS_IP((r)->gp) -#define UPT_SP(r) REGS_SP((r)->gp) -#define UPT_EFLAGS(r) REGS_EFLAGS((r)->gp) -#define UPT_EAX(r) REGS_EAX((r)->gp) -#define UPT_EBX(r) REGS_EBX((r)->gp) -#define UPT_ECX(r) REGS_ECX((r)->gp) -#define UPT_EDX(r) REGS_EDX((r)->gp) -#define UPT_ESI(r) REGS_ESI((r)->gp) -#define UPT_EDI(r) REGS_EDI((r)->gp) -#define UPT_EBP(r) REGS_EBP((r)->gp) -#define UPT_ORIG_EAX(r) ((r)->syscall) -#define UPT_CS(r) REGS_CS((r)->gp) -#define UPT_SS(r) REGS_SS((r)->gp) -#define UPT_DS(r) REGS_DS((r)->gp) -#define UPT_ES(r) REGS_ES((r)->gp) -#define UPT_FS(r) REGS_FS((r)->gp) -#define UPT_GS(r) REGS_GS((r)->gp) - -#define UPT_SYSCALL_ARG1(r) UPT_EBX(r) -#define UPT_SYSCALL_ARG2(r) UPT_ECX(r) -#define UPT_SYSCALL_ARG3(r) UPT_EDX(r) -#define UPT_SYSCALL_ARG4(r) UPT_ESI(r) -#define UPT_SYSCALL_ARG5(r) UPT_EDI(r) -#define UPT_SYSCALL_ARG6(r) UPT_EBP(r) - -extern int user_context(unsigned long sp); - -#define UPT_IS_USER(r) ((r)->is_user) - -struct syscall_args { -	unsigned long args[6]; -}; - -#define SYSCALL_ARGS(r) ((struct syscall_args) \ -			 { .args = { UPT_SYSCALL_ARG1(r),	\ -				     UPT_SYSCALL_ARG2(r),	\ -				     UPT_SYSCALL_ARG3(r),	\ -				     UPT_SYSCALL_ARG4(r),	\ -				     UPT_SYSCALL_ARG5(r),	\ -				     UPT_SYSCALL_ARG6(r) } } ) - -#define UPT_RESTART_SYSCALL(r) REGS_RESTART_SYSCALL((r)->gp) - -#define UPT_ORIG_SYSCALL(r) UPT_EAX(r) -#define UPT_SYSCALL_NR(r) UPT_ORIG_EAX(r) -#define UPT_SYSCALL_RET(r) UPT_EAX(r) - -#define UPT_FAULTINFO(r) (&(r)->faultinfo) +#define UPT_SYSCALL_ARG1(r) UPT_BX(r) +#define UPT_SYSCALL_ARG2(r) UPT_CX(r) +#define UPT_SYSCALL_ARG3(r) UPT_DX(r) +#define UPT_SYSCALL_ARG4(r) UPT_SI(r) +#define UPT_SYSCALL_ARG5(r) UPT_DI(r) +#define UPT_SYSCALL_ARG6(r) UPT_BP(r)  extern void arch_init_registers(int pid); diff --git a/arch/x86/um/shared/sysdep/ptrace_64.h b/arch/x86/um/shared/sysdep/ptrace_64.h index 031edc53ac5..919789f1071 100644 --- a/arch/x86/um/shared/sysdep/ptrace_64.h +++ b/arch/x86/um/shared/sysdep/ptrace_64.h @@ -8,22 +8,8 @@  #ifndef __SYSDEP_X86_64_PTRACE_H  #define __SYSDEP_X86_64_PTRACE_H -#include <generated/user_constants.h> -#include "sysdep/faultinfo.h" +#define MAX_FP_NR HOST_FP_SIZE -#define MAX_REG_OFFSET (UM_FRAME_SIZE) -#define MAX_REG_NR ((MAX_REG_OFFSET) / sizeof(unsigned long)) - -#define REGS_IP(r) ((r)[HOST_IP]) -#define REGS_SP(r) ((r)[HOST_SP]) - -#define REGS_RBX(r) ((r)[HOST_BX]) -#define REGS_RCX(r) ((r)[HOST_CX]) -#define REGS_RDX(r) ((r)[HOST_DX]) -#define REGS_RSI(r) ((r)[HOST_SI]) -#define REGS_RDI(r) ((r)[HOST_DI]) -#define REGS_RBP(r) ((r)[HOST_BP]) -#define REGS_RAX(r) ((r)[HOST_AX])  #define REGS_R8(r) ((r)[HOST_R8])  #define REGS_R9(r) ((r)[HOST_R9])  #define REGS_R10(r) ((r)[HOST_R10]) @@ -32,9 +18,6 @@  #define REGS_R13(r) ((r)[HOST_R13])  #define REGS_R14(r) ((r)[HOST_R14])  #define REGS_R15(r) ((r)[HOST_R15]) -#define REGS_CS(r) ((r)[HOST_CS]) -#define REGS_EFLAGS(r) ((r)[HOST_EFLAGS]) -#define REGS_SS(r) ((r)[HOST_SS])  #define HOST_FS_BASE 21  #define HOST_GS_BASE 22 @@ -58,45 +41,6 @@  #define GS (HOST_GS * sizeof(long))  #endif -#define REGS_FS_BASE(r) ((r)[HOST_FS_BASE]) -#define REGS_GS_BASE(r) ((r)[HOST_GS_BASE]) -#define REGS_DS(r) ((r)[HOST_DS]) -#define REGS_ES(r) ((r)[HOST_ES]) -#define REGS_FS(r) ((r)[HOST_FS]) -#define REGS_GS(r) ((r)[HOST_GS]) - -#define REGS_ORIG_RAX(r) ((r)[HOST_ORIG_AX]) - -#define REGS_SET_SYSCALL_RETURN(r, res) REGS_RAX(r) = (res) - -#define IP_RESTART_SYSCALL(ip) ((ip) -= 2) -#define REGS_RESTART_SYSCALL(r) IP_RESTART_SYSCALL(REGS_IP(r)) - -#define REGS_FAULT_ADDR(r) ((r)->fault_addr) - -#define REGS_FAULT_WRITE(r) FAULT_WRITE((r)->fault_type) - -#define REGS_TRAP(r) ((r)->trap_type) - -#define REGS_ERR(r) ((r)->fault_type) - -struct uml_pt_regs { -	unsigned long gp[MAX_REG_NR]; -	unsigned long fp[HOST_FP_SIZE]; -	struct faultinfo faultinfo; -	long syscall; -	int is_user; -}; - -#define EMPTY_UML_PT_REGS { } - -#define UPT_RBX(r) REGS_RBX((r)->gp) -#define UPT_RCX(r) REGS_RCX((r)->gp) -#define UPT_RDX(r) REGS_RDX((r)->gp) -#define UPT_RSI(r) REGS_RSI((r)->gp) -#define UPT_RDI(r) REGS_RDI((r)->gp) -#define UPT_RBP(r) REGS_RBP((r)->gp) -#define UPT_RAX(r) REGS_RAX((r)->gp)  #define UPT_R8(r) REGS_R8((r)->gp)  #define UPT_R9(r) REGS_R9((r)->gp)  #define UPT_R10(r) REGS_R10((r)->gp) @@ -105,51 +49,14 @@ struct uml_pt_regs {  #define UPT_R13(r) REGS_R13((r)->gp)  #define UPT_R14(r) REGS_R14((r)->gp)  #define UPT_R15(r) REGS_R15((r)->gp) -#define UPT_CS(r) REGS_CS((r)->gp) -#define UPT_FS_BASE(r) REGS_FS_BASE((r)->gp) -#define UPT_FS(r) REGS_FS((r)->gp) -#define UPT_GS_BASE(r) REGS_GS_BASE((r)->gp) -#define UPT_GS(r) REGS_GS((r)->gp) -#define UPT_DS(r) REGS_DS((r)->gp) -#define UPT_ES(r) REGS_ES((r)->gp) -#define UPT_CS(r) REGS_CS((r)->gp) -#define UPT_SS(r) REGS_SS((r)->gp) -#define UPT_ORIG_RAX(r) REGS_ORIG_RAX((r)->gp) - -#define UPT_IP(r) REGS_IP((r)->gp) -#define UPT_SP(r) REGS_SP((r)->gp) - -#define UPT_EFLAGS(r) REGS_EFLAGS((r)->gp) -#define UPT_SYSCALL_NR(r) ((r)->syscall) -#define UPT_SYSCALL_RET(r) UPT_RAX(r) - -extern int user_context(unsigned long sp); -#define UPT_IS_USER(r) ((r)->is_user) - -#define UPT_SYSCALL_ARG1(r) UPT_RDI(r) -#define UPT_SYSCALL_ARG2(r) UPT_RSI(r) -#define UPT_SYSCALL_ARG3(r) UPT_RDX(r) +#define UPT_SYSCALL_ARG1(r) UPT_DI(r) +#define UPT_SYSCALL_ARG2(r) UPT_SI(r) +#define UPT_SYSCALL_ARG3(r) UPT_DX(r)  #define UPT_SYSCALL_ARG4(r) UPT_R10(r)  #define UPT_SYSCALL_ARG5(r) UPT_R8(r)  #define UPT_SYSCALL_ARG6(r) UPT_R9(r) -struct syscall_args { -	unsigned long args[6]; -}; - -#define SYSCALL_ARGS(r) ((struct syscall_args) \ -			 { .args = { UPT_SYSCALL_ARG1(r),	 \ -				     UPT_SYSCALL_ARG2(r),	 \ -				     UPT_SYSCALL_ARG3(r),	 \ -				     UPT_SYSCALL_ARG4(r),	 \ -				     UPT_SYSCALL_ARG5(r),	 \ -				     UPT_SYSCALL_ARG6(r) } } ) - -#define UPT_RESTART_SYSCALL(r) REGS_RESTART_SYSCALL((r)->gp) - -#define UPT_FAULTINFO(r) (&(r)->faultinfo) -  static inline void arch_init_registers(int pid)  {  } diff --git a/arch/x86/um/signal.c b/arch/x86/um/signal.c index 4883b954601..bb0fb03b9f8 100644 --- a/arch/x86/um/signal.c +++ b/arch/x86/um/signal.c @@ -156,6 +156,9 @@ static int copy_sc_from_user(struct pt_regs *regs,  	struct sigcontext sc;  	int err, pid; +	/* Always make any pending restarted system calls return -EINTR */ +	current_thread_info()->restart_block.fn = do_no_restart_syscall; +  	err = copy_from_user(&sc, from, sizeof(sc));  	if (err)  		return err; @@ -410,9 +413,9 @@ int setup_signal_stack_sc(unsigned long stack_top, int sig,  	PT_REGS_SP(regs) = (unsigned long) frame;  	PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler; -	PT_REGS_EAX(regs) = (unsigned long) sig; -	PT_REGS_EDX(regs) = (unsigned long) 0; -	PT_REGS_ECX(regs) = (unsigned long) 0; +	PT_REGS_AX(regs) = (unsigned long) sig; +	PT_REGS_DX(regs) = (unsigned long) 0; +	PT_REGS_CX(regs) = (unsigned long) 0;  	if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED))  		ptrace_notify(SIGTRAP); @@ -460,9 +463,9 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,  	PT_REGS_SP(regs) = (unsigned long) frame;  	PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler; -	PT_REGS_EAX(regs) = (unsigned long) sig; -	PT_REGS_EDX(regs) = (unsigned long) &frame->info; -	PT_REGS_ECX(regs) = (unsigned long) &frame->uc; +	PT_REGS_AX(regs) = (unsigned long) sig; +	PT_REGS_DX(regs) = (unsigned long) &frame->info; +	PT_REGS_CX(regs) = (unsigned long) &frame->uc;  	if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED))  		ptrace_notify(SIGTRAP); @@ -541,8 +544,8 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,  			       set->sig[0]);  	err |= __put_user(&frame->fpstate, &frame->uc.uc_mcontext.fpstate);  	if (sizeof(*set) == 16) { -		__put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); -		__put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); +		err |= __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); +		err |= __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]);  	}  	else  		err |= __copy_to_user(&frame->uc.uc_sigmask, set, @@ -570,17 +573,17 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,  	}  	PT_REGS_SP(regs) = (unsigned long) frame; -	PT_REGS_RDI(regs) = sig; +	PT_REGS_DI(regs) = sig;  	/* In case the signal handler was declared without prototypes */ -	PT_REGS_RAX(regs) = 0; +	PT_REGS_AX(regs) = 0;  	/*  	 * This also works for non SA_SIGINFO handlers because they expect the  	 * next argument after the signal number on the stack.  	 */ -	PT_REGS_RSI(regs) = (unsigned long) &frame->info; -	PT_REGS_RDX(regs) = (unsigned long) &frame->uc; -	PT_REGS_RIP(regs) = (unsigned long) ka->sa.sa_handler; +	PT_REGS_SI(regs) = (unsigned long) &frame->info; +	PT_REGS_DX(regs) = (unsigned long) &frame->uc; +	PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;   out:  	return err;  } diff --git a/arch/x86/um/sys_call_table_64.c b/arch/x86/um/sys_call_table_64.c index 9924776f426..170bd926a69 100644 --- a/arch/x86/um/sys_call_table_64.c +++ b/arch/x86/um/sys_call_table_64.c @@ -31,7 +31,6 @@  #define stub_fork sys_fork  #define stub_vfork sys_vfork  #define stub_execve sys_execve -#define stub_rt_sigsuspend sys_rt_sigsuspend  #define stub_sigaltstack sys_sigaltstack  #define stub_rt_sigreturn sys_rt_sigreturn diff --git a/arch/x86/um/syscalls_32.c b/arch/x86/um/syscalls_32.c index 70ca357393b..b853e8600b9 100644 --- a/arch/x86/um/syscalls_32.c +++ b/arch/x86/um/syscalls_32.c @@ -44,10 +44,10 @@ long sys_sigaction(int sig, const struct old_sigaction __user *act,  		old_sigset_t mask;  		if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||  		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) || -		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) +		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || +		    __get_user(new_ka.sa.sa_flags, &act->sa_flags) || +		    __get_user(mask, &act->sa_mask))  			return -EFAULT; -		__get_user(new_ka.sa.sa_flags, &act->sa_flags); -		__get_user(mask, &act->sa_mask);  		siginitset(&new_ka.sa.sa_mask, mask);  	} @@ -56,10 +56,10 @@ long sys_sigaction(int sig, const struct old_sigaction __user *act,  	if (!ret && oact) {  		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||  		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || -		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) +		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || +		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || +		    __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))  			return -EFAULT; -		__put_user(old_ka.sa.sa_flags, &oact->sa_flags); -		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);  	}  	return ret; diff --git a/arch/x86/um/sysrq_32.c b/arch/x86/um/sysrq_32.c index 171b3e9dc86..2d5cc51e9be 100644 --- a/arch/x86/um/sysrq_32.c +++ b/arch/x86/um/sysrq_32.c @@ -23,12 +23,10 @@ void show_regs(struct pt_regs *regs)          printk(" EFLAGS: %08lx\n    %s\n", PT_REGS_EFLAGS(regs),  	       print_tainted());          printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", -                PT_REGS_EAX(regs), PT_REGS_EBX(regs),  -	       PT_REGS_ECX(regs),  -	       PT_REGS_EDX(regs)); +               PT_REGS_AX(regs), PT_REGS_BX(regs),  +	       PT_REGS_CX(regs), PT_REGS_DX(regs));          printk("ESI: %08lx EDI: %08lx EBP: %08lx", -	       PT_REGS_ESI(regs), PT_REGS_EDI(regs),  -	       PT_REGS_EBP(regs)); +	       PT_REGS_SI(regs), PT_REGS_DI(regs), PT_REGS_BP(regs));          printk(" DS: %04lx ES: %04lx\n",  	       0xffff & PT_REGS_DS(regs),   	       0xffff & PT_REGS_ES(regs)); diff --git a/arch/x86/um/sysrq_64.c b/arch/x86/um/sysrq_64.c index e8913436d7d..08258f17996 100644 --- a/arch/x86/um/sysrq_64.c +++ b/arch/x86/um/sysrq_64.c @@ -19,15 +19,15 @@ void __show_regs(struct pt_regs *regs)  	printk(KERN_INFO "Pid: %d, comm: %.20s %s %s\n", task_pid_nr(current),  		current->comm, print_tainted(), init_utsname()->release);  	printk(KERN_INFO "RIP: %04lx:[<%016lx>]\n", PT_REGS_CS(regs) & 0xffff, -	       PT_REGS_RIP(regs)); +	       PT_REGS_IP(regs));  	printk(KERN_INFO "RSP: %016lx  EFLAGS: %08lx\n", PT_REGS_SP(regs),  	       PT_REGS_EFLAGS(regs));  	printk(KERN_INFO "RAX: %016lx RBX: %016lx RCX: %016lx\n", -	       PT_REGS_RAX(regs), PT_REGS_RBX(regs), PT_REGS_RCX(regs)); +	       PT_REGS_AX(regs), PT_REGS_BX(regs), PT_REGS_CX(regs));  	printk(KERN_INFO "RDX: %016lx RSI: %016lx RDI: %016lx\n", -	       PT_REGS_RDX(regs), PT_REGS_RSI(regs), PT_REGS_RDI(regs)); +	       PT_REGS_DX(regs), PT_REGS_SI(regs), PT_REGS_DI(regs));  	printk(KERN_INFO "RBP: %016lx R08: %016lx R09: %016lx\n", -	       PT_REGS_RBP(regs), PT_REGS_R8(regs), PT_REGS_R9(regs)); +	       PT_REGS_BP(regs), PT_REGS_R8(regs), PT_REGS_R9(regs));  	printk(KERN_INFO "R10: %016lx R11: %016lx R12: %016lx\n",  	       PT_REGS_R10(regs), PT_REGS_R11(regs), PT_REGS_R12(regs));  	printk(KERN_INFO "R13: %016lx R14: %016lx R15: %016lx\n", diff --git a/arch/x86/um/tls_32.c b/arch/x86/um/tls_32.c index c6c7131e563..baba84f8ecb 100644 --- a/arch/x86/um/tls_32.c +++ b/arch/x86/um/tls_32.c @@ -219,7 +219,7 @@ int arch_copy_tls(struct task_struct *new)  	int idx, ret = -EFAULT;  	if (copy_from_user(&info, -			   (void __user *) UPT_ESI(&new->thread.regs.regs), +			   (void __user *) UPT_SI(&new->thread.regs.regs),  			   sizeof(info)))  		goto out; diff --git a/include/linux/irq.h b/include/linux/irq.h index b27cfcfd3a5..61f5cec031e 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -335,11 +335,6 @@ struct irq_chip {  	void		(*irq_print_chip)(struct irq_data *data, struct seq_file *p);  	unsigned long	flags; - -	/* Currently used only by UML, might disappear one day.*/ -#ifdef CONFIG_IRQ_RELEASE_METHOD -	void		(*release)(unsigned int irq, void *dev_id); -#endif  };  /* diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 585f6381f8e..bb32326afe8 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1220,12 +1220,6 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)  	/* Found it - now remove it from the list of entries: */  	*action_ptr = action->next; -	/* Currently used only by UML, might disappear one day: */ -#ifdef CONFIG_IRQ_RELEASE_METHOD -	if (desc->irq_data.chip->release) -		desc->irq_data.chip->release(irq, dev_id); -#endif -  	/* If this was the last handler, shut down the IRQ line: */  	if (!desc->action)  		irq_shutdown(desc);  |