trunk/src/emu/cpu/i386/pentops.c
| r23884 | r23885 | |
| 144 | 144 | i386_trap(cpustate, 6, 0, 0); |
| 145 | 145 | } |
| 146 | 146 | |
| 147 | static void PENTIUMOP(rsm)(i386_state *cpustate) |
| 148 | { |
| 149 | UINT32 smram_state = cpustate->smbase + 0xfe00; |
| 150 | if(!cpustate->smm) |
| 151 | { |
| 152 | logerror("i386: Invalid RSM outside SMM at %08X\n", cpustate->pc - 1); |
| 153 | i386_trap(cpustate, 6, 0, 0); |
| 154 | return; |
| 155 | } |
| 156 | |
| 157 | // load state, no sanity checks anywhere |
| 158 | cpustate->smbase = READ32(cpustate, smram_state+SMRAM_SMBASE); |
| 159 | cpustate->cr[4] = READ32(cpustate, smram_state+SMRAM_IP5_CR4); |
| 160 | cpustate->sreg[ES].limit = READ32(cpustate, smram_state+SMRAM_IP5_ESLIM); |
| 161 | cpustate->sreg[ES].base = READ32(cpustate, smram_state+SMRAM_IP5_ESBASE); |
| 162 | cpustate->sreg[ES].flags = READ32(cpustate, smram_state+SMRAM_IP5_ESACC); |
| 163 | cpustate->sreg[CS].limit = READ32(cpustate, smram_state+SMRAM_IP5_CSLIM); |
| 164 | cpustate->sreg[CS].base = READ32(cpustate, smram_state+SMRAM_IP5_CSBASE); |
| 165 | cpustate->sreg[CS].flags = READ32(cpustate, smram_state+SMRAM_IP5_CSACC); |
| 166 | cpustate->sreg[SS].limit = READ32(cpustate, smram_state+SMRAM_IP5_SSLIM); |
| 167 | cpustate->sreg[SS].base = READ32(cpustate, smram_state+SMRAM_IP5_SSBASE); |
| 168 | cpustate->sreg[SS].flags = READ32(cpustate, smram_state+SMRAM_IP5_SSACC); |
| 169 | cpustate->sreg[DS].limit = READ32(cpustate, smram_state+SMRAM_IP5_DSLIM); |
| 170 | cpustate->sreg[DS].base = READ32(cpustate, smram_state+SMRAM_IP5_DSBASE); |
| 171 | cpustate->sreg[DS].flags = READ32(cpustate, smram_state+SMRAM_IP5_DSACC); |
| 172 | cpustate->sreg[FS].limit = READ32(cpustate, smram_state+SMRAM_IP5_FSLIM); |
| 173 | cpustate->sreg[FS].base = READ32(cpustate, smram_state+SMRAM_IP5_FSBASE); |
| 174 | cpustate->sreg[FS].flags = READ32(cpustate, smram_state+SMRAM_IP5_FSACC); |
| 175 | cpustate->sreg[GS].limit = READ32(cpustate, smram_state+SMRAM_IP5_GSLIM); |
| 176 | cpustate->sreg[GS].base = READ32(cpustate, smram_state+SMRAM_IP5_GSBASE); |
| 177 | cpustate->sreg[GS].flags = READ32(cpustate, smram_state+SMRAM_IP5_GSACC); |
| 178 | cpustate->ldtr.flags = READ32(cpustate, smram_state+SMRAM_IP5_LDTACC); |
| 179 | cpustate->ldtr.limit = READ32(cpustate, smram_state+SMRAM_IP5_LDTLIM); |
| 180 | cpustate->ldtr.base = READ32(cpustate, smram_state+SMRAM_IP5_LDTBASE); |
| 181 | cpustate->gdtr.limit = READ32(cpustate, smram_state+SMRAM_IP5_GDTLIM); |
| 182 | cpustate->gdtr.base = READ32(cpustate, smram_state+SMRAM_IP5_GDTBASE); |
| 183 | cpustate->idtr.limit = READ32(cpustate, smram_state+SMRAM_IP5_IDTLIM); |
| 184 | cpustate->idtr.base = READ32(cpustate, smram_state+SMRAM_IP5_IDTBASE); |
| 185 | cpustate->task.limit = READ32(cpustate, smram_state+SMRAM_IP5_TRLIM); |
| 186 | cpustate->task.base = READ32(cpustate, smram_state+SMRAM_IP5_TRBASE); |
| 187 | cpustate->task.flags = READ32(cpustate, smram_state+SMRAM_IP5_TRACC); |
| 188 | |
| 189 | cpustate->sreg[ES].selector = READ32(cpustate, smram_state+SMRAM_ES); |
| 190 | cpustate->sreg[CS].selector = READ32(cpustate, smram_state+SMRAM_CS); |
| 191 | cpustate->sreg[SS].selector = READ32(cpustate, smram_state+SMRAM_SS); |
| 192 | cpustate->sreg[DS].selector = READ32(cpustate, smram_state+SMRAM_DS); |
| 193 | cpustate->sreg[FS].selector = READ32(cpustate, smram_state+SMRAM_FS); |
| 194 | cpustate->sreg[GS].selector = READ32(cpustate, smram_state+SMRAM_GS); |
| 195 | cpustate->ldtr.segment = READ32(cpustate, smram_state+SMRAM_LDTR); |
| 196 | cpustate->task.segment = READ32(cpustate, smram_state+SMRAM_TR); |
| 197 | |
| 198 | cpustate->dr[7] = READ32(cpustate, smram_state+SMRAM_DR7); |
| 199 | cpustate->dr[6] = READ32(cpustate, smram_state+SMRAM_DR6); |
| 200 | REG32(EAX) = READ32(cpustate, smram_state+SMRAM_EAX); |
| 201 | REG32(ECX) = READ32(cpustate, smram_state+SMRAM_ECX); |
| 202 | REG32(EDX) = READ32(cpustate, smram_state+SMRAM_EDX); |
| 203 | REG32(EBX) = READ32(cpustate, smram_state+SMRAM_EBX); |
| 204 | REG32(ESP) = READ32(cpustate, smram_state+SMRAM_ESP); |
| 205 | REG32(EBP) = READ32(cpustate, smram_state+SMRAM_EBP); |
| 206 | REG32(ESI) = READ32(cpustate, smram_state+SMRAM_ESI); |
| 207 | REG32(EDI) = READ32(cpustate, smram_state+SMRAM_EDI); |
| 208 | cpustate->eip = READ32(cpustate, smram_state+SMRAM_EIP); |
| 209 | cpustate->eflags = READ32(cpustate, smram_state+SMRAM_EAX); |
| 210 | cpustate->cr[3] = READ32(cpustate, smram_state+SMRAM_CR3); |
| 211 | cpustate->cr[0] = READ32(cpustate, smram_state+SMRAM_CR0); |
| 212 | |
| 213 | cpustate->CPL = (cpustate->sreg[SS].flags >> 13) & 3; // cpl == dpl of ss |
| 214 | |
| 215 | for(int i = 0; i < GS; i++) |
| 216 | { |
| 217 | if(PROTECTED_MODE && !V8086_MODE) |
| 218 | { |
| 219 | cpustate->sreg[i].valid = cpustate->sreg[i].selector ? true : false; |
| 220 | cpustate->sreg[i].d = (cpustate->sreg[i].flags & 0x4000) ? 1 : 0; |
| 221 | } |
| 222 | else |
| 223 | cpustate->sreg[i].valid = true; |
| 224 | } |
| 225 | |
| 226 | if(!cpustate->smiact.isnull()) |
| 227 | cpustate->smiact(false); |
| 228 | cpustate->smm = false; |
| 229 | |
| 230 | CHANGE_PC(cpustate,cpustate->eip); |
| 231 | cpustate->nmi_masked = false; |
| 232 | if(cpustate->nmi_latched) |
| 233 | { |
| 234 | cpustate->nmi_latched = false; |
| 235 | i386_trap(cpustate, 2, 1, 0); |
| 236 | } |
| 237 | } |
| 238 | |
| 147 | 239 | static void SSEOP(cvttss2si)(i386_state *cpustate) // Opcode f3 0f 2c |
| 148 | 240 | { |
| 149 | 241 | UINT32 src; |
trunk/src/emu/cpu/i386/i386.c
| r23884 | r23885 | |
| 136 | 136 | { |
| 137 | 137 | cpustate->sreg[segment].base = cpustate->sreg[segment].selector << 4; |
| 138 | 138 | cpustate->sreg[segment].limit = 0xffff; |
| 139 | | cpustate->sreg[segment].flags = (segment == CS) ? 0x009a : 0x0092; |
| 139 | cpustate->sreg[segment].flags = (segment == CS) ? 0x00fb : 0x00f3; |
| 140 | 140 | cpustate->sreg[segment].d = 0; |
| 141 | 141 | cpustate->sreg[segment].valid = true; |
| 142 | 142 | } |
| r23884 | r23885 | |
| 3069 | 3069 | device->save_item(NAME(cpustate->irq_state)); |
| 3070 | 3070 | device->save_item(NAME(cpustate->performed_intersegment_jump)); |
| 3071 | 3071 | device->save_item(NAME(cpustate->mxcsr)); |
| 3072 | device->save_item(NAME(cpustate->smm)); |
| 3073 | device->save_item(NAME(cpustate->nmi_masked)); |
| 3074 | device->save_item(NAME(cpustate->nmi_latched)); |
| 3075 | device->save_item(NAME(cpustate->smbase)); |
| 3072 | 3076 | device->machine().save().register_postload(save_prepost_delegate(FUNC(i386_postload), cpustate)); |
| 3077 | |
| 3078 | i386_interface *intf = (i386_interface *) device->static_config(); |
| 3079 | |
| 3080 | if (intf != NULL) |
| 3081 | cpustate->smiact.resolve(intf->smiact, *device); |
| 3082 | else |
| 3083 | memset(&cpustate->smiact, 0, sizeof(cpustate->smiact)); |
| 3073 | 3084 | } |
| 3074 | 3085 | |
| 3075 | 3086 | CPU_INIT( i386 ) |
| r23884 | r23885 | |
| 3159 | 3170 | |
| 3160 | 3171 | cpustate->idtr.base = 0; |
| 3161 | 3172 | cpustate->idtr.limit = 0x3ff; |
| 3173 | cpustate->smm = false; |
| 3174 | cpustate->nmi_masked = false; |
| 3175 | cpustate->nmi_latched = false; |
| 3162 | 3176 | |
| 3163 | 3177 | cpustate->a20_mask = ~0; |
| 3164 | 3178 | |
| r23884 | r23885 | |
| 3183 | 3197 | CHANGE_PC(cpustate,cpustate->eip); |
| 3184 | 3198 | } |
| 3185 | 3199 | |
| 3200 | static void pentium_smi(i386_state *cpustate) |
| 3201 | { |
| 3202 | UINT32 smram_state = cpustate->smbase + 0xfe00; |
| 3203 | UINT32 old_cr0 = cpustate->cr[0]; |
| 3204 | UINT32 old_flags = get_flags(cpustate); |
| 3205 | |
| 3206 | if(cpustate->smm) |
| 3207 | return; // TODO: latch |
| 3208 | |
| 3209 | cpustate->cr[0] &= ~(0x8000000d); |
| 3210 | set_flags(cpustate, 2); |
| 3211 | if(!cpustate->smiact.isnull()) |
| 3212 | cpustate->smiact(true); |
| 3213 | cpustate->smm = true; |
| 3214 | |
| 3215 | // save state |
| 3216 | WRITE32(cpustate, cpustate->cr[4], smram_state+SMRAM_IP5_CR4); |
| 3217 | WRITE32(cpustate, cpustate->sreg[ES].limit, smram_state+SMRAM_IP5_ESLIM); |
| 3218 | WRITE32(cpustate, cpustate->sreg[ES].base, smram_state+SMRAM_IP5_ESBASE); |
| 3219 | WRITE32(cpustate, cpustate->sreg[ES].flags, smram_state+SMRAM_IP5_ESACC); |
| 3220 | WRITE32(cpustate, cpustate->sreg[CS].limit, smram_state+SMRAM_IP5_CSLIM); |
| 3221 | WRITE32(cpustate, cpustate->sreg[CS].base, smram_state+SMRAM_IP5_CSBASE); |
| 3222 | WRITE32(cpustate, cpustate->sreg[CS].flags, smram_state+SMRAM_IP5_CSACC); |
| 3223 | WRITE32(cpustate, cpustate->sreg[SS].limit, smram_state+SMRAM_IP5_SSLIM); |
| 3224 | WRITE32(cpustate, cpustate->sreg[SS].base, smram_state+SMRAM_IP5_SSBASE); |
| 3225 | WRITE32(cpustate, cpustate->sreg[SS].flags, smram_state+SMRAM_IP5_SSACC); |
| 3226 | WRITE32(cpustate, cpustate->sreg[DS].limit, smram_state+SMRAM_IP5_DSLIM); |
| 3227 | WRITE32(cpustate, cpustate->sreg[DS].base, smram_state+SMRAM_IP5_DSBASE); |
| 3228 | WRITE32(cpustate, cpustate->sreg[DS].flags, smram_state+SMRAM_IP5_DSACC); |
| 3229 | WRITE32(cpustate, cpustate->sreg[FS].limit, smram_state+SMRAM_IP5_FSLIM); |
| 3230 | WRITE32(cpustate, cpustate->sreg[FS].base, smram_state+SMRAM_IP5_FSBASE); |
| 3231 | WRITE32(cpustate, cpustate->sreg[FS].flags, smram_state+SMRAM_IP5_FSACC); |
| 3232 | WRITE32(cpustate, cpustate->sreg[GS].limit, smram_state+SMRAM_IP5_GSLIM); |
| 3233 | WRITE32(cpustate, cpustate->sreg[GS].base, smram_state+SMRAM_IP5_GSBASE); |
| 3234 | WRITE32(cpustate, cpustate->sreg[GS].flags, smram_state+SMRAM_IP5_GSACC); |
| 3235 | WRITE32(cpustate, cpustate->ldtr.flags, smram_state+SMRAM_IP5_LDTACC); |
| 3236 | WRITE32(cpustate, cpustate->ldtr.limit, smram_state+SMRAM_IP5_LDTLIM); |
| 3237 | WRITE32(cpustate, cpustate->ldtr.base, smram_state+SMRAM_IP5_LDTBASE); |
| 3238 | WRITE32(cpustate, cpustate->gdtr.limit, smram_state+SMRAM_IP5_GDTLIM); |
| 3239 | WRITE32(cpustate, cpustate->gdtr.base, smram_state+SMRAM_IP5_GDTBASE); |
| 3240 | WRITE32(cpustate, cpustate->idtr.limit, smram_state+SMRAM_IP5_IDTLIM); |
| 3241 | WRITE32(cpustate, cpustate->idtr.base, smram_state+SMRAM_IP5_IDTBASE); |
| 3242 | WRITE32(cpustate, cpustate->task.limit, smram_state+SMRAM_IP5_TRLIM); |
| 3243 | WRITE32(cpustate, cpustate->task.base, smram_state+SMRAM_IP5_TRBASE); |
| 3244 | WRITE32(cpustate, cpustate->task.flags, smram_state+SMRAM_IP5_TRACC); |
| 3245 | |
| 3246 | WRITE32(cpustate, cpustate->sreg[ES].selector, smram_state+SMRAM_ES); |
| 3247 | WRITE32(cpustate, cpustate->sreg[CS].selector, smram_state+SMRAM_CS); |
| 3248 | WRITE32(cpustate, cpustate->sreg[SS].selector, smram_state+SMRAM_SS); |
| 3249 | WRITE32(cpustate, cpustate->sreg[DS].selector, smram_state+SMRAM_DS); |
| 3250 | WRITE32(cpustate, cpustate->sreg[FS].selector, smram_state+SMRAM_FS); |
| 3251 | WRITE32(cpustate, cpustate->sreg[GS].selector, smram_state+SMRAM_GS); |
| 3252 | WRITE32(cpustate, cpustate->ldtr.segment, smram_state+SMRAM_LDTR); |
| 3253 | WRITE32(cpustate, cpustate->task.segment, smram_state+SMRAM_TR); |
| 3254 | |
| 3255 | WRITE32(cpustate, cpustate->dr[7], smram_state+SMRAM_DR7); |
| 3256 | WRITE32(cpustate, cpustate->dr[6], smram_state+SMRAM_DR6); |
| 3257 | WRITE32(cpustate, REG32(EAX), smram_state+SMRAM_EAX); |
| 3258 | WRITE32(cpustate, REG32(ECX), smram_state+SMRAM_ECX); |
| 3259 | WRITE32(cpustate, REG32(EDX), smram_state+SMRAM_EDX); |
| 3260 | WRITE32(cpustate, REG32(EBX), smram_state+SMRAM_EBX); |
| 3261 | WRITE32(cpustate, REG32(ESP), smram_state+SMRAM_ESP); |
| 3262 | WRITE32(cpustate, REG32(EBP), smram_state+SMRAM_EBP); |
| 3263 | WRITE32(cpustate, REG32(ESI), smram_state+SMRAM_ESI); |
| 3264 | WRITE32(cpustate, REG32(EDI), smram_state+SMRAM_EDI); |
| 3265 | WRITE32(cpustate, cpustate->eip, smram_state+SMRAM_EIP); |
| 3266 | WRITE32(cpustate, old_flags, smram_state+SMRAM_EAX); |
| 3267 | WRITE32(cpustate, cpustate->cr[3], smram_state+SMRAM_CR3); |
| 3268 | WRITE32(cpustate, old_cr0, smram_state+SMRAM_CR0); |
| 3269 | |
| 3270 | cpustate->sreg[DS].selector = cpustate->sreg[ES].selector = cpustate->sreg[FS].selector = cpustate->sreg[GS].selector = cpustate->sreg[SS].selector = 0; |
| 3271 | cpustate->sreg[DS].base = cpustate->sreg[ES].base = cpustate->sreg[FS].base = cpustate->sreg[GS].base = cpustate->sreg[SS].base = 0x00000000; |
| 3272 | cpustate->sreg[DS].limit = cpustate->sreg[ES].limit = cpustate->sreg[FS].limit = cpustate->sreg[GS].limit = cpustate->sreg[SS].limit = 0xffffffff; |
| 3273 | cpustate->sreg[DS].flags = cpustate->sreg[ES].flags = cpustate->sreg[FS].flags = cpustate->sreg[GS].flags = cpustate->sreg[SS].flags = 0x8093; |
| 3274 | cpustate->sreg[DS].valid = cpustate->sreg[ES].valid = cpustate->sreg[FS].valid = cpustate->sreg[GS].valid = cpustate->sreg[SS].valid =true; |
| 3275 | cpustate->sreg[CS].selector = 0x3000; // pentium only, ppro sel = smbase >> 4 |
| 3276 | cpustate->sreg[CS].base = cpustate->smbase; |
| 3277 | cpustate->sreg[CS].limit = 0xffffffff; |
| 3278 | cpustate->sreg[CS].flags = 0x809b; |
| 3279 | cpustate->sreg[CS].valid = true; |
| 3280 | cpustate->cr[4] = 0; |
| 3281 | cpustate->dr[7] = 0x400; |
| 3282 | cpustate->eip = 0x8000; |
| 3283 | |
| 3284 | cpustate->nmi_masked = true; |
| 3285 | CHANGE_PC(cpustate,cpustate->eip); |
| 3286 | } |
| 3287 | |
| 3186 | 3288 | static void i386_set_irq_line(i386_state *cpustate,int irqline, int state) |
| 3187 | 3289 | { |
| 3188 | 3290 | if (state != CLEAR_LINE && cpustate->halted) |
| r23884 | r23885 | |
| 3193 | 3295 | if ( irqline == INPUT_LINE_NMI ) |
| 3194 | 3296 | { |
| 3195 | 3297 | /* NMI (I do not think that this is 100% right) */ |
| 3298 | if(cpustate->nmi_masked) |
| 3299 | { |
| 3300 | cpustate->nmi_latched = true; |
| 3301 | return; |
| 3302 | } |
| 3196 | 3303 | if ( state ) |
| 3197 | 3304 | i386_trap(cpustate,2, 1, 0); |
| 3198 | 3305 | } |
| r23884 | r23885 | |
| 3669 | 3776 | cpustate->eflags = 0; |
| 3670 | 3777 | cpustate->eflags_mask = 0x00077fd7; |
| 3671 | 3778 | cpustate->eip = 0xfff0; |
| 3779 | cpustate->smm = false; |
| 3780 | cpustate->nmi_masked = false; |
| 3781 | cpustate->nmi_latched = false; |
| 3672 | 3782 | |
| 3673 | 3783 | x87_reset(cpustate); |
| 3674 | 3784 | |
| r23884 | r23885 | |
| 3781 | 3891 | cpustate->eflags_mask = 0x003f7fd7; |
| 3782 | 3892 | cpustate->eip = 0xfff0; |
| 3783 | 3893 | cpustate->mxcsr = 0x1f80; |
| 3894 | cpustate->smm = false; |
| 3895 | cpustate->smbase = 0x30000; |
| 3896 | cpustate->nmi_masked = false; |
| 3897 | cpustate->nmi_latched = false; |
| 3784 | 3898 | |
| 3785 | 3899 | x87_reset(cpustate); |
| 3786 | 3900 | |
| r23884 | r23885 | |
| 3823 | 3937 | i386_state *cpustate = get_safe_token(device); |
| 3824 | 3938 | switch (state) |
| 3825 | 3939 | { |
| 3940 | case CPUINFO_INT_INPUT_STATE+INPUT_LINE_SMI: |
| 3941 | if(state) |
| 3942 | pentium_smi(cpustate); |
| 3943 | break; |
| 3826 | 3944 | case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->x87_cw = info->i; break; |
| 3827 | 3945 | case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->x87_sw = info->i; break; |
| 3828 | 3946 | case CPUINFO_INT_REGISTER + X87_TAG: cpustate->x87_tw = info->i; break; |
| r23884 | r23885 | |
| 3907 | 4025 | cpustate->eflags = 0x00200000; |
| 3908 | 4026 | cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ |
| 3909 | 4027 | cpustate->eip = 0xfff0; |
| 4028 | cpustate->smm = false; |
| 4029 | cpustate->nmi_masked = false; |
| 4030 | cpustate->nmi_latched = false; |
| 3910 | 4031 | |
| 3911 | 4032 | x87_reset(cpustate); |
| 3912 | 4033 | |
| r23884 | r23885 | |
| 4027 | 4148 | cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ |
| 4028 | 4149 | cpustate->eip = 0xfff0; |
| 4029 | 4150 | cpustate->mxcsr = 0x1f80; |
| 4151 | cpustate->smm = false; |
| 4152 | cpustate->smbase = 0x30000; |
| 4153 | cpustate->nmi_masked = false; |
| 4154 | cpustate->nmi_latched = false; |
| 4030 | 4155 | |
| 4031 | 4156 | x87_reset(cpustate); |
| 4032 | 4157 | |
| r23884 | r23885 | |
| 4127 | 4252 | cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ |
| 4128 | 4253 | cpustate->eip = 0xfff0; |
| 4129 | 4254 | cpustate->mxcsr = 0x1f80; |
| 4255 | cpustate->smm = false; |
| 4256 | cpustate->smbase = 0x30000; |
| 4257 | cpustate->nmi_masked = false; |
| 4258 | cpustate->nmi_latched = false; |
| 4130 | 4259 | |
| 4131 | 4260 | x87_reset(cpustate); |
| 4132 | 4261 | |
| r23884 | r23885 | |
| 4227 | 4356 | cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ |
| 4228 | 4357 | cpustate->eip = 0xfff0; |
| 4229 | 4358 | cpustate->mxcsr = 0x1f80; |
| 4359 | cpustate->smm = false; |
| 4360 | cpustate->smbase = 0x30000; |
| 4361 | cpustate->nmi_masked = false; |
| 4362 | cpustate->nmi_latched = false; |
| 4230 | 4363 | |
| 4231 | 4364 | x87_reset(cpustate); |
| 4232 | 4365 | |
| r23884 | r23885 | |
| 4327 | 4460 | cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ |
| 4328 | 4461 | cpustate->eip = 0xfff0; |
| 4329 | 4462 | cpustate->mxcsr = 0x1f80; |
| 4463 | cpustate->smm = false; |
| 4464 | cpustate->smbase = 0x30000; |
| 4465 | cpustate->nmi_masked = false; |
| 4466 | cpustate->nmi_latched = false; |
| 4330 | 4467 | |
| 4331 | 4468 | x87_reset(cpustate); |
| 4332 | 4469 | |
| r23884 | r23885 | |
| 4429 | 4566 | cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ |
| 4430 | 4567 | cpustate->eip = 0xfff0; |
| 4431 | 4568 | cpustate->mxcsr = 0x1f80; |
| 4569 | cpustate->smm = false; |
| 4570 | cpustate->smbase = 0x30000; |
| 4571 | cpustate->nmi_masked = false; |
| 4572 | cpustate->nmi_latched = false; |
| 4432 | 4573 | |
| 4433 | 4574 | x87_reset(cpustate); |
| 4434 | 4575 | |