Revision 9eff14f3

b/cpu-exec.c
64 64
/* exit the current TB from a signal handler. The host registers are
65 65
   restored in a state compatible with the CPU emulator
66 66
 */
67
#if defined(CONFIG_SOFTMMU)
68
void cpu_resume_from_signal(CPUState *env1, void *puc)
69
{
70
    env = env1;
71

  
72
    /* XXX: restore cpu registers saved in host registers */
73

  
74
    env->exception_index = -1;
75
    longjmp(env->jmp_env, 1);
76
}
77

  
78
#else
79

  
67 80
void cpu_resume_from_signal(CPUState *env1, void *puc)
68 81
{
69
#if !defined(CONFIG_SOFTMMU)
70 82
#ifdef __linux__
71 83
    struct ucontext *uc = puc;
72 84
#elif defined(__OpenBSD__)
73 85
    struct sigcontext *uc = puc;
74 86
#endif
75
#endif
76 87

  
77 88
    env = env1;
78 89

  
79 90
    /* XXX: restore cpu registers saved in host registers */
80 91

  
81
#if !defined(CONFIG_SOFTMMU)
82 92
    if (puc) {
83 93
        /* XXX: use siglongjmp ? */
84 94
#ifdef __linux__
......
91 101
        sigprocmask(SIG_SETMASK, &uc->sc_mask, NULL);
92 102
#endif
93 103
    }
94
#endif
95 104
    env->exception_index = -1;
96 105
    longjmp(env->jmp_env, 1);
97 106
}
107
#endif
98 108

  
99 109
/* Execute the code without caching the generated code. An interpreter
100 110
   could be used if available. */
......
751 761
#if !defined(CONFIG_SOFTMMU)
752 762

  
753 763
#if defined(TARGET_I386)
754
#define EXCEPTION_ACTION raise_exception_err(env->exception_index, env->error_code)
764
#define EXCEPTION_ACTION                                        \
765
    raise_exception_err(env->exception_index, env->error_code)
755 766
#else
756
#define EXCEPTION_ACTION cpu_loop_exit()
767
#define EXCEPTION_ACTION                                        \
768
    cpu_loop_exit()
757 769
#endif
758 770

  
759 771
/* 'pc' is the host PC at which the exception was raised. 'address' is
......
767 779
    TranslationBlock *tb;
768 780
    int ret;
769 781

  
770
    if (cpu_single_env)
782
    if (cpu_single_env) {
771 783
        env = cpu_single_env; /* XXX: find a correct solution for multithread */
784
    }
772 785
#if defined(DEBUG_SIGNAL)
773 786
    qemu_printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n",
774 787
                pc, address, is_write, *(unsigned long *)old_set);
......
780 793

  
781 794
    /* see if it is an MMU fault */
782 795
    ret = cpu_handle_mmu_fault(env, address, is_write, MMU_USER_IDX, 0);
783
    if (ret < 0)
796
    if (ret < 0) {
784 797
        return 0; /* not an MMU fault */
785
    if (ret == 0)
798
    }
799
    if (ret == 0) {
786 800
        return 1; /* the MMU fault was handled without causing real CPU fault */
801
    }
787 802
    /* now we have a real cpu fault */
788 803
    tb = tb_find_pc(pc);
789 804
    if (tb) {
......
804 819
#if defined(__i386__)
805 820

  
806 821
#if defined(__APPLE__)
807
# include <sys/ucontext.h>
808

  
809
# define EIP_sig(context)  (*((unsigned long*)&(context)->uc_mcontext->ss.eip))
810
# define TRAP_sig(context)    ((context)->uc_mcontext->es.trapno)
811
# define ERROR_sig(context)   ((context)->uc_mcontext->es.err)
812
# define MASK_sig(context)    ((context)->uc_sigmask)
813
#elif defined (__NetBSD__)
814
# include <ucontext.h>
815

  
816
# define EIP_sig(context)     ((context)->uc_mcontext.__gregs[_REG_EIP])
817
# define TRAP_sig(context)    ((context)->uc_mcontext.__gregs[_REG_TRAPNO])
818
# define ERROR_sig(context)   ((context)->uc_mcontext.__gregs[_REG_ERR])
819
# define MASK_sig(context)    ((context)->uc_sigmask)
820
#elif defined (__FreeBSD__) || defined(__DragonFly__)
821
# include <ucontext.h>
822

  
823
# define EIP_sig(context)  (*((unsigned long*)&(context)->uc_mcontext.mc_eip))
824
# define TRAP_sig(context)    ((context)->uc_mcontext.mc_trapno)
825
# define ERROR_sig(context)   ((context)->uc_mcontext.mc_err)
826
# define MASK_sig(context)    ((context)->uc_sigmask)
822
#include <sys/ucontext.h>
823

  
824
#define EIP_sig(context)  (*((unsigned long *)&(context)->uc_mcontext->ss.eip))
825
#define TRAP_sig(context)    ((context)->uc_mcontext->es.trapno)
826
#define ERROR_sig(context)   ((context)->uc_mcontext->es.err)
827
#define MASK_sig(context)    ((context)->uc_sigmask)
828
#elif defined(__NetBSD__)
829
#include <ucontext.h>
830

  
831
#define EIP_sig(context)     ((context)->uc_mcontext.__gregs[_REG_EIP])
832
#define TRAP_sig(context)    ((context)->uc_mcontext.__gregs[_REG_TRAPNO])
833
#define ERROR_sig(context)   ((context)->uc_mcontext.__gregs[_REG_ERR])
834
#define MASK_sig(context)    ((context)->uc_sigmask)
835
#elif defined(__FreeBSD__) || defined(__DragonFly__)
836
#include <ucontext.h>
837

  
838
#define EIP_sig(context)  (*((unsigned long *)&(context)->uc_mcontext.mc_eip))
839
#define TRAP_sig(context)    ((context)->uc_mcontext.mc_trapno)
840
#define ERROR_sig(context)   ((context)->uc_mcontext.mc_err)
841
#define MASK_sig(context)    ((context)->uc_sigmask)
827 842
#elif defined(__OpenBSD__)
828
# define EIP_sig(context)     ((context)->sc_eip)
829
# define TRAP_sig(context)    ((context)->sc_trapno)
830
# define ERROR_sig(context)   ((context)->sc_err)
831
# define MASK_sig(context)    ((context)->sc_mask)
843
#define EIP_sig(context)     ((context)->sc_eip)
844
#define TRAP_sig(context)    ((context)->sc_trapno)
845
#define ERROR_sig(context)   ((context)->sc_err)
846
#define MASK_sig(context)    ((context)->sc_mask)
832 847
#else
833
# define EIP_sig(context)     ((context)->uc_mcontext.gregs[REG_EIP])
834
# define TRAP_sig(context)    ((context)->uc_mcontext.gregs[REG_TRAPNO])
835
# define ERROR_sig(context)   ((context)->uc_mcontext.gregs[REG_ERR])
836
# define MASK_sig(context)    ((context)->uc_sigmask)
848
#define EIP_sig(context)     ((context)->uc_mcontext.gregs[REG_EIP])
849
#define TRAP_sig(context)    ((context)->uc_mcontext.gregs[REG_TRAPNO])
850
#define ERROR_sig(context)   ((context)->uc_mcontext.gregs[REG_ERR])
851
#define MASK_sig(context)    ((context)->uc_sigmask)
837 852
#endif
838 853

  
839 854
int cpu_signal_handler(int host_signum, void *pinfo,
840 855
                       void *puc)
841 856
{
842 857
    siginfo_t *info = pinfo;
843
#if defined(__NetBSD__) || defined (__FreeBSD__) || defined(__DragonFly__)
858
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
844 859
    ucontext_t *uc = puc;
845 860
#elif defined(__OpenBSD__)
846 861
    struct sigcontext *uc = puc;
......
876 891
#define TRAP_sig(context)     ((context)->sc_trapno)
877 892
#define ERROR_sig(context)    ((context)->sc_err)
878 893
#define MASK_sig(context)     ((context)->sc_mask)
879
#elif defined (__FreeBSD__) || defined(__DragonFly__)
894
#elif defined(__FreeBSD__) || defined(__DragonFly__)
880 895
#include <ucontext.h>
881 896

  
882
#define PC_sig(context)  (*((unsigned long*)&(context)->uc_mcontext.mc_rip))
897
#define PC_sig(context)  (*((unsigned long *)&(context)->uc_mcontext.mc_rip))
883 898
#define TRAP_sig(context)     ((context)->uc_mcontext.mc_trapno)
884 899
#define ERROR_sig(context)    ((context)->uc_mcontext.mc_err)
885 900
#define MASK_sig(context)     ((context)->uc_sigmask)
......
895 910
{
896 911
    siginfo_t *info = pinfo;
897 912
    unsigned long pc;
898
#if defined(__NetBSD__) || defined (__FreeBSD__) || defined(__DragonFly__)
913
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
899 914
    ucontext_t *uc = puc;
900 915
#elif defined(__OpenBSD__)
901 916
    struct sigcontext *uc = puc;
......
918 933
 */
919 934
#ifdef linux
920 935
/* All Registers access - only for local access */
921
# define REG_sig(reg_name, context)		((context)->uc_mcontext.regs->reg_name)
936
#define REG_sig(reg_name, context)              \
937
    ((context)->uc_mcontext.regs->reg_name)
922 938
/* Gpr Registers access  */
923
# define GPR_sig(reg_num, context)		REG_sig(gpr[reg_num], context)
924
# define IAR_sig(context)			REG_sig(nip, context)	/* Program counter */
925
# define MSR_sig(context)			REG_sig(msr, context)   /* Machine State Register (Supervisor) */
926
# define CTR_sig(context)			REG_sig(ctr, context)   /* Count register */
927
# define XER_sig(context)			REG_sig(xer, context) /* User's integer exception register */
928
# define LR_sig(context)			REG_sig(link, context) /* Link register */
929
# define CR_sig(context)			REG_sig(ccr, context) /* Condition register */
939
#define GPR_sig(reg_num, context)              REG_sig(gpr[reg_num], context)
940
/* Program counter */
941
#define IAR_sig(context)                       REG_sig(nip, context)
942
/* Machine State Register (Supervisor) */
943
#define MSR_sig(context)                       REG_sig(msr, context)
944
/* Count register */
945
#define CTR_sig(context)                       REG_sig(ctr, context)
946
/* User's integer exception register */
947
#define XER_sig(context)                       REG_sig(xer, context)
948
/* Link register */
949
#define LR_sig(context)                        REG_sig(link, context)
950
/* Condition register */
951
#define CR_sig(context)                        REG_sig(ccr, context)
952

  
930 953
/* Float Registers access  */
931
# define FLOAT_sig(reg_num, context)		(((double*)((char*)((context)->uc_mcontext.regs+48*4)))[reg_num])
932
# define FPSCR_sig(context)			(*(int*)((char*)((context)->uc_mcontext.regs+(48+32*2)*4)))
954
#define FLOAT_sig(reg_num, context)                                     \
955
    (((double *)((char *)((context)->uc_mcontext.regs + 48 * 4)))[reg_num])
956
#define FPSCR_sig(context) \
957
    (*(int *)((char *)((context)->uc_mcontext.regs + (48 + 32 * 2) * 4)))
933 958
/* Exception Registers access */
934
# define DAR_sig(context)			REG_sig(dar, context)
935
# define DSISR_sig(context)			REG_sig(dsisr, context)
936
# define TRAP_sig(context)			REG_sig(trap, context)
959
#define DAR_sig(context)                       REG_sig(dar, context)
960
#define DSISR_sig(context)                     REG_sig(dsisr, context)
961
#define TRAP_sig(context)                      REG_sig(trap, context)
937 962
#endif /* linux */
938 963

  
939 964
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
940 965
#include <ucontext.h>
941
# define IAR_sig(context)		((context)->uc_mcontext.mc_srr0)
942
# define MSR_sig(context)		((context)->uc_mcontext.mc_srr1)
943
# define CTR_sig(context)		((context)->uc_mcontext.mc_ctr)
944
# define XER_sig(context)		((context)->uc_mcontext.mc_xer)
945
# define LR_sig(context)		((context)->uc_mcontext.mc_lr)
946
# define CR_sig(context)		((context)->uc_mcontext.mc_cr)
966
#define IAR_sig(context)               ((context)->uc_mcontext.mc_srr0)
967
#define MSR_sig(context)               ((context)->uc_mcontext.mc_srr1)
968
#define CTR_sig(context)               ((context)->uc_mcontext.mc_ctr)
969
#define XER_sig(context)               ((context)->uc_mcontext.mc_xer)
970
#define LR_sig(context)                ((context)->uc_mcontext.mc_lr)
971
#define CR_sig(context)                ((context)->uc_mcontext.mc_cr)
947 972
/* Exception Registers access */
948
# define DAR_sig(context)		((context)->uc_mcontext.mc_dar)
949
# define DSISR_sig(context)		((context)->uc_mcontext.mc_dsisr)
950
# define TRAP_sig(context)		((context)->uc_mcontext.mc_exc)
973
#define DAR_sig(context)               ((context)->uc_mcontext.mc_dar)
974
#define DSISR_sig(context)             ((context)->uc_mcontext.mc_dsisr)
975
#define TRAP_sig(context)              ((context)->uc_mcontext.mc_exc)
951 976
#endif /* __FreeBSD__|| __FreeBSD_kernel__ */
952 977

  
953 978
#ifdef __APPLE__
954
# include <sys/ucontext.h>
979
#include <sys/ucontext.h>
955 980
typedef struct ucontext SIGCONTEXT;
956 981
/* All Registers access - only for local access */
957
# define REG_sig(reg_name, context)		((context)->uc_mcontext->ss.reg_name)
958
# define FLOATREG_sig(reg_name, context)	((context)->uc_mcontext->fs.reg_name)
959
# define EXCEPREG_sig(reg_name, context)	((context)->uc_mcontext->es.reg_name)
960
# define VECREG_sig(reg_name, context)		((context)->uc_mcontext->vs.reg_name)
982
#define REG_sig(reg_name, context)              \
983
    ((context)->uc_mcontext->ss.reg_name)
984
#define FLOATREG_sig(reg_name, context)         \
985
    ((context)->uc_mcontext->fs.reg_name)
986
#define EXCEPREG_sig(reg_name, context)         \
987
    ((context)->uc_mcontext->es.reg_name)
988
#define VECREG_sig(reg_name, context)           \
989
    ((context)->uc_mcontext->vs.reg_name)
961 990
/* Gpr Registers access */
962
# define GPR_sig(reg_num, context)		REG_sig(r##reg_num, context)
963
# define IAR_sig(context)			REG_sig(srr0, context)	/* Program counter */
964
# define MSR_sig(context)			REG_sig(srr1, context)  /* Machine State Register (Supervisor) */
965
# define CTR_sig(context)			REG_sig(ctr, context)
966
# define XER_sig(context)			REG_sig(xer, context) /* Link register */
967
# define LR_sig(context)			REG_sig(lr, context)  /* User's integer exception register */
968
# define CR_sig(context)			REG_sig(cr, context)  /* Condition register */
991
#define GPR_sig(reg_num, context)              REG_sig(r##reg_num, context)
992
/* Program counter */
993
#define IAR_sig(context)                       REG_sig(srr0, context)
994
/* Machine State Register (Supervisor) */
995
#define MSR_sig(context)                       REG_sig(srr1, context)
996
#define CTR_sig(context)                       REG_sig(ctr, context)
997
/* Link register */
998
#define XER_sig(context)                       REG_sig(xer, context)
999
/* User's integer exception register */
1000
#define LR_sig(context)                        REG_sig(lr, context)
1001
/* Condition register */
1002
#define CR_sig(context)                        REG_sig(cr, context)
969 1003
/* Float Registers access */
970
# define FLOAT_sig(reg_num, context)		FLOATREG_sig(fpregs[reg_num], context)
971
# define FPSCR_sig(context)			((double)FLOATREG_sig(fpscr, context))
1004
#define FLOAT_sig(reg_num, context)             \
1005
    FLOATREG_sig(fpregs[reg_num], context)
1006
#define FPSCR_sig(context)                      \
1007
    ((double)FLOATREG_sig(fpscr, context))
972 1008
/* Exception Registers access */
973
# define DAR_sig(context)			EXCEPREG_sig(dar, context)     /* Fault registers for coredump */
974
# define DSISR_sig(context)			EXCEPREG_sig(dsisr, context)
975
# define TRAP_sig(context)			EXCEPREG_sig(exception, context) /* number of powerpc exception taken */
1009
/* Fault registers for coredump */
1010
#define DAR_sig(context)                       EXCEPREG_sig(dar, context)
1011
#define DSISR_sig(context)                     EXCEPREG_sig(dsisr, context)
1012
/* number of powerpc exception taken */
1013
#define TRAP_sig(context)                      EXCEPREG_sig(exception, context)
976 1014
#endif /* __APPLE__ */
977 1015

  
978 1016
int cpu_signal_handler(int host_signum, void *pinfo,
......
991 1029
    is_write = 0;
992 1030
#if 0
993 1031
    /* ppc 4xx case */
994
    if (DSISR_sig(uc) & 0x00800000)
1032
    if (DSISR_sig(uc) & 0x00800000) {
995 1033
        is_write = 1;
1034
    }
996 1035
#else
997
    if (TRAP_sig(uc) != 0x400 && (DSISR_sig(uc) & 0x02000000))
1036
    if (TRAP_sig(uc) != 0x400 && (DSISR_sig(uc) & 0x02000000)) {
998 1037
        is_write = 1;
1038
    }
999 1039
#endif
1000 1040
    return handle_cpu_signal(pc, (unsigned long)info->si_addr,
1001 1041
                             is_write, &uc->uc_sigmask, puc);
......
1014 1054

  
1015 1055
    /* XXX: need kernel patch to get write flag faster */
1016 1056
    switch (insn >> 26) {
1017
    case 0x0d: // stw
1018
    case 0x0e: // stb
1019
    case 0x0f: // stq_u
1020
    case 0x24: // stf
1021
    case 0x25: // stg
1022
    case 0x26: // sts
1023
    case 0x27: // stt
1024
    case 0x2c: // stl
1025
    case 0x2d: // stq
1026
    case 0x2e: // stl_c
1027
    case 0x2f: // stq_c
1028
	is_write = 1;
1057
    case 0x0d: /* stw */
1058
    case 0x0e: /* stb */
1059
    case 0x0f: /* stq_u */
1060
    case 0x24: /* stf */
1061
    case 0x25: /* stg */
1062
    case 0x26: /* sts */
1063
    case 0x27: /* stt */
1064
    case 0x2c: /* stl */
1065
    case 0x2d: /* stq */
1066
    case 0x2e: /* stl_c */
1067
    case 0x2f: /* stq_c */
1068
        is_write = 1;
1029 1069
    }
1030 1070

  
1031 1071
    return handle_cpu_signal(pc, (unsigned long)info->si_addr,
......
1060 1100
    is_write = 0;
1061 1101
    insn = *(uint32_t *)pc;
1062 1102
    if ((insn >> 30) == 3) {
1063
      switch((insn >> 19) & 0x3f) {
1064
      case 0x05: // stb
1065
      case 0x15: // stba
1066
      case 0x06: // sth
1067
      case 0x16: // stha
1068
      case 0x04: // st
1069
      case 0x14: // sta
1070
      case 0x07: // std
1071
      case 0x17: // stda
1072
      case 0x0e: // stx
1073
      case 0x1e: // stxa
1074
      case 0x24: // stf
1075
      case 0x34: // stfa
1076
      case 0x27: // stdf
1077
      case 0x37: // stdfa
1078
      case 0x26: // stqf
1079
      case 0x36: // stqfa
1080
      case 0x25: // stfsr
1081
      case 0x3c: // casa
1082
      case 0x3e: // casxa
1083
	is_write = 1;
1084
	break;
1085
      }
1103
        switch ((insn >> 19) & 0x3f) {
1104
        case 0x05: /* stb */
1105
        case 0x15: /* stba */
1106
        case 0x06: /* sth */
1107
        case 0x16: /* stha */
1108
        case 0x04: /* st */
1109
        case 0x14: /* sta */
1110
        case 0x07: /* std */
1111
        case 0x17: /* stda */
1112
        case 0x0e: /* stx */
1113
        case 0x1e: /* stxa */
1114
        case 0x24: /* stf */
1115
        case 0x34: /* stfa */
1116
        case 0x27: /* stdf */
1117
        case 0x37: /* stdfa */
1118
        case 0x26: /* stqf */
1119
        case 0x36: /* stqfa */
1120
        case 0x25: /* stfsr */
1121
        case 0x3c: /* casa */
1122
        case 0x3e: /* casxa */
1123
            is_write = 1;
1124
            break;
1125
        }
1086 1126
    }
1087 1127
    return handle_cpu_signal(pc, (unsigned long)info->si_addr,
1088 1128
                             is_write, sigmask, NULL);
......
1132 1172

  
1133 1173
#ifndef __ISR_VALID
1134 1174
  /* This ought to be in <bits/siginfo.h>... */
1135
# define __ISR_VALID	1
1175
# define __ISR_VALID    1
1136 1176
#endif
1137 1177

  
1138 1178
int cpu_signal_handler(int host_signum, void *pinfo, void *puc)
......
1144 1184

  
1145 1185
    ip = uc->uc_mcontext.sc_ip;
1146 1186
    switch (host_signum) {
1147
      case SIGILL:
1148
      case SIGFPE:
1149
      case SIGSEGV:
1150
      case SIGBUS:
1151
      case SIGTRAP:
1152
	  if (info->si_code && (info->si_segvflags & __ISR_VALID))
1153
	      /* ISR.W (write-access) is bit 33:  */
1154
	      is_write = (info->si_isr >> 33) & 1;
1155
	  break;
1156

  
1157
      default:
1158
	  break;
1187
    case SIGILL:
1188
    case SIGFPE:
1189
    case SIGSEGV:
1190
    case SIGBUS:
1191
    case SIGTRAP:
1192
        if (info->si_code && (info->si_segvflags & __ISR_VALID)) {
1193
            /* ISR.W (write-access) is bit 33:  */
1194
            is_write = (info->si_isr >> 33) & 1;
1195
        }
1196
        break;
1197

  
1198
    default:
1199
        break;
1159 1200
    }
1160 1201
    return handle_cpu_signal(ip, (unsigned long)info->si_addr,
1161 1202
                             is_write,
......
1269 1310
        break;
1270 1311
    }
1271 1312

  
1272
    return handle_cpu_signal(pc, (unsigned long)info->si_addr, 
1313
    return handle_cpu_signal(pc, (unsigned long)info->si_addr,
1273 1314
                             is_write, &uc->uc_sigmask, puc);
1274 1315
}
1275 1316

  

Also available in: Unified diff