@@ -177,48 +177,11 @@ static void handle_segv(int pid, struct uml_pt_regs *regs, unsigned long *aux_fp
177177 segv (regs -> faultinfo , 0 , 1 , NULL );
178178}
179179
180- /*
181- * To use the same value of using_sysemu as the caller, ask it that value
182- * (in local_using_sysemu
183- */
184- static void handle_trap (int pid , struct uml_pt_regs * regs ,
185- int local_using_sysemu )
180+ static void handle_trap (int pid , struct uml_pt_regs * regs )
186181{
187- int err , status ;
188-
189182 if ((UPT_IP (regs ) >= STUB_START ) && (UPT_IP (regs ) < STUB_END ))
190183 fatal_sigsegv ();
191184
192- if (!local_using_sysemu )
193- {
194- err = ptrace (PTRACE_POKEUSER , pid , PT_SYSCALL_NR_OFFSET ,
195- __NR_getpid );
196- if (err < 0 ) {
197- printk (UM_KERN_ERR "%s - nullifying syscall failed, errno = %d\n" ,
198- __func__ , errno );
199- fatal_sigsegv ();
200- }
201-
202- err = ptrace (PTRACE_SYSCALL , pid , 0 , 0 );
203- if (err < 0 ) {
204- printk (UM_KERN_ERR "%s - continuing to end of syscall failed, errno = %d\n" ,
205- __func__ , errno );
206- fatal_sigsegv ();
207- }
208-
209- CATCH_EINTR (err = waitpid (pid , & status , WUNTRACED | __WALL ));
210- if ((err < 0 ) || !WIFSTOPPED (status ) ||
211- (WSTOPSIG (status ) != SIGTRAP + 0x80 )) {
212- err = ptrace_dump_regs (pid );
213- if (err )
214- printk (UM_KERN_ERR "Failed to get registers from process, errno = %d\n" ,
215- - err );
216- printk (UM_KERN_ERR "%s - failed to wait at end of syscall, errno = %d, status = %d\n" ,
217- __func__ , errno , status );
218- fatal_sigsegv ();
219- }
220- }
221-
222185 handle_syscall (regs );
223186}
224187
@@ -355,10 +318,10 @@ int start_userspace(unsigned long stub_stack)
355318 goto out_kill ;
356319 }
357320
358- if (ptrace (PTRACE_OLDSETOPTIONS , pid , NULL ,
321+ if (ptrace (PTRACE_SETOPTIONS , pid , NULL ,
359322 (void * ) PTRACE_O_TRACESYSGOOD ) < 0 ) {
360323 err = - errno ;
361- printk (UM_KERN_ERR "%s : PTRACE_OLDSETOPTIONS failed, errno = %d\n" ,
324+ printk (UM_KERN_ERR "%s : PTRACE_SETOPTIONS failed, errno = %d\n" ,
362325 __func__ , errno );
363326 goto out_kill ;
364327 }
@@ -380,8 +343,6 @@ int start_userspace(unsigned long stub_stack)
380343void userspace (struct uml_pt_regs * regs , unsigned long * aux_fp_regs )
381344{
382345 int err , status , op , pid = userspace_pid [0 ];
383- /* To prevent races if using_sysemu changes under us.*/
384- int local_using_sysemu ;
385346 siginfo_t si ;
386347
387348 /* Handle any immediate reschedules or signals */
@@ -411,11 +372,10 @@ void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs)
411372 fatal_sigsegv ();
412373 }
413374
414- /* Now we set local_using_sysemu to be used for one loop */
415- local_using_sysemu = get_using_sysemu ();
416-
417- op = SELECT_PTRACE_OPERATION (local_using_sysemu ,
418- singlestepping (NULL ));
375+ if (singlestepping ())
376+ op = PTRACE_SYSEMU_SINGLESTEP ;
377+ else
378+ op = PTRACE_SYSEMU ;
419379
420380 if (ptrace (op , pid , 0 , 0 )) {
421381 printk (UM_KERN_ERR "%s - ptrace continue failed, op = %d, errno = %d\n" ,
@@ -474,7 +434,7 @@ void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs)
474434 else handle_segv (pid , regs , aux_fp_regs );
475435 break ;
476436 case SIGTRAP + 0x80 :
477- handle_trap (pid , regs , local_using_sysemu );
437+ handle_trap (pid , regs );
478438 break ;
479439 case SIGTRAP :
480440 relay_signal (SIGTRAP , (struct siginfo * )& si , regs );
@@ -597,10 +557,10 @@ int copy_context_skas0(unsigned long new_stack, int pid)
597557 goto out_kill ;
598558 }
599559
600- if (ptrace (PTRACE_OLDSETOPTIONS , pid , NULL ,
560+ if (ptrace (PTRACE_SETOPTIONS , pid , NULL ,
601561 (void * )PTRACE_O_TRACESYSGOOD ) < 0 ) {
602562 err = - errno ;
603- printk (UM_KERN_ERR "%s : PTRACE_OLDSETOPTIONS failed, errno = %d\n" ,
563+ printk (UM_KERN_ERR "%s : PTRACE_SETOPTIONS failed, errno = %d\n" ,
604564 __func__ , errno );
605565 goto out_kill ;
606566 }
0 commit comments