Use AT&T syntax instead of Intel.
[pintos-anon] / src / threads / intr-stubs.S
1 #include "threads/loader.h"
2
3         .text
4
5 /* Main interrupt entry point.
6
7    An internal or external interrupt starts in one of the
8    intrNN_stub routines, which push the `struct intr_frame'
9    frame_pointer, error_code, and vec_no members on the stack,
10    then jump here.
11
12    We save the rest of the `struct intr_frame' members to the
13    stack, set up some registers as needed by the kernel, and then
14    call intr_handler(), which actually handles the interrupt.
15
16    We "fall through" to intr_exit to return from the interrupt.
17 */
18 .func intr_entry
19 intr_entry:
20         /* Save caller's registers. */
21         pushl %ds
22         pushl %es
23         pushl %fs
24         pushl %gs
25         pushal
26         
27         /* Set up kernel environment. */
28         cld                     /* String instructions go upward. */
29         mov $SEL_KDSEG, %eax    /* Initialize segment registers. */
30         mov %eax, %ds
31         mov %eax, %es
32         leal 56(%esp), %ebp     /* Set up frame pointer. */
33
34         /* Call interrupt handler. */
35         pushl %esp
36 .globl intr_handler
37         call intr_handler
38         addl $4, %esp
39 .endfunc
40
41 /* Interrupt exit.
42
43    Restores the caller's registers, discards extra data on the
44    stack, and returns to the caller.
45
46    This is a separate function because it is called directly when
47    we launch a new user process (see execute_thread() in
48    userprog/process.c). */
49 .globl intr_exit
50 .func intr_exit
51 intr_exit:
52         /* Restore caller's registers. */
53         popal
54         popl %gs
55         popl %fs
56         popl %es
57         popl %ds
58
59         /* Discard `struct intr_frame' vec_no, error_code,
60            frame_pointer members. */
61         addl $12, %esp
62
63         /* Return to caller. */
64         iret
65 .endfunc
66
67 /* Interrupt stubs.
68
69    This defines 256 fragments of code, named `intr00_stub'
70    through `intrff_stub', each of which is used as the entry
71    point for the corresponding interrupt vector.  It also puts
72    the address of each of these functions in the correct spot in
73    `intr_stubs', an array of function pointers.
74
75    Most of the stubs do this:
76
77         1. Push EBP on the stack (frame_pointer in `struct intr_frame').
78
79         2. Push 0 on the stack (error_code).
80
81         3. Push the interrupt number on the stack (vec_no).
82
83    The CPU pushes an extra "error code" on the stack for a few
84    interrupts.  Because we want EBP to be where the error code
85    is, we follow a different path:
86
87         1. Push a duplicate copy of the error code on the stack.
88
89         2. Replace the original copy of the error code by EBP.
90
91         3. Push the interrupt number on the stack. */
92
93         .data
94 .globl intr_stubs
95 intr_stubs:
96
97 /* This implements steps 1 and 2, described above, in the common
98    case where we just push a 0 error code. */
99 #define zero                                    \
100         pushl %ebp;                               \
101         pushl $0
102
103 /* This implements steps 1 and 2, described above, in the case
104    where the CPU already pushed an error code. */
105 #define REAL                                    \
106         pushl (%esp);                   \
107         movl %ebp, 4(%esp)
108
109 /* Emits a stub for interrupt vector NUMBER.
110    TYPE is `zero', for the case where we push a 0 error code,
111    or `REAL', if the CPU pushes an error code for us. */
112 #define STUB(NUMBER, TYPE)                      \
113         .text;                                  \
114 .globl intr##NUMBER##_stub;                     \
115 .func intr##NUMBER##_stub;                      \
116 intr##NUMBER##_stub:                            \
117         TYPE;                                   \
118         push $0x##NUMBER;                       \
119         jmp intr_entry;                         \
120 .endfunc;                                       \
121                                                 \
122         .data;                                  \
123         .long intr##NUMBER##_stub;
124
125 /* All the stubs. */
126 STUB(00, zero) STUB(01, zero) STUB(02, zero) STUB(03, zero)
127 STUB(04, zero) STUB(05, zero) STUB(06, zero) STUB(07, zero)
128 STUB(08, REAL) STUB(09, zero) STUB(0a, REAL) STUB(0b, REAL)
129 STUB(0c, zero) STUB(0d, REAL) STUB(0e, REAL) STUB(0f, zero)
130
131 STUB(10, zero) STUB(11, REAL) STUB(12, zero) STUB(13, zero)
132 STUB(14, zero) STUB(15, zero) STUB(16, zero) STUB(17, zero)
133 STUB(18, REAL) STUB(19, zero) STUB(1a, REAL) STUB(1b, REAL)
134 STUB(1c, zero) STUB(1d, REAL) STUB(1e, REAL) STUB(1f, zero)
135
136 STUB(20, zero) STUB(21, zero) STUB(22, zero) STUB(23, zero)
137 STUB(24, zero) STUB(25, zero) STUB(26, zero) STUB(27, zero)
138 STUB(28, zero) STUB(29, zero) STUB(2a, zero) STUB(2b, zero)
139 STUB(2c, zero) STUB(2d, zero) STUB(2e, zero) STUB(2f, zero)
140
141 STUB(30, zero) STUB(31, zero) STUB(32, zero) STUB(33, zero)
142 STUB(34, zero) STUB(35, zero) STUB(36, zero) STUB(37, zero)
143 STUB(38, zero) STUB(39, zero) STUB(3a, zero) STUB(3b, zero)
144 STUB(3c, zero) STUB(3d, zero) STUB(3e, zero) STUB(3f, zero)
145
146 STUB(40, zero) STUB(41, zero) STUB(42, zero) STUB(43, zero)
147 STUB(44, zero) STUB(45, zero) STUB(46, zero) STUB(47, zero)
148 STUB(48, zero) STUB(49, zero) STUB(4a, zero) STUB(4b, zero)
149 STUB(4c, zero) STUB(4d, zero) STUB(4e, zero) STUB(4f, zero)
150
151 STUB(50, zero) STUB(51, zero) STUB(52, zero) STUB(53, zero)
152 STUB(54, zero) STUB(55, zero) STUB(56, zero) STUB(57, zero)
153 STUB(58, zero) STUB(59, zero) STUB(5a, zero) STUB(5b, zero)
154 STUB(5c, zero) STUB(5d, zero) STUB(5e, zero) STUB(5f, zero)
155
156 STUB(60, zero) STUB(61, zero) STUB(62, zero) STUB(63, zero)
157 STUB(64, zero) STUB(65, zero) STUB(66, zero) STUB(67, zero)
158 STUB(68, zero) STUB(69, zero) STUB(6a, zero) STUB(6b, zero)
159 STUB(6c, zero) STUB(6d, zero) STUB(6e, zero) STUB(6f, zero)
160
161 STUB(70, zero) STUB(71, zero) STUB(72, zero) STUB(73, zero)
162 STUB(74, zero) STUB(75, zero) STUB(76, zero) STUB(77, zero)
163 STUB(78, zero) STUB(79, zero) STUB(7a, zero) STUB(7b, zero)
164 STUB(7c, zero) STUB(7d, zero) STUB(7e, zero) STUB(7f, zero)
165
166 STUB(80, zero) STUB(81, zero) STUB(82, zero) STUB(83, zero)
167 STUB(84, zero) STUB(85, zero) STUB(86, zero) STUB(87, zero)
168 STUB(88, zero) STUB(89, zero) STUB(8a, zero) STUB(8b, zero)
169 STUB(8c, zero) STUB(8d, zero) STUB(8e, zero) STUB(8f, zero)
170
171 STUB(90, zero) STUB(91, zero) STUB(92, zero) STUB(93, zero)
172 STUB(94, zero) STUB(95, zero) STUB(96, zero) STUB(97, zero)
173 STUB(98, zero) STUB(99, zero) STUB(9a, zero) STUB(9b, zero)
174 STUB(9c, zero) STUB(9d, zero) STUB(9e, zero) STUB(9f, zero)
175
176 STUB(a0, zero) STUB(a1, zero) STUB(a2, zero) STUB(a3, zero)
177 STUB(a4, zero) STUB(a5, zero) STUB(a6, zero) STUB(a7, zero)
178 STUB(a8, zero) STUB(a9, zero) STUB(aa, zero) STUB(ab, zero)
179 STUB(ac, zero) STUB(ad, zero) STUB(ae, zero) STUB(af, zero)
180
181 STUB(b0, zero) STUB(b1, zero) STUB(b2, zero) STUB(b3, zero)
182 STUB(b4, zero) STUB(b5, zero) STUB(b6, zero) STUB(b7, zero)
183 STUB(b8, zero) STUB(b9, zero) STUB(ba, zero) STUB(bb, zero)
184 STUB(bc, zero) STUB(bd, zero) STUB(be, zero) STUB(bf, zero)
185
186 STUB(c0, zero) STUB(c1, zero) STUB(c2, zero) STUB(c3, zero)
187 STUB(c4, zero) STUB(c5, zero) STUB(c6, zero) STUB(c7, zero)
188 STUB(c8, zero) STUB(c9, zero) STUB(ca, zero) STUB(cb, zero)
189 STUB(cc, zero) STUB(cd, zero) STUB(ce, zero) STUB(cf, zero)
190
191 STUB(d0, zero) STUB(d1, zero) STUB(d2, zero) STUB(d3, zero)
192 STUB(d4, zero) STUB(d5, zero) STUB(d6, zero) STUB(d7, zero)
193 STUB(d8, zero) STUB(d9, zero) STUB(da, zero) STUB(db, zero)
194 STUB(dc, zero) STUB(dd, zero) STUB(de, zero) STUB(df, zero)
195
196 STUB(e0, zero) STUB(e1, zero) STUB(e2, zero) STUB(e3, zero)
197 STUB(e4, zero) STUB(e5, zero) STUB(e6, zero) STUB(e7, zero)
198 STUB(e8, zero) STUB(e9, zero) STUB(ea, zero) STUB(eb, zero)
199 STUB(ec, zero) STUB(ed, zero) STUB(ee, zero) STUB(ef, zero)
200
201 STUB(f0, zero) STUB(f1, zero) STUB(f2, zero) STUB(f3, zero)
202 STUB(f4, zero) STUB(f5, zero) STUB(f6, zero) STUB(f7, zero)
203 STUB(f8, zero) STUB(f9, zero) STUB(fa, zero) STUB(fb, zero)
204 STUB(fc, zero) STUB(fd, zero) STUB(fe, zero) STUB(ff, zero)