/[qemu]/qemu/linux-user/signal.c
ViewVC logotype

Diff of /qemu/linux-user/signal.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.27 by bellard, Sun Jan 30 22:59:18 2005 UTC revision 1.28 by bellard, Thu Apr 7 22:20:31 2005 UTC
# Line 26  Line 26 
26  #include <errno.h>  #include <errno.h>
27  #include <sys/ucontext.h>  #include <sys/ucontext.h>
28    
 #ifdef __ia64__  
 #undef uc_mcontext  
 #undef uc_sigmask  
 #undef uc_stack  
 #undef uc_link  
 #endif  
   
29  #include "qemu.h"  #include "qemu.h"
30    
31  //#define DEBUG_SIGNAL  //#define DEBUG_SIGNAL
# Line 557  typedef struct target_sigaltstack { Line 550  typedef struct target_sigaltstack {
550  } target_stack_t;  } target_stack_t;
551    
552  struct target_ucontext {  struct target_ucontext {
553          target_ulong      uc_flags;          target_ulong      tuc_flags;
554          target_ulong      uc_link;          target_ulong      tuc_link;
555          target_stack_t    uc_stack;          target_stack_t    tuc_stack;
556          struct target_sigcontext uc_mcontext;          struct target_sigcontext tuc_mcontext;
557          target_sigset_t   uc_sigmask;   /* mask last for extensibility */          target_sigset_t   tuc_sigmask;  /* mask last for extensibility */
558  };  };
559    
560  struct sigframe  struct sigframe
# Line 743  static void setup_rt_frame(int sig, stru Line 736  static void setup_rt_frame(int sig, stru
736                  goto give_sigsegv;                  goto give_sigsegv;
737    
738          /* Create the ucontext.  */          /* Create the ucontext.  */
739          err |= __put_user(0, &frame->uc.uc_flags);          err |= __put_user(0, &frame->uc.tuc_flags);
740          err |= __put_user(0, &frame->uc.uc_link);          err |= __put_user(0, &frame->uc.tuc_link);
741          err |= __put_user(/*current->sas_ss_sp*/ 0, &frame->uc.uc_stack.ss_sp);          err |= __put_user(/*current->sas_ss_sp*/ 0,
742                              &frame->uc.tuc_stack.ss_sp);
743          err |= __put_user(/* sas_ss_flags(regs->esp) */ 0,          err |= __put_user(/* sas_ss_flags(regs->esp) */ 0,
744                            &frame->uc.uc_stack.ss_flags);                            &frame->uc.tuc_stack.ss_flags);
745          err |= __put_user(/* current->sas_ss_size */ 0, &frame->uc.uc_stack.ss_size);          err |= __put_user(/* current->sas_ss_size */ 0,
746          err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,                            &frame->uc.tuc_stack.ss_size);
747            err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate,
748                                  env, set->sig[0]);                                  env, set->sig[0]);
749          for(i = 0; i < TARGET_NSIG_WORDS; i++) {          for(i = 0; i < TARGET_NSIG_WORDS; i++) {
750              if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]))              if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
751                  goto give_sigsegv;                  goto give_sigsegv;
752          }          }
753    
# Line 880  long do_rt_sigreturn(CPUX86State *env) Line 875  long do_rt_sigreturn(CPUX86State *env)
875          if (verify_area(VERIFY_READ, frame, sizeof(*frame)))          if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
876                  goto badframe;                  goto badframe;
877  #endif  #endif
878          target_to_host_sigset(&set, &frame->uc.uc_sigmask);          target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
879          sigprocmask(SIG_SETMASK, &set, NULL);          sigprocmask(SIG_SETMASK, &set, NULL);
880                    
881          if (restore_sigcontext(env, &frame->uc.uc_mcontext, &eax))          if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax))
882                  goto badframe;                  goto badframe;
883    
884  #if 0  #if 0
885          if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))          if (__copy_from_user(&st, &frame->uc.tuc_stack, sizeof(st)))
886                  goto badframe;                  goto badframe;
887          /* It is more difficult to avoid calling this function than to          /* It is more difficult to avoid calling this function than to
888             call it and ignore errors.  */             call it and ignore errors.  */
# Line 933  typedef struct target_sigaltstack { Line 928  typedef struct target_sigaltstack {
928  } target_stack_t;  } target_stack_t;
929    
930  struct target_ucontext {  struct target_ucontext {
931      target_ulong uc_flags;      target_ulong tuc_flags;
932      target_ulong uc_link;      target_ulong tuc_link;
933      target_stack_t uc_stack;      target_stack_t tuc_stack;
934      struct target_sigcontext uc_mcontext;      struct target_sigcontext tuc_mcontext;
935      target_sigset_t  uc_sigmask;        /* mask last for extensibility */      target_sigset_t  tuc_sigmask;       /* mask last for extensibility */
936  };  };
937    
938  struct sigframe  struct sigframe
# Line 1135  static void setup_rt_frame(int usig, str Line 1130  static void setup_rt_frame(int usig, str
1130          /* Clear all the bits of the ucontext we don't use.  */          /* Clear all the bits of the ucontext we don't use.  */
1131          err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));          err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
1132    
1133          err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/          err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/
1134                                  env, set->sig[0]);                                  env, set->sig[0]);
1135          for(i = 0; i < TARGET_NSIG_WORDS; i++) {          for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1136              if (__put_user(set->sig[i], &frame->uc.uc_sigmask.sig[i]))              if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1137                  return;                  return;
1138          }          }
1139    
# Line 1253  long do_rt_sigreturn(CPUState *env) Line 1248  long do_rt_sigreturn(CPUState *env)
1248          if (verify_area(VERIFY_READ, frame, sizeof (*frame)))          if (verify_area(VERIFY_READ, frame, sizeof (*frame)))
1249                  goto badframe;                  goto badframe;
1250  #endif  #endif
1251          target_to_host_sigset(&host_set, &frame->uc.uc_sigmask);          target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask);
1252          sigprocmask(SIG_SETMASK, &host_set, NULL);          sigprocmask(SIG_SETMASK, &host_set, NULL);
1253    
1254          if (restore_sigcontext(env, &frame->uc.uc_mcontext))          if (restore_sigcontext(env, &frame->uc.tuc_mcontext))
1255                  goto badframe;                  goto badframe;
1256    
1257  #if 0  #if 0

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.28

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26