Skip to content

Commit eeb81cd

Browse files
committed
i386: throw faults from i386_trap so double and triple faults can be handled properly
1 parent 6f5e8ff commit eeb81cd

File tree

10 files changed

+75
-75
lines changed

10 files changed

+75
-75
lines changed

src/devices/cpu/i386/i386.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,7 +1543,7 @@ void i386_device::i386_check_irq_line()
15431543
if ( (m_irq_state) && m_IF )
15441544
{
15451545
m_cycles -= 2;
1546-
i386_trap(standard_irq_callback(0, m_pc), 1, 0);
1546+
i386_trap(standard_irq_callback(0, m_pc), 1);
15471547
}
15481548
}
15491549

@@ -1592,7 +1592,7 @@ void i386_device::report_invalid_modrm(const char* opcode, uint8_t modrm)
15921592
for (uint32_t i = 1; i < 16; i++)
15931593
logerror(" %08X\n", m_opcode_addrs[(m_opcode_addrs_index - i) & 15]);
15941594
#endif
1595-
i386_trap(6, 0, 0);
1595+
i386_trap(6, 0);
15961596
}
15971597

15981598

@@ -2724,7 +2724,7 @@ void i386_device::execute_set_input(int irqline, int state)
27242724
return;
27252725
}
27262726
if ( state )
2727-
i386_trap(2, 1, 0);
2727+
i386_trap(2, 1);
27282728
}
27292729
else
27302730
{
@@ -2810,7 +2810,7 @@ void i386_device::execute_run()
28102810
{
28112811
// The processor never automatically clears bits in DR6. It only sets them.
28122812
m_dr[6] |= 1 << i;
2813-
i386_trap(1,0,0);
2813+
i386_trap(1,0);
28142814
break;
28152815
}
28162816
}
@@ -2850,7 +2850,7 @@ void i386_device::execute_run()
28502850
m_prev_eip = m_eip;
28512851
m_ext = 1;
28522852
m_dr[6] |= (1 << 14); //Set BS bit of DR6.
2853-
i386_trap(1,0,0);
2853+
i386_trap(1,0);
28542854
}
28552855
if(m_lock && (m_opcode != 0xf0))
28562856
m_lock = false;

src/devices/cpu/i386/i386.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ class i386_device : public cpu_device, public device_vtlb_interface, public i386
514514
void i386_check_sreg_validity(int reg);
515515
int i386_limit_check(int seg, uint32_t offset, int size = 1);
516516
void i386_sreg_load(uint16_t selector, uint8_t reg, bool *fault);
517-
void i386_trap(int irq, int irq_gate, int trap_level);
517+
void i386_trap(int irq, int irq_gate);
518518
void i386_trap_with_error(int irq, int irq_gate, int trap_level, uint32_t error);
519519
void i286_task_switch(uint16_t selector, uint8_t nested);
520520
void i386_task_switch(uint16_t selector, uint8_t nested);

src/devices/cpu/i386/i386op16.hxx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2944,7 +2944,7 @@ void i386_device::i386_groupF7_16() // Opcode 0xf7
29442944
m_CF = 1;
29452945
}
29462946
} else {
2947-
i386_trap(0, 0, 0);
2947+
i386_trap(0, 0);
29482948
}
29492949
}
29502950
break;
@@ -2976,7 +2976,7 @@ void i386_device::i386_groupF7_16() // Opcode 0xf7
29762976
m_CF = 1;
29772977
}
29782978
} else {
2979-
i386_trap(0, 0, 0);
2979+
i386_trap(0, 0);
29802980
}
29812981
}
29822982
break;
@@ -3150,7 +3150,7 @@ void i386_device::i386_group0F00_16() // Opcode 0x0f 00
31503150
}
31513151
else
31523152
{
3153-
i386_trap(6, 0, 0);
3153+
i386_trap(6, 0);
31543154
}
31553155
break;
31563156
case 1: /* STR */
@@ -3167,7 +3167,7 @@ void i386_device::i386_group0F00_16() // Opcode 0x0f 00
31673167
}
31683168
else
31693169
{
3170-
i386_trap(6, 0, 0);
3170+
i386_trap(6, 0);
31713171
}
31723172
break;
31733173
case 2: /* LLDT */
@@ -3193,7 +3193,7 @@ void i386_device::i386_group0F00_16() // Opcode 0x0f 00
31933193
}
31943194
else
31953195
{
3196-
i386_trap(6, 0, 0);
3196+
i386_trap(6, 0);
31973197
}
31983198
break;
31993199

@@ -3225,7 +3225,7 @@ void i386_device::i386_group0F00_16() // Opcode 0x0f 00
32253225
}
32263226
else
32273227
{
3228-
i386_trap(6, 0, 0);
3228+
i386_trap(6, 0);
32293229
}
32303230
break;
32313231

@@ -3276,7 +3276,7 @@ void i386_device::i386_group0F00_16() // Opcode 0x0f 00
32763276
}
32773277
else
32783278
{
3279-
i386_trap(6, 0, 0);
3279+
i386_trap(6, 0);
32803280
LOGMASKED(LOG_PM_EVENTS, "i386: VERR: Exception - Running in real mode or virtual 8086 mode.\n");
32813281
}
32823282
break;
@@ -3318,7 +3318,7 @@ void i386_device::i386_group0F00_16() // Opcode 0x0f 00
33183318
}
33193319
else
33203320
{
3321-
i386_trap(6, 0, 0);
3321+
i386_trap(6, 0);
33223322
LOGMASKED(LOG_PM_EVENTS, "i386: VERW: Exception - Running in real mode or virtual 8086 mode.\n");
33233323
}
33243324
break;
@@ -3615,7 +3615,7 @@ void i386_device::i386_lar_r16_rm16() // Opcode 0x0f 0x02
36153615
else
36163616
{
36173617
// illegal opcode
3618-
i386_trap(6,0, 0);
3618+
i386_trap(6,0);
36193619
LOGMASKED(LOG_PM_EVENTS, "i386: LAR: Exception - running in real mode or virtual 8086 mode.\n");
36203620
}
36213621
}
@@ -3680,7 +3680,7 @@ void i386_device::i386_lsl_r16_rm16() // Opcode 0x0f 0x03
36803680
}
36813681
}
36823682
else
3683-
i386_trap(6, 0, 0);
3683+
i386_trap(6, 0);
36843684
}
36853685

36863686
void i386_device::i386_bound_r16_m16_m16() // Opcode 0x62
@@ -3705,7 +3705,7 @@ void i386_device::i386_bound_r16_m16_m16() // Opcode 0x62
37053705
if ((val < low) || (val > high))
37063706
{
37073707
CYCLES(CYCLES_BOUND_OUT_RANGE);
3708-
i386_trap(5, 0, 0);
3708+
i386_trap(5, 0);
37093709
}
37103710
else
37113711
{
@@ -3758,7 +3758,7 @@ bool i386_device::i386_load_far_pointer16(int s)
37583758

37593759
if( modrm >= 0xc0 ) {
37603760
//LOGMASKED(LOG_PM_EVENTS, "i386: load_far_pointer16 NYI\n"); // don't log, NT will use this a lot
3761-
i386_trap(6, 0, 0);
3761+
i386_trap(6, 0);
37623762
return false;
37633763
} else {
37643764
uint32_t ea = GetEA(modrm,0);

src/devices/cpu/i386/i386op32.hxx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2748,7 +2748,7 @@ void i386_device::i386_groupF7_32() // Opcode 0xf7
27482748
REG32(EAX) = (uint32_t)result;
27492749
}
27502750
} else {
2751-
i386_trap(0, 0, 0);
2751+
i386_trap(0, 0);
27522752
}
27532753
}
27542754
break;
@@ -2776,7 +2776,7 @@ void i386_device::i386_groupF7_32() // Opcode 0xf7
27762776
REG32(EAX) = (uint32_t)result;
27772777
}
27782778
} else {
2779-
i386_trap(0, 0, 0);
2779+
i386_trap(0, 0);
27802780
}
27812781
}
27822782
break;
@@ -2952,7 +2952,7 @@ void i386_device::i386_group0F00_32() // Opcode 0x0f 00
29522952
}
29532953
else
29542954
{
2955-
i386_trap(6, 0, 0);
2955+
i386_trap(6, 0);
29562956
}
29572957
break;
29582958
case 1: /* STR */
@@ -2969,7 +2969,7 @@ void i386_device::i386_group0F00_32() // Opcode 0x0f 00
29692969
}
29702970
else
29712971
{
2972-
i386_trap(6, 0, 0);
2972+
i386_trap(6, 0);
29732973
}
29742974
break;
29752975
case 2: /* LLDT */
@@ -2995,7 +2995,7 @@ void i386_device::i386_group0F00_32() // Opcode 0x0f 00
29952995
}
29962996
else
29972997
{
2998-
i386_trap(6, 0, 0);
2998+
i386_trap(6, 0);
29992999
}
30003000
break;
30013001

@@ -3027,7 +3027,7 @@ void i386_device::i386_group0F00_32() // Opcode 0x0f 00
30273027
}
30283028
else
30293029
{
3030-
i386_trap(6, 0, 0);
3030+
i386_trap(6, 0);
30313031
}
30323032
break;
30333033

@@ -3077,7 +3077,7 @@ void i386_device::i386_group0F00_32() // Opcode 0x0f 00
30773077
}
30783078
else
30793079
{
3080-
i386_trap(6, 0, 0);
3080+
i386_trap(6, 0);
30813081
LOGMASKED(LOG_PM_EVENTS, "i386: VERR: Exception - Running in real mode or virtual 8086 mode.\n");
30823082
}
30833083
break;
@@ -3118,7 +3118,7 @@ void i386_device::i386_group0F00_32() // Opcode 0x0f 00
31183118
}
31193119
else
31203120
{
3121-
i386_trap(6, 0, 0);
3121+
i386_trap(6, 0);
31223122
LOGMASKED(LOG_PM_EVENTS, "i386: VERW: Exception - Running in real mode or virtual 8086 mode.\n");
31233123
}
31243124
break;
@@ -3416,7 +3416,7 @@ void i386_device::i386_lar_r32_rm32() // Opcode 0x0f 0x02
34163416
else
34173417
{
34183418
// illegal opcode
3419-
i386_trap(6,0, 0);
3419+
i386_trap(6,0);
34203420
LOGMASKED(LOG_PM_EVENTS, "i386: LAR: Exception - running in real mode or virtual 8086 mode.\n");
34213421
}
34223422
}
@@ -3481,7 +3481,7 @@ void i386_device::i386_lsl_r32_rm32() // Opcode 0x0f 0x03
34813481
}
34823482
}
34833483
else
3484-
i386_trap(6, 0, 0);
3484+
i386_trap(6, 0);
34853485
}
34863486

34873487
void i386_device::i386_bound_r32_m32_m32() // Opcode 0x62
@@ -3506,7 +3506,7 @@ void i386_device::i386_bound_r32_m32_m32() // Opcode 0x62
35063506
if ((val < low) || (val > high))
35073507
{
35083508
CYCLES(CYCLES_BOUND_OUT_RANGE);
3509-
i386_trap(5, 0, 0);
3509+
i386_trap(5, 0);
35103510
}
35113511
else
35123512
{

src/devices/cpu/i386/i386ops.hxx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ void i386_device::i386_arpl() // Opcode 0x63
990990
SetZF(flag);
991991
}
992992
else
993-
i386_trap(6, 0, 0); // invalid opcode in real mode or v8086 mode
993+
i386_trap(6, 0); // invalid opcode in real mode or v8086 mode
994994
}
995995

996996
void i386_device::i386_push_i8() // Opcode 0x6a
@@ -2156,7 +2156,7 @@ void i386_device::i386_groupF6_8() // Opcode 0xf6
21562156
m_CF = 1;
21572157
}
21582158
} else {
2159-
i386_trap(0, 0, 0);
2159+
i386_trap(0, 0);
21602160
}
21612161
}
21622162
break;
@@ -2188,7 +2188,7 @@ void i386_device::i386_groupF6_8() // Opcode 0xf6
21882188
m_CF = 1;
21892189
}
21902190
} else {
2191-
i386_trap(0, 0, 0);
2191+
i386_trap(0, 0);
21922192
}
21932193
}
21942194
break;
@@ -2341,7 +2341,7 @@ void i386_device::i386_int3() // Opcode 0xcc
23412341
{
23422342
CYCLES(CYCLES_INT3);
23432343
m_ext = 0; // not an external interrupt
2344-
i386_trap(3, 1, 0);
2344+
i386_trap(3, 1);
23452345
m_ext = 1;
23462346
}
23472347

@@ -2350,15 +2350,15 @@ void i386_device::i386_int() // Opcode 0xcd
23502350
int interrupt = FETCH();
23512351
CYCLES(CYCLES_INT);
23522352
m_ext = 0; // not an external interrupt
2353-
i386_trap(interrupt, 1, 0);
2353+
i386_trap(interrupt, 1);
23542354
m_ext = 1;
23552355
}
23562356

23572357
void i386_device::i386_into() // Opcode 0xce
23582358
{
23592359
if( m_OF ) {
23602360
m_ext = 0;
2361-
i386_trap(4, 1, 0);
2361+
i386_trap(4, 1);
23622362
m_ext = 1;
23632363
CYCLES(CYCLES_INTO_OF1);
23642364
}
@@ -2479,7 +2479,7 @@ void i386_device::i386_aam() // Opcode 0xd4
24792479

24802480
if(!i)
24812481
{
2482-
i386_trap(0, 0, 0);
2482+
i386_trap(0, 0);
24832483
return;
24842484
}
24852485
REG8(AH) = tempAL / i;
@@ -2501,7 +2501,7 @@ void i386_device::i386_wait() // Opcode 0x9B
25012501
{
25022502
if ((m_cr[0] & (CR0_TS | CR0_MP)) == (CR0_TS | CR0_MP))
25032503
{
2504-
i386_trap(FAULT_NM, 0, 0);
2504+
i386_trap(FAULT_NM, 0);
25052505
return;
25062506
}
25072507
// TODO
@@ -2597,7 +2597,7 @@ void i386_device::i386_loadall() // Opcode 0x0f 0x07 (0x0f 0x05 on 80286),
25972597
void i386_device::i386_invalid()
25982598
{
25992599
report_invalid_opcode();
2600-
i386_trap(6, 0, 0);
2600+
i386_trap(6, 0);
26012601
}
26022602

26032603
void i386_device::i386_xlat() // Opcode 0xd7

src/devices/cpu/i386/i386priv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ extern int i386_parity_table[256];
331331
#define CYCLES_NUM(x) (m_cycles -= (x))
332332

333333
#define FAULT(fault,error) {m_ext = 1; i386_trap_with_error(fault,0,0,error); return;}
334-
#define FAULT_EXP(fault,error) {m_ext = 1; i386_trap_with_error(fault,0,trap_level+1,error); return;}
334+
#define FAULT_EXP(fault,error) {m_ext = 1; FAULT_THROW(fault, (error)); return;}
335335

336336
/***********************************************************************************/
337337

src/devices/cpu/i386/i386segs.hxx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void i386_device::i386_sreg_load(uint16_t selector, uint8_t reg, bool *fault)
372372
if(fault) *fault = false;
373373
}
374374

375-
void i386_device::i386_trap(int irq, int irq_gate, int trap_level)
375+
void i386_device::i386_trap(int irq, int irq_gate)
376376
{
377377
/* I386 Interrupts/Traps/Faults:
378378
*
@@ -768,7 +768,7 @@ void i386_device::i386_trap_with_error(int irq, int irq_gate, int trap_level, ui
768768
{
769769
try
770770
{
771-
i386_trap(irq,irq_gate,trap_level);
771+
i386_trap(irq,irq_gate);
772772
if(irq == 8 || irq == 10 || irq == 11 || irq == 12 || irq == 13 || irq == 14)
773773
{
774774
// for these exceptions, an error code is pushed onto the stack by the processor.
@@ -2528,7 +2528,7 @@ inline void i386_device::dri_changed()
25282528
if(true_mask & mem_mask)
25292529
{
25302530
m_dr[6] |= 1 << dr;
2531-
i386_trap(1,1,0);
2531+
i386_trap(1,1);
25322532
}
25332533
},
25342534
&m_dr_breakpoints[dr]);
@@ -2544,15 +2544,15 @@ inline void i386_device::dri_changed()
25442544
if(true_mask & mem_mask)
25452545
{
25462546
m_dr[6] |= 1 << dr;
2547-
i386_trap(1,1,0);
2547+
i386_trap(1,1);
25482548
}
25492549
},
25502550
[this, dr, true_mask](offs_t offset, u32& data, u32 mem_mask)
25512551
{
25522552
if(true_mask & mem_mask)
25532553
{
25542554
m_dr[6] |= 1 << dr;
2555-
i386_trap(1,1,0);
2555+
i386_trap(1,1);
25562556
}
25572557
},
25582558
&m_dr_breakpoints[dr]);

0 commit comments

Comments
 (0)