Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

um: merge signal_{32,64}.c

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Richard Weinberger <richard@nod.at>

authored by

Al Viro and committed by
Richard Weinberger
f67aa2ff fbe98686

+189 -278
+1 -1
arch/x86/um/Makefile
··· 9 9 endif 10 10 11 11 obj-y = bug.o bugs_$(BITS).o delay_$(BITS).o fault.o ksyms.o ldt.o \ 12 - ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal_$(BITS).o \ 12 + ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal.o \ 13 13 stub_$(BITS).o stub_segv.o syscalls_$(BITS).o \ 14 14 sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o \ 15 15 mem_$(BITS).o subarch.o os-$(OS)/
+1 -1
arch/x86/um/asm/ptrace_64.h
··· 40 40 41 41 #define PT_REGS_ORIG_RAX(r) UPT_ORIG_RAX(&(r)->regs) 42 42 #define PT_REGS_RIP(r) UPT_IP(&(r)->regs) 43 - #define PT_REGS_RSP(r) UPT_SP(&(r)->regs) 43 + #define PT_REGS_SP(r) UPT_SP(&(r)->regs) 44 44 45 45 #define PT_REGS_EFLAGS(r) UPT_EFLAGS(&(r)->regs) 46 46
+186 -37
arch/x86/um/signal_32.c arch/x86/um/signal.c
··· 1 1 /* 2 - * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 2 + * Copyright (C) 2003 PathScale, Inc. 3 + * Copyright (C) 2003 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 3 4 * Licensed under the GPL 4 5 */ 5 6 7 + 8 + #include <linux/personality.h> 6 9 #include <linux/ptrace.h> 10 + #include <linux/kernel.h> 7 11 #include <asm/unistd.h> 8 12 #include <asm/uaccess.h> 9 13 #include <asm/ucontext.h> 10 14 #include "frame_kern.h" 11 15 #include "skas.h" 16 + 17 + #ifdef CONFIG_X86_32 12 18 13 19 /* 14 20 * FPU tag word conversions. ··· 148 142 149 143 extern int have_fpx_regs; 150 144 145 + #endif 146 + 151 147 static int copy_sc_from_user(struct pt_regs *regs, 152 148 struct sigcontext __user *from) 153 149 { ··· 160 152 if (err) 161 153 return err; 162 154 163 - pid = userspace_pid[current_thread_info()->cpu]; 164 - 165 155 #define GETREG(regno, regname) regs->regs.gp[HOST_##regno] = sc.regname 166 156 157 + #ifdef CONFIG_X86_32 167 158 GETREG(GS, gs); 168 159 GETREG(FS, fs); 169 160 GETREG(ES, es); 170 161 GETREG(DS, ds); 162 + #endif 171 163 GETREG(DI, di); 172 164 GETREG(SI, si); 173 165 GETREG(BP, bp); ··· 177 169 GETREG(CX, cx); 178 170 GETREG(AX, ax); 179 171 GETREG(IP, ip); 172 + 173 + #ifdef CONFIG_X86_64 174 + GETREG(R8, r8); 175 + GETREG(R9, r9); 176 + GETREG(R10, r10); 177 + GETREG(R11, r11); 178 + GETREG(R12, r12); 179 + GETREG(R13, r13); 180 + GETREG(R14, r14); 181 + GETREG(R15, r15); 182 + #endif 183 + 180 184 GETREG(CS, cs); 181 185 GETREG(EFLAGS, flags); 186 + #ifdef CONFIG_X86_32 182 187 GETREG(SS, ss); 188 + #endif 183 189 184 190 #undef GETREG 191 + 192 + pid = userspace_pid[current_thread_info()->cpu]; 193 + #ifdef CONFIG_X86_32 185 194 if (have_fpx_regs) { 186 195 struct user_fxsr_struct fpx; 187 196 ··· 219 194 -err); 220 195 return 1; 221 196 } 222 - } else { 197 + } else 198 + #endif 199 + { 223 200 struct user_i387_struct fp; 224 201 225 202 err = copy_from_user(&fp, sc.fpstate, ··· 237 210 return 1; 238 211 } 239 212 } 240 - 241 213 return 0; 242 214 } 243 215 244 216 static int copy_sc_to_user(struct sigcontext __user *to, 245 - struct _fpstate __user *to_fp, struct pt_regs *regs) 217 + struct _fpstate __user *to_fp, struct pt_regs *regs, 218 + unsigned long mask) 246 219 { 247 220 struct sigcontext sc; 248 221 struct faultinfo * fi = &current->thread.arch.faultinfo; 249 222 int err, pid; 250 223 memset(&sc, 0, sizeof(struct sigcontext)); 251 224 252 - sc.gs = REGS_GS(regs->regs.gp); 253 - sc.fs = REGS_FS(regs->regs.gp); 254 - sc.es = REGS_ES(regs->regs.gp); 255 - sc.ds = REGS_DS(regs->regs.gp); 256 - sc.di = REGS_EDI(regs->regs.gp); 257 - sc.si = REGS_ESI(regs->regs.gp); 258 - sc.bp = REGS_EBP(regs->regs.gp); 259 - sc.sp = REGS_SP(regs->regs.gp); 260 - sc.bx = REGS_EBX(regs->regs.gp); 261 - sc.dx = REGS_EDX(regs->regs.gp); 262 - sc.cx = REGS_ECX(regs->regs.gp); 263 - sc.ax = REGS_EAX(regs->regs.gp); 264 - sc.ip = REGS_IP(regs->regs.gp); 265 - sc.cs = REGS_CS(regs->regs.gp); 266 - sc.flags = REGS_EFLAGS(regs->regs.gp); 267 - sc.sp_at_signal = regs->regs.gp[UESP]; 268 - sc.ss = regs->regs.gp[SS]; 225 + #define PUTREG(regno, regname) sc.regname = regs->regs.gp[HOST_##regno] 226 + 227 + #ifdef CONFIG_X86_32 228 + PUTREG(GS, gs); 229 + PUTREG(FS, fs); 230 + PUTREG(ES, es); 231 + PUTREG(DS, ds); 232 + #endif 233 + PUTREG(DI, di); 234 + PUTREG(SI, si); 235 + PUTREG(BP, bp); 236 + PUTREG(SP, sp); 237 + PUTREG(BX, bx); 238 + PUTREG(DX, dx); 239 + PUTREG(CX, cx); 240 + PUTREG(AX, ax); 241 + #ifdef CONFIG_X86_64 242 + PUTREG(R8, r8); 243 + PUTREG(R9, r9); 244 + PUTREG(R10, r10); 245 + PUTREG(R11, r11); 246 + PUTREG(R12, r12); 247 + PUTREG(R13, r13); 248 + PUTREG(R14, r14); 249 + PUTREG(R15, r15); 250 + #endif 251 + 269 252 sc.cr2 = fi->cr2; 270 253 sc.err = fi->error_code; 271 254 sc.trapno = fi->trap_no; 272 - 273 - to_fp = (to_fp ? to_fp : (struct _fpstate __user *) (to + 1)); 255 + PUTREG(IP, ip); 256 + PUTREG(CS, cs); 257 + PUTREG(EFLAGS, flags); 258 + #ifdef CONFIG_X86_32 259 + PUTREG(SP, sp_at_signal); 260 + PUTREG(SS, ss); 261 + #endif 262 + #undef PUTREG 263 + sc.oldmask = mask; 274 264 sc.fpstate = to_fp; 275 265 266 + err = copy_to_user(to, &sc, sizeof(struct sigcontext)); 267 + if (err) 268 + return 1; 269 + 276 270 pid = userspace_pid[current_thread_info()->cpu]; 271 + 272 + #ifdef CONFIG_X86_32 277 273 if (have_fpx_regs) { 278 274 struct user_fxsr_struct fpx; 279 275 ··· 319 269 if (copy_to_user(&to_fp->_fxsr_env[0], &fpx, 320 270 sizeof(struct user_fxsr_struct))) 321 271 return 1; 322 - } 323 - else { 272 + } else 273 + #endif 274 + { 324 275 struct user_i387_struct fp; 325 276 326 277 err = save_fp_registers(pid, (unsigned long *) &fp); ··· 329 278 return 1; 330 279 } 331 280 332 - return copy_to_user(to, &sc, sizeof(sc)); 281 + return 0; 333 282 } 334 283 284 + #ifdef CONFIG_X86_32 335 285 static int copy_ucontext_to_user(struct ucontext __user *uc, 336 286 struct _fpstate __user *fp, sigset_t *set, 337 287 unsigned long sp) ··· 342 290 err |= put_user(current->sas_ss_sp, &uc->uc_stack.ss_sp); 343 291 err |= put_user(sas_ss_flags(sp), &uc->uc_stack.ss_flags); 344 292 err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size); 345 - err |= copy_sc_to_user(&uc->uc_mcontext, fp, &current->thread.regs); 293 + err |= copy_sc_to_user(&uc->uc_mcontext, fp, &current->thread.regs, 0); 346 294 err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set)); 347 295 return err; 348 296 } ··· 389 337 390 338 err |= __put_user(restorer, &frame->pretcode); 391 339 err |= __put_user(sig, &frame->sig); 392 - err |= copy_sc_to_user(&frame->sc, NULL, regs); 393 - err |= __put_user(mask->sig[0], &frame->sc.oldmask); 340 + err |= copy_sc_to_user(&frame->sc, &frame->fpstate, regs, mask->sig[0]); 394 341 if (_NSIG_WORDS > 1) 395 342 err |= __copy_to_user(&frame->extramask, &mask->sig[1], 396 343 sizeof(frame->extramask)); ··· 469 418 return 0; 470 419 } 471 420 472 - long sys_sigreturn(struct pt_regs regs) 421 + long sys_sigreturn(struct pt_regs *regs) 473 422 { 474 423 unsigned long sp = PT_REGS_SP(&current->thread.regs); 475 424 struct sigframe __user *frame = (struct sigframe __user *)(sp - 8); ··· 498 447 return 0; 499 448 } 500 449 501 - long sys_rt_sigreturn(struct pt_regs regs) 450 + #else 451 + 452 + struct rt_sigframe 453 + { 454 + char __user *pretcode; 455 + struct ucontext uc; 456 + struct siginfo info; 457 + struct _fpstate fpstate; 458 + }; 459 + 460 + int setup_signal_stack_si(unsigned long stack_top, int sig, 461 + struct k_sigaction *ka, struct pt_regs * regs, 462 + siginfo_t *info, sigset_t *set) 463 + { 464 + struct rt_sigframe __user *frame; 465 + int err = 0; 466 + struct task_struct *me = current; 467 + 468 + frame = (struct rt_sigframe __user *) 469 + round_down(stack_top - sizeof(struct rt_sigframe), 16); 470 + /* Subtract 128 for a red zone and 8 for proper alignment */ 471 + frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128 - 8); 472 + 473 + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 474 + goto out; 475 + 476 + if (ka->sa.sa_flags & SA_SIGINFO) { 477 + err |= copy_siginfo_to_user(&frame->info, info); 478 + if (err) 479 + goto out; 480 + } 481 + 482 + /* Create the ucontext. */ 483 + err |= __put_user(0, &frame->uc.uc_flags); 484 + err |= __put_user(0, &frame->uc.uc_link); 485 + err |= __put_user(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 486 + err |= __put_user(sas_ss_flags(PT_REGS_SP(regs)), 487 + &frame->uc.uc_stack.ss_flags); 488 + err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); 489 + err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs, 490 + set->sig[0]); 491 + err |= __put_user(&frame->fpstate, &frame->uc.uc_mcontext.fpstate); 492 + if (sizeof(*set) == 16) { 493 + __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); 494 + __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); 495 + } 496 + else 497 + err |= __copy_to_user(&frame->uc.uc_sigmask, set, 498 + sizeof(*set)); 499 + 500 + /* 501 + * Set up to return from userspace. If provided, use a stub 502 + * already in userspace. 503 + */ 504 + /* x86-64 should always use SA_RESTORER. */ 505 + if (ka->sa.sa_flags & SA_RESTORER) 506 + err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 507 + else 508 + /* could use a vstub here */ 509 + return err; 510 + 511 + if (err) 512 + return err; 513 + 514 + /* Set up registers for signal handler */ 515 + { 516 + struct exec_domain *ed = current_thread_info()->exec_domain; 517 + if (unlikely(ed && ed->signal_invmap && sig < 32)) 518 + sig = ed->signal_invmap[sig]; 519 + } 520 + 521 + PT_REGS_SP(regs) = (unsigned long) frame; 522 + PT_REGS_RDI(regs) = sig; 523 + /* In case the signal handler was declared without prototypes */ 524 + PT_REGS_RAX(regs) = 0; 525 + 526 + /* 527 + * This also works for non SA_SIGINFO handlers because they expect the 528 + * next argument after the signal number on the stack. 529 + */ 530 + PT_REGS_RSI(regs) = (unsigned long) &frame->info; 531 + PT_REGS_RDX(regs) = (unsigned long) &frame->uc; 532 + PT_REGS_RIP(regs) = (unsigned long) ka->sa.sa_handler; 533 + out: 534 + return err; 535 + } 536 + #endif 537 + 538 + long sys_rt_sigreturn(struct pt_regs *regs) 502 539 { 503 540 unsigned long sp = PT_REGS_SP(&current->thread.regs); 504 541 struct rt_sigframe __user *frame = 505 - (struct rt_sigframe __user *) (sp - 4); 506 - sigset_t set; 542 + (struct rt_sigframe __user *)(sp - sizeof(long)); 507 543 struct ucontext __user *uc = &frame->uc; 508 - int sig_size = _NSIG_WORDS * sizeof(unsigned long); 544 + sigset_t set; 509 545 510 - if (copy_from_user(&set, &uc->uc_sigmask, sig_size)) 546 + if (copy_from_user(&set, &uc->uc_sigmask, sizeof(set))) 511 547 goto segfault; 512 548 513 549 sigdelsetmask(&set, ~_BLOCKABLE); ··· 611 473 force_sig(SIGSEGV, current); 612 474 return 0; 613 475 } 476 + 477 + #ifdef CONFIG_X86_32 478 + long ptregs_sigreturn(void) 479 + { 480 + return sys_sigreturn(NULL); 481 + } 482 + long ptregs_rt_sigreturn(void) 483 + { 484 + return sys_rt_sigreturn(NULL); 485 + } 486 + #endif
-236
arch/x86/um/signal_64.c
··· 1 - /* 2 - * Copyright (C) 2003 PathScale, Inc. 3 - * Copyright (C) 2003 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 4 - * Licensed under the GPL 5 - */ 6 - 7 - #include <linux/personality.h> 8 - #include <linux/ptrace.h> 9 - #include <linux/kernel.h> 10 - #include <asm/unistd.h> 11 - #include <asm/uaccess.h> 12 - #include <asm/ucontext.h> 13 - #include "frame_kern.h" 14 - #include "skas.h" 15 - 16 - static int copy_sc_from_user(struct pt_regs *regs, 17 - struct sigcontext __user *from) 18 - { 19 - struct sigcontext sc; 20 - struct user_i387_struct fp; 21 - void __user *buf; 22 - int err; 23 - 24 - err = copy_from_user(&sc, from, sizeof(sc)); 25 - if (err) 26 - return err; 27 - 28 - #define GETREG(regno, regname) regs->regs.gp[HOST_##regno] = sc.regname 29 - 30 - GETREG(R8, r8); 31 - GETREG(R9, r9); 32 - GETREG(R10, r10); 33 - GETREG(R11, r11); 34 - GETREG(R12, r12); 35 - GETREG(R13, r13); 36 - GETREG(R14, r14); 37 - GETREG(R15, r15); 38 - GETREG(DI, di); 39 - GETREG(SI, si); 40 - GETREG(BP, bp); 41 - GETREG(BX, bx); 42 - GETREG(DX, dx); 43 - GETREG(AX, ax); 44 - GETREG(CX, cx); 45 - GETREG(SP, sp); 46 - GETREG(IP, ip); 47 - GETREG(EFLAGS, flags); 48 - GETREG(CS, cs); 49 - #undef GETREG 50 - 51 - buf = sc.fpstate; 52 - 53 - err = copy_from_user(&fp, buf, sizeof(struct user_i387_struct)); 54 - if (err) 55 - return 1; 56 - 57 - err = restore_fp_registers(userspace_pid[current_thread_info()->cpu], 58 - (unsigned long *) &fp); 59 - if (err < 0) { 60 - printk(KERN_ERR "copy_sc_from_user - " 61 - "restore_fp_registers failed, errno = %d\n", 62 - -err); 63 - return 1; 64 - } 65 - 66 - return 0; 67 - } 68 - 69 - static int copy_sc_to_user(struct sigcontext __user *to, 70 - struct _fpstate __user *to_fp, struct pt_regs *regs, 71 - unsigned long mask) 72 - { 73 - struct faultinfo * fi = &current->thread.arch.faultinfo; 74 - struct sigcontext sc; 75 - struct user_i387_struct fp; 76 - int err = 0; 77 - memset(&sc, 0, sizeof(struct sigcontext)); 78 - 79 - #define PUTREG(regno, regname) sc.regname = regs->regs.gp[HOST_##regno] 80 - 81 - PUTREG(DI, di); 82 - PUTREG(SI, si); 83 - PUTREG(BP, bp); 84 - PUTREG(SP, sp); 85 - PUTREG(BX, bx); 86 - PUTREG(DX, dx); 87 - PUTREG(CX, cx); 88 - PUTREG(AX, ax); 89 - PUTREG(R8, r8); 90 - PUTREG(R9, r9); 91 - PUTREG(R10, r10); 92 - PUTREG(R11, r11); 93 - PUTREG(R12, r12); 94 - PUTREG(R13, r13); 95 - PUTREG(R14, r14); 96 - PUTREG(R15, r15); 97 - PUTREG(CS, cs); /* XXX x86_64 doesn't do this */ 98 - 99 - sc.cr2 = fi->cr2; 100 - sc.err = fi->error_code; 101 - sc.trapno = fi->trap_no; 102 - 103 - PUTREG(IP, ip); 104 - PUTREG(EFLAGS, flags); 105 - #undef PUTREG 106 - 107 - sc.oldmask = mask; 108 - 109 - err = copy_to_user(to, &sc, sizeof(struct sigcontext)); 110 - if (err) 111 - return 1; 112 - 113 - err = save_fp_registers(userspace_pid[current_thread_info()->cpu], 114 - (unsigned long *) &fp); 115 - if (err < 0) { 116 - printk(KERN_ERR "copy_sc_from_user - restore_fp_registers " 117 - "failed, errno = %d\n", -err); 118 - return 1; 119 - } 120 - 121 - if (copy_to_user(to_fp, &fp, sizeof(struct user_i387_struct))) 122 - return 1; 123 - 124 - return err; 125 - } 126 - 127 - struct rt_sigframe 128 - { 129 - char __user *pretcode; 130 - struct ucontext uc; 131 - struct siginfo info; 132 - struct _fpstate fpstate; 133 - }; 134 - 135 - int setup_signal_stack_si(unsigned long stack_top, int sig, 136 - struct k_sigaction *ka, struct pt_regs * regs, 137 - siginfo_t *info, sigset_t *set) 138 - { 139 - struct rt_sigframe __user *frame; 140 - int err = 0; 141 - struct task_struct *me = current; 142 - 143 - frame = (struct rt_sigframe __user *) 144 - round_down(stack_top - sizeof(struct rt_sigframe), 16); 145 - /* Subtract 128 for a red zone and 8 for proper alignment */ 146 - frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128 - 8); 147 - 148 - if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) 149 - goto out; 150 - 151 - if (ka->sa.sa_flags & SA_SIGINFO) { 152 - err |= copy_siginfo_to_user(&frame->info, info); 153 - if (err) 154 - goto out; 155 - } 156 - 157 - /* Create the ucontext. */ 158 - err |= __put_user(0, &frame->uc.uc_flags); 159 - err |= __put_user(0, &frame->uc.uc_link); 160 - err |= __put_user(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 161 - err |= __put_user(sas_ss_flags(PT_REGS_RSP(regs)), 162 - &frame->uc.uc_stack.ss_flags); 163 - err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); 164 - err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs, 165 - set->sig[0]); 166 - err |= __put_user(&frame->fpstate, &frame->uc.uc_mcontext.fpstate); 167 - if (sizeof(*set) == 16) { 168 - __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); 169 - __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); 170 - } 171 - else 172 - err |= __copy_to_user(&frame->uc.uc_sigmask, set, 173 - sizeof(*set)); 174 - 175 - /* 176 - * Set up to return from userspace. If provided, use a stub 177 - * already in userspace. 178 - */ 179 - /* x86-64 should always use SA_RESTORER. */ 180 - if (ka->sa.sa_flags & SA_RESTORER) 181 - err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); 182 - else 183 - /* could use a vstub here */ 184 - return err; 185 - 186 - if (err) 187 - return err; 188 - 189 - /* Set up registers for signal handler */ 190 - { 191 - struct exec_domain *ed = current_thread_info()->exec_domain; 192 - if (unlikely(ed && ed->signal_invmap && sig < 32)) 193 - sig = ed->signal_invmap[sig]; 194 - } 195 - 196 - PT_REGS_RSP(regs) = (unsigned long) frame; 197 - PT_REGS_RDI(regs) = sig; 198 - /* In case the signal handler was declared without prototypes */ 199 - PT_REGS_RAX(regs) = 0; 200 - 201 - /* 202 - * This also works for non SA_SIGINFO handlers because they expect the 203 - * next argument after the signal number on the stack. 204 - */ 205 - PT_REGS_RSI(regs) = (unsigned long) &frame->info; 206 - PT_REGS_RDX(regs) = (unsigned long) &frame->uc; 207 - PT_REGS_RIP(regs) = (unsigned long) ka->sa.sa_handler; 208 - out: 209 - return err; 210 - } 211 - 212 - long sys_rt_sigreturn(struct pt_regs *regs) 213 - { 214 - unsigned long sp = PT_REGS_SP(&current->thread.regs); 215 - struct rt_sigframe __user *frame = 216 - (struct rt_sigframe __user *)(sp - 8); 217 - struct ucontext __user *uc = &frame->uc; 218 - sigset_t set; 219 - 220 - if (copy_from_user(&set, &uc->uc_sigmask, sizeof(set))) 221 - goto segfault; 222 - 223 - sigdelsetmask(&set, ~_BLOCKABLE); 224 - set_current_blocked(&set); 225 - 226 - if (copy_sc_from_user(&current->thread.regs, &uc->uc_mcontext)) 227 - goto segfault; 228 - 229 - /* Avoid ERESTART handling */ 230 - PT_REGS_SYSCALL_NR(&current->thread.regs) = -1; 231 - return PT_REGS_SYSCALL_RET(&current->thread.regs); 232 - 233 - segfault: 234 - force_sig(SIGSEGV, current); 235 - return 0; 236 - }
-2
arch/x86/um/sys_call_table_32.S
··· 13 13 #define ptregs_execve sys_execve 14 14 #define ptregs_iopl sys_iopl 15 15 #define ptregs_vm86old sys_vm86old 16 - #define ptregs_sigreturn sys_sigreturn 17 16 #define ptregs_clone sys_clone 18 17 #define ptregs_vm86 sys_vm86 19 - #define ptregs_rt_sigreturn sys_rt_sigreturn 20 18 #define ptregs_sigaltstack sys_sigaltstack 21 19 #define ptregs_vfork sys_vfork 22 20
+1 -1
arch/x86/um/sysrq_64.c
··· 20 20 current->comm, print_tainted(), init_utsname()->release); 21 21 printk(KERN_INFO "RIP: %04lx:[<%016lx>]\n", PT_REGS_CS(regs) & 0xffff, 22 22 PT_REGS_RIP(regs)); 23 - printk(KERN_INFO "RSP: %016lx EFLAGS: %08lx\n", PT_REGS_RSP(regs), 23 + printk(KERN_INFO "RSP: %016lx EFLAGS: %08lx\n", PT_REGS_SP(regs), 24 24 PT_REGS_EFLAGS(regs)); 25 25 printk(KERN_INFO "RAX: %016lx RBX: %016lx RCX: %016lx\n", 26 26 PT_REGS_RAX(regs), PT_REGS_RBX(regs), PT_REGS_RCX(regs));