Clean up interrupt handling.
[pintos-anon] / src / threads / intr-stubs.pl
1 #! /usr/bin/perl
2
3 print <<'EOF';
4 #include "mmu.h"
5
6         .globl intr_stubs
7 intr_stubs:
8 EOF
9
10 for $i (0...255) {
11     $x = sprintf ("%02x", $i);
12     print "\t.long intr${x}_stub\n";
13 }
14 print "\n";
15
16 for $i (0...255) {
17     $x = sprintf ("%02x", $i);
18     print "\t.globl intr${x}_stub\n";
19     print "intr${x}_stub:\n";
20     print "\tpushl \$0\n"
21         if ($i != 8 && $i != 10 && $i != 11
22             && $i != 13 && $i != 14 && $i != 17);
23     print "\tpushl \$0x$x\n";
24     print "\tjmp intr_entry\n";
25 }
26
27 print <<'EOF';
28 intr_entry:
29         # FIXME: build a fake stack frame to improve backtraces.
30         # Save caller's registers.
31         pushl %ds
32         pushl %es
33         pushal
34
35         # Set up kernel environment.
36         cld
37         movl $SEL_KDSEG, %eax
38         movl %eax, %ds
39         movl %eax, %es
40
41         # Call handler.
42         pushl %esp
43         .globl intr_handler
44         call intr_handler
45
46         .globl intr_exit
47 intr_exit:
48         addl $4, %esp
49
50         # Restore caller's registers.
51         popal
52         popl %es
53         popl %ds
54         addl $8, %esp
55         iret
56 EOF