Skip to content

Commit bb5195c

Browse files
committed
fix bugs
1 parent d6f8ec2 commit bb5195c

File tree

4 files changed

+87
-51
lines changed

4 files changed

+87
-51
lines changed

arch/i386/irpts.asm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,10 @@ exception_handler:
162162
push ds
163163
push es
164164
push fs
165+
push esp
165166
push eax ; push errcode
166-
lea eax, [esp+44]
167-
push eax ; push eip
167+
;lea eax, [esp+44]
168+
;push eax ; push eip
168169
mov eax, [kernel_data_selector]
169170
mov ds, ax
170171
mov es, ax

include/sys/irpts.h

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,31 @@
77
#define sti() __asm__ __volatile__ ("sti" ::)
88
#define nop() __asm__ __volatile__ ("nop" ::)
99

10-
void _do_divide0_error(struct irpt_regs* regs);
11-
void _do_debug(struct irpt_regs* regs);
12-
void _do_nmi(struct irpt_regs* regs);
13-
void _do_debug_break(struct irpt_regs* regs);
10+
struct irpt_regs
11+
{
12+
uint32_t fs, es, ds; /* 压入上一个段。 */
13+
uint32_t ebp, esi, edi, edx, ecx; /* 由push 压入*/
14+
uint32_t ebx, eax; /* 由exchange 压入*/
15+
uint32_t eip, cs, eflags, uesp, ss; /* 由处理器自动压入。 */
16+
};
17+
18+
void _do_divide0_error(uint32_t errcode, struct irpt_regs* regs);
19+
void _do_debug(uint32_t errcode, struct irpt_regs* regs);
20+
void _do_nmi(uint32_t errcode, struct irpt_regs* regs);
21+
void _do_debug_break(uint32_t errcode, struct irpt_regs* regs);
22+
void _do_overflow(uint32_t errcode, struct irpt_regs* regs);
23+
void _do_bounds_check(uint32_t errcode, struct irpt_regs* regs);
24+
void _do_invalid_op(uint32_t errcode, struct irpt_regs* regs);
25+
void _do_device_fail(uint32_t errcode, struct irpt_regs* regs);
26+
void _do_double_fault(uint32_t errcode, struct irpt_regs* regs);
27+
void _do_cop_segment(uint32_t errcode, struct irpt_regs* regs);
28+
void _do_tss_inval(uint32_t errcode, struct irpt_regs* regs);
29+
void _do_segment_unpresent(uint32_t errcode, struct irpt_regs* regs);
30+
void _do_stack_segment(uint32_t errcode, struct irpt_regs* regs);
31+
void _do_general_protection(uint32_t errcode, struct irpt_regs* regs);
32+
void _do_page_fault(uint32_t errcode, struct irpt_regs* regs);
33+
void _do_reserved(uint32_t errcode, struct irpt_regs* regs);
34+
void _do_cop_error(uint32_t errcode, struct irpt_regs* regs);
1435

1536
void setup_irqts();
1637
#endif

include/sys/system.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,3 @@
2525
*/
2626

2727
#include <sys/types.h>
28-
struct irpt_regs
29-
{
30-
uint32_t err_code; /* push */
31-
uint32_t fs, es, ds; /* 压入上一个段。 */
32-
uint32_t ebp, esi, edi, edx, ecx; /* 由push 压入*/
33-
uint32_t ebx, eax; /* 由exchange 压入*/
34-
uint32_t eip, cs, eflags, uesp, ss; /* 由处理器自动压入。 */
35-
};

src/irpts.c

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,78 +27,80 @@
2727
#include <sys/protect.h>
2828
#include <sys/irpts.h>
2929

30-
static void FATAL(const char* str, struct irpt_regs* regs) {
30+
static void FATAL(const char* str, uint32_t errcode, struct irpt_regs* regs) {
31+
printk("current:%x\n", regs);
3132
printk("EIP: %x:%x\nEFLAGS: %x\nESP: %x:%x\n",
3233
regs->cs, regs->eip, regs->eflags, regs->es, regs->uesp);
34+
printk("ES:%x\n", regs->es);
3335
for (;;) ;
3436
}
3537

36-
void _do_divide0_error(struct irpt_regs* regs) {
37-
FATAL("int0: divide 0 error", regs);
38+
void _do_divide0_error(uint32_t errcode, struct irpt_regs* regs) {
39+
FATAL("int0: divide 0 error", errcode, regs);
3840
}
3941

40-
void _do_debug(struct irpt_regs* regs) {
41-
FATAL("int1: debug", regs);
42+
void _do_debug(uint32_t errcode, struct irpt_regs* regs) {
43+
FATAL("int1: debug", errcode, regs);
4244
}
4345

44-
void _do_nmi(struct irpt_regs* regs) {
45-
FATAL("int2: nmi", regs);
46+
void _do_nmi(uint32_t errcode, struct irpt_regs* regs) {
47+
FATAL("int2: nmi", errcode, regs);
4648
}
4749

48-
void _do_debug_break(struct irpt_regs* regs) {
49-
FATAL("int3: break", regs);
50+
void _do_debug_break(uint32_t errcode, struct irpt_regs* regs) {
51+
FATAL("int3: break", errcode, regs);
5052
}
5153

52-
void _do_overflow(struct irpt_regs* regs) {
53-
FATAL("int4: overflow", regs);
54+
void _do_overflow(uint32_t errcode, struct irpt_regs* regs) {
55+
FATAL("int4: overflow", errcode, regs);
5456
}
5557

56-
void _do_bounds_check(struct irpt_regs* regs) {
57-
FATAL("int5: bounds_check", regs);
58+
void _do_bounds_check(uint32_t errcode, struct irpt_regs* regs) {
59+
FATAL("int5: bounds_check", errcode, regs);
5860
}
5961

60-
void _do_invalid_op(struct irpt_regs* regs) {
61-
FATAL("int6: invalid op", regs);
62+
void _do_invalid_op(uint32_t errcode, struct irpt_regs* regs) {
63+
FATAL("int6: invalid op", errcode, regs);
6264
}
6365

64-
void _do_device_fail(struct irpt_regs* regs) {
65-
FATAL("int7: device fail", regs);
66+
void _do_device_fail(uint32_t errcode, struct irpt_regs* regs) {
67+
FATAL("int7: device fail", errcode, regs);
6668
}
6769

68-
void _do_double_fault(struct irpt_regs* regs) {
69-
FATAL("int8: double fault", regs);
70+
void _do_double_fault(uint32_t errcode, struct irpt_regs* regs) {
71+
FATAL("int8: double fault", errcode, regs);
7072
}
7173

72-
void _do_cop_segment(struct irpt_regs* regs) {
73-
FATAL("int9: coprocesser segment", regs);
74+
void _do_cop_segment(uint32_t errcode, struct irpt_regs* regs) {
75+
FATAL("int9: coprocesser segment", errcode, regs);
7476
}
7577

76-
void _do_tss_inval(struct irpt_regs* regs) {
77-
FATAL("int10: tss invalid", regs);
78+
void _do_tss_inval(uint32_t errcode, struct irpt_regs* regs) {
79+
FATAL("int10: tss invalid", errcode, regs);
7880
}
7981

80-
void _do_segment_unpresent(struct irpt_regs* regs) {
81-
FATAL("int11: segment unpresent", regs);
82+
void _do_segment_unpresent(uint32_t errcode, struct irpt_regs* regs) {
83+
FATAL("int11: segment unpresent", errcode, regs);
8284
}
8385

84-
void _do_stack_segment(struct irpt_regs* regs) {
85-
FATAL("int12: stack segment unpresent or overflow", regs);
86+
void _do_stack_segment(uint32_t errcode, struct irpt_regs* regs) {
87+
FATAL("int12: stack segment unpresent or overflow", errcode, regs);
8688
}
8789

88-
void _do_general_protection(struct irpt_regs* regs) {
89-
FATAL("int13: general protection", regs);
90+
void _do_general_protection(uint32_t errcode, struct irpt_regs* regs) {
91+
FATAL("int13: general protection", errcode, regs);
9092
}
9193

92-
void _do_page_fault(struct irpt_regs* regs) {
93-
FATAL("int14: page fault", regs);
94+
void _do_page_fault(uint32_t errcode, struct irpt_regs* regs) {
95+
FATAL("int14: page fault", errcode, regs);
9496
}
9597

96-
void _do_reserved(struct irpt_regs* regs) {
97-
FATAL("int15: reserved", regs);
98+
void _do_reserved(uint32_t errcode, struct irpt_regs* regs) {
99+
FATAL("int15: reserved", errcode, regs);
98100
}
99101

100-
void _do_cop_error(struct irpt_regs* regs) {
101-
FATAL("int16: coprocesser error", regs);
102+
void _do_cop_error(uint32_t errcode, struct irpt_regs* regs) {
103+
FATAL("int16: coprocesser error", errcode, regs);
102104
}
103105

104106

@@ -120,8 +122,25 @@ static void set_idt(uint32_t idx, uint32_t base, uint16_t selector, uint8_t flag
120122
}
121123

122124
extern const uint16_t kernel_code_selector;
123-
void divide0_error();
124-
void general_protection();
125+
126+
extern void divide0_error();
127+
extern void debug();
128+
extern void nmi();
129+
extern void debug_break();
130+
extern void overflow();
131+
extern void bounds_check();
132+
extern void invalid_op();
133+
extern void device_fail();
134+
extern void double_fault();
135+
extern void cop_segment();
136+
extern void tss_inval();
137+
extern void segment_unpresent();
138+
extern void stack_segment();
139+
extern void general_protection();
140+
extern void page_fault();
141+
extern void reserved();
142+
extern void cop_error();
143+
extern void exception_handler();
125144

126145
void setup_idt() {
127146
memset(&idts, 0, sizeof(idts));
@@ -130,6 +149,9 @@ void setup_idt() {
130149
idtptr.limit = sizeof(idts) - 1;
131150

132151
set_idt(0, (uint32_t) &divide0_error, kernel_code_selector, IDT_DPL0 | IDT_TRAP);
152+
set_idt(1, (uint32_t) &debug, kernel_code_selector, IDT_DPL0 | IDT_TRAP);
153+
set_idt(2, (uint32_t) &nmi, kernel_code_selector, IDT_DPL0 | IDT_TRAP);
154+
set_idt(3, (uint32_t) &debug_break, kernel_code_selector, IDT_DPL0 | IDT_TRAP);
133155
set_idt(13, (uint32_t) &general_protection, kernel_code_selector, IDT_DPL0 | IDT_IRPT);
134156

135157
idt_load();

0 commit comments

Comments
 (0)