1 #include "threads/loader.h"
5 /* Main interrupt entry point.
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,
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.
16 We "fall through" to intr_exit to return from the interrupt.
20 /* Save caller's registers. */
27 /* Set up kernel environment. */
28 cld /* String instructions go upward. */
29 mov $SEL_KDSEG, %eax /* Initialize segment registers. */
32 leal 56(%esp), %ebp /* Set up frame pointer. */
34 /* Call interrupt handler. */
43 Restores the caller's registers, discards extra data on the
44 stack, and returns to the caller.
46 This is a separate function because it is called directly when
47 we launch a new user process (see start_process() in
48 userprog/process.c). */
52 /* Restore caller's registers. */
59 /* Discard `struct intr_frame' vec_no, error_code,
60 frame_pointer members. */
63 /* Return to caller. */
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.
75 Most of the stubs do this:
77 1. Push %ebp on the stack (frame_pointer in `struct intr_frame').
79 2. Push 0 on the stack (error_code).
81 3. Push the interrupt number on the stack (vec_no).
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:
87 1. Push a duplicate copy of the error code on the stack.
89 2. Replace the original copy of the error code by %ebp.
91 3. Push the interrupt number on the stack. */
97 /* This implements steps 1 and 2, described above, in the common
98 case where we just push a 0 error code. */
103 /* This implements steps 1 and 2, described above, in the case
104 where the CPU already pushed an error code. */
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) \
114 .globl intr##NUMBER##_stub; \
115 .func intr##NUMBER##_stub; \
116 intr##NUMBER##_stub: \
123 .long intr##NUMBER##_stub;
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)