diff --git a/.gitignore b/.gitignore index 168da4f..725e0d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build target -Cargo.lock \ No newline at end of file +Cargo.lock +/src/arch/x86_64/boot/vector.asm \ No newline at end of file diff --git a/build.rs b/build.rs index 293f4b8..763d733 100644 --- a/build.rs +++ b/build.rs @@ -1,9 +1,37 @@ extern crate cc; +use std::fs::File; +use std::io::{Write, Result}; + fn main() { cc::Build::new() .file("src/arch/x86_64/driver/apic/lapic.c") .file("src/arch/x86_64/driver/keyboard/keyboard.c") .flag("-mcmodel=large") .compile("cobj"); + gen_vector_asm().unwrap(); +} + +fn gen_vector_asm() -> Result<()> { + let mut f = File::create("src/arch/x86_64/boot/vector.asm").unwrap(); + + writeln!(f, "# generated by build.rs - do not edit")?; + writeln!(f, "section .text")?; + writeln!(f, "extern __alltraps")?; + for i in 0..256 { + writeln!(f, "vector{}:", i)?; + if !(i == 8 || (i >= 10 && i <= 14) || i == 17) { + writeln!(f, "\tpush 0")?; + } + writeln!(f, "\tpush {}", i)?; + writeln!(f, "\tjmp __alltraps")?; + } + + writeln!(f, "\nsection .rodata")?; + writeln!(f, "global __vectors")?; + writeln!(f, "__vectors:")?; + for i in 0..256 { + writeln!(f, "\tdq vector{}", i)?; + } + Ok(()) } \ No newline at end of file diff --git a/src/arch/x86_64/boot/trap.asm b/src/arch/x86_64/boot/trap.asm index 46e250a..2df266b 100644 --- a/src/arch/x86_64/boot/trap.asm +++ b/src/arch/x86_64/boot/trap.asm @@ -1,1327 +1,49 @@ -# handler section .text -vector0: - push 0 - push 0 - jmp __alltraps -vector1: - push 0 - push 1 - jmp __alltraps -vector2: - push 0 - push 2 - jmp __alltraps -vector3: - push 0 - push 3 - jmp __alltraps -vector4: - push 0 - push 4 - jmp __alltraps -vector5: - push 0 - push 5 - jmp __alltraps -vector6: - push 0 - push 6 - jmp __alltraps -vector7: - push 0 - push 7 - jmp __alltraps -vector8: - push 8 - jmp __alltraps -vector9: - push 9 - jmp __alltraps -vector10: - push 10 - jmp __alltraps -vector11: - push 11 - jmp __alltraps -vector12: - push 12 - jmp __alltraps -vector13: - push 13 - jmp __alltraps -vector14: - push 14 - jmp __alltraps -vector15: - push 0 - push 15 - jmp __alltraps -vector16: - push 0 - push 16 - jmp __alltraps -vector17: - push 17 - jmp __alltraps -vector18: - push 0 - push 18 - jmp __alltraps -vector19: - push 0 - push 19 - jmp __alltraps -vector20: - push 0 - push 20 - jmp __alltraps -vector21: - push 0 - push 21 - jmp __alltraps -vector22: - push 0 - push 22 - jmp __alltraps -vector23: - push 0 - push 23 - jmp __alltraps -vector24: - push 0 - push 24 - jmp __alltraps -vector25: - push 0 - push 25 - jmp __alltraps -vector26: - push 0 - push 26 - jmp __alltraps -vector27: - push 0 - push 27 - jmp __alltraps -vector28: - push 0 - push 28 - jmp __alltraps -vector29: - push 0 - push 29 - jmp __alltraps -vector30: - push 0 - push 30 - jmp __alltraps -vector31: - push 0 - push 31 - jmp __alltraps -vector32: - push 0 - push 32 - jmp __alltraps -vector33: - push 0 - push 33 - jmp __alltraps -vector34: - push 0 - push 34 - jmp __alltraps -vector35: - push 0 - push 35 - jmp __alltraps -vector36: - push 0 - push 36 - jmp __alltraps -vector37: - push 0 - push 37 - jmp __alltraps -vector38: - push 0 - push 38 - jmp __alltraps -vector39: - push 0 - push 39 - jmp __alltraps -vector40: - push 0 - push 40 - jmp __alltraps -vector41: - push 0 - push 41 - jmp __alltraps -vector42: - push 0 - push 42 - jmp __alltraps -vector43: - push 0 - push 43 - jmp __alltraps -vector44: - push 0 - push 44 - jmp __alltraps -vector45: - push 0 - push 45 - jmp __alltraps -vector46: - push 0 - push 46 - jmp __alltraps -vector47: - push 0 - push 47 - jmp __alltraps -vector48: - push 0 - push 48 - jmp __alltraps -vector49: - push 0 - push 49 - jmp __alltraps -vector50: - push 0 - push 50 - jmp __alltraps -vector51: - push 0 - push 51 - jmp __alltraps -vector52: - push 0 - push 52 - jmp __alltraps -vector53: - push 0 - push 53 - jmp __alltraps -vector54: - push 0 - push 54 - jmp __alltraps -vector55: - push 0 - push 55 - jmp __alltraps -vector56: - push 0 - push 56 - jmp __alltraps -vector57: - push 0 - push 57 - jmp __alltraps -vector58: - push 0 - push 58 - jmp __alltraps -vector59: - push 0 - push 59 - jmp __alltraps -vector60: - push 0 - push 60 - jmp __alltraps -vector61: - push 0 - push 61 - jmp __alltraps -vector62: - push 0 - push 62 - jmp __alltraps -vector63: - push 0 - push 63 - jmp __alltraps -vector64: - push 0 - push 64 - jmp __alltraps -vector65: - push 0 - push 65 - jmp __alltraps -vector66: - push 0 - push 66 - jmp __alltraps -vector67: - push 0 - push 67 - jmp __alltraps -vector68: - push 0 - push 68 - jmp __alltraps -vector69: - push 0 - push 69 - jmp __alltraps -vector70: - push 0 - push 70 - jmp __alltraps -vector71: - push 0 - push 71 - jmp __alltraps -vector72: - push 0 - push 72 - jmp __alltraps -vector73: - push 0 - push 73 - jmp __alltraps -vector74: - push 0 - push 74 - jmp __alltraps -vector75: - push 0 - push 75 - jmp __alltraps -vector76: - push 0 - push 76 - jmp __alltraps -vector77: - push 0 - push 77 - jmp __alltraps -vector78: - push 0 - push 78 - jmp __alltraps -vector79: - push 0 - push 79 - jmp __alltraps -vector80: - push 0 - push 80 - jmp __alltraps -vector81: - push 0 - push 81 - jmp __alltraps -vector82: - push 0 - push 82 - jmp __alltraps -vector83: - push 0 - push 83 - jmp __alltraps -vector84: - push 0 - push 84 - jmp __alltraps -vector85: - push 0 - push 85 - jmp __alltraps -vector86: - push 0 - push 86 - jmp __alltraps -vector87: - push 0 - push 87 - jmp __alltraps -vector88: - push 0 - push 88 - jmp __alltraps -vector89: - push 0 - push 89 - jmp __alltraps -vector90: - push 0 - push 90 - jmp __alltraps -vector91: - push 0 - push 91 - jmp __alltraps -vector92: - push 0 - push 92 - jmp __alltraps -vector93: - push 0 - push 93 - jmp __alltraps -vector94: - push 0 - push 94 - jmp __alltraps -vector95: - push 0 - push 95 - jmp __alltraps -vector96: - push 0 - push 96 - jmp __alltraps -vector97: - push 0 - push 97 - jmp __alltraps -vector98: - push 0 - push 98 - jmp __alltraps -vector99: - push 0 - push 99 - jmp __alltraps -vector100: - push 0 - push 100 - jmp __alltraps -vector101: - push 0 - push 101 - jmp __alltraps -vector102: - push 0 - push 102 - jmp __alltraps -vector103: - push 0 - push 103 - jmp __alltraps -vector104: - push 0 - push 104 - jmp __alltraps -vector105: - push 0 - push 105 - jmp __alltraps -vector106: - push 0 - push 106 - jmp __alltraps -vector107: - push 0 - push 107 - jmp __alltraps -vector108: - push 0 - push 108 - jmp __alltraps -vector109: - push 0 - push 109 - jmp __alltraps -vector110: - push 0 - push 110 - jmp __alltraps -vector111: - push 0 - push 111 - jmp __alltraps -vector112: - push 0 - push 112 - jmp __alltraps -vector113: - push 0 - push 113 - jmp __alltraps -vector114: - push 0 - push 114 - jmp __alltraps -vector115: - push 0 - push 115 - jmp __alltraps -vector116: - push 0 - push 116 - jmp __alltraps -vector117: - push 0 - push 117 - jmp __alltraps -vector118: - push 0 - push 118 - jmp __alltraps -vector119: - push 0 - push 119 - jmp __alltraps -vector120: - push 0 - push 120 - jmp __alltraps -vector121: - push 0 - push 121 - jmp __alltraps -vector122: - push 0 - push 122 - jmp __alltraps -vector123: - push 0 - push 123 - jmp __alltraps -vector124: - push 0 - push 124 - jmp __alltraps -vector125: - push 0 - push 125 - jmp __alltraps -vector126: - push 0 - push 126 - jmp __alltraps -vector127: - push 0 - push 127 - jmp __alltraps -vector128: - push 0 - push 128 - jmp __alltraps -vector129: - push 0 - push 129 - jmp __alltraps -vector130: - push 0 - push 130 - jmp __alltraps -vector131: - push 0 - push 131 - jmp __alltraps -vector132: - push 0 - push 132 - jmp __alltraps -vector133: - push 0 - push 133 - jmp __alltraps -vector134: - push 0 - push 134 - jmp __alltraps -vector135: - push 0 - push 135 - jmp __alltraps -vector136: - push 0 - push 136 - jmp __alltraps -vector137: - push 0 - push 137 - jmp __alltraps -vector138: - push 0 - push 138 - jmp __alltraps -vector139: - push 0 - push 139 - jmp __alltraps -vector140: - push 0 - push 140 - jmp __alltraps -vector141: - push 0 - push 141 - jmp __alltraps -vector142: - push 0 - push 142 - jmp __alltraps -vector143: - push 0 - push 143 - jmp __alltraps -vector144: - push 0 - push 144 - jmp __alltraps -vector145: - push 0 - push 145 - jmp __alltraps -vector146: - push 0 - push 146 - jmp __alltraps -vector147: - push 0 - push 147 - jmp __alltraps -vector148: - push 0 - push 148 - jmp __alltraps -vector149: - push 0 - push 149 - jmp __alltraps -vector150: - push 0 - push 150 - jmp __alltraps -vector151: - push 0 - push 151 - jmp __alltraps -vector152: - push 0 - push 152 - jmp __alltraps -vector153: - push 0 - push 153 - jmp __alltraps -vector154: - push 0 - push 154 - jmp __alltraps -vector155: - push 0 - push 155 - jmp __alltraps -vector156: - push 0 - push 156 - jmp __alltraps -vector157: - push 0 - push 157 - jmp __alltraps -vector158: - push 0 - push 158 - jmp __alltraps -vector159: - push 0 - push 159 - jmp __alltraps -vector160: - push 0 - push 160 - jmp __alltraps -vector161: - push 0 - push 161 - jmp __alltraps -vector162: - push 0 - push 162 - jmp __alltraps -vector163: - push 0 - push 163 - jmp __alltraps -vector164: - push 0 - push 164 - jmp __alltraps -vector165: - push 0 - push 165 - jmp __alltraps -vector166: - push 0 - push 166 - jmp __alltraps -vector167: - push 0 - push 167 - jmp __alltraps -vector168: - push 0 - push 168 - jmp __alltraps -vector169: - push 0 - push 169 - jmp __alltraps -vector170: - push 0 - push 170 - jmp __alltraps -vector171: - push 0 - push 171 - jmp __alltraps -vector172: - push 0 - push 172 - jmp __alltraps -vector173: - push 0 - push 173 - jmp __alltraps -vector174: - push 0 - push 174 - jmp __alltraps -vector175: - push 0 - push 175 - jmp __alltraps -vector176: - push 0 - push 176 - jmp __alltraps -vector177: - push 0 - push 177 - jmp __alltraps -vector178: - push 0 - push 178 - jmp __alltraps -vector179: - push 0 - push 179 - jmp __alltraps -vector180: - push 0 - push 180 - jmp __alltraps -vector181: - push 0 - push 181 - jmp __alltraps -vector182: - push 0 - push 182 - jmp __alltraps -vector183: - push 0 - push 183 - jmp __alltraps -vector184: - push 0 - push 184 - jmp __alltraps -vector185: - push 0 - push 185 - jmp __alltraps -vector186: - push 0 - push 186 - jmp __alltraps -vector187: - push 0 - push 187 - jmp __alltraps -vector188: - push 0 - push 188 - jmp __alltraps -vector189: - push 0 - push 189 - jmp __alltraps -vector190: - push 0 - push 190 - jmp __alltraps -vector191: - push 0 - push 191 - jmp __alltraps -vector192: - push 0 - push 192 - jmp __alltraps -vector193: - push 0 - push 193 - jmp __alltraps -vector194: - push 0 - push 194 - jmp __alltraps -vector195: - push 0 - push 195 - jmp __alltraps -vector196: - push 0 - push 196 - jmp __alltraps -vector197: - push 0 - push 197 - jmp __alltraps -vector198: - push 0 - push 198 - jmp __alltraps -vector199: - push 0 - push 199 - jmp __alltraps -vector200: - push 0 - push 200 - jmp __alltraps -vector201: - push 0 - push 201 - jmp __alltraps -vector202: - push 0 - push 202 - jmp __alltraps -vector203: - push 0 - push 203 - jmp __alltraps -vector204: - push 0 - push 204 - jmp __alltraps -vector205: - push 0 - push 205 - jmp __alltraps -vector206: - push 0 - push 206 - jmp __alltraps -vector207: - push 0 - push 207 - jmp __alltraps -vector208: - push 0 - push 208 - jmp __alltraps -vector209: - push 0 - push 209 - jmp __alltraps -vector210: - push 0 - push 210 - jmp __alltraps -vector211: - push 0 - push 211 - jmp __alltraps -vector212: - push 0 - push 212 - jmp __alltraps -vector213: - push 0 - push 213 - jmp __alltraps -vector214: - push 0 - push 214 - jmp __alltraps -vector215: - push 0 - push 215 - jmp __alltraps -vector216: - push 0 - push 216 - jmp __alltraps -vector217: - push 0 - push 217 - jmp __alltraps -vector218: - push 0 - push 218 - jmp __alltraps -vector219: - push 0 - push 219 - jmp __alltraps -vector220: - push 0 - push 220 - jmp __alltraps -vector221: - push 0 - push 221 - jmp __alltraps -vector222: - push 0 - push 222 - jmp __alltraps -vector223: - push 0 - push 223 - jmp __alltraps -vector224: - push 0 - push 224 - jmp __alltraps -vector225: - push 0 - push 225 - jmp __alltraps -vector226: - push 0 - push 226 - jmp __alltraps -vector227: - push 0 - push 227 - jmp __alltraps -vector228: - push 0 - push 228 - jmp __alltraps -vector229: - push 0 - push 229 - jmp __alltraps -vector230: - push 0 - push 230 - jmp __alltraps -vector231: - push 0 - push 231 - jmp __alltraps -vector232: - push 0 - push 232 - jmp __alltraps -vector233: - push 0 - push 233 - jmp __alltraps -vector234: - push 0 - push 234 - jmp __alltraps -vector235: - push 0 - push 235 - jmp __alltraps -vector236: - push 0 - push 236 - jmp __alltraps -vector237: - push 0 - push 237 - jmp __alltraps -vector238: - push 0 - push 238 - jmp __alltraps -vector239: - push 0 - push 239 - jmp __alltraps -vector240: - push 0 - push 240 - jmp __alltraps -vector241: - push 0 - push 241 - jmp __alltraps -vector242: - push 0 - push 242 - jmp __alltraps -vector243: - push 0 - push 243 - jmp __alltraps -vector244: - push 0 - push 244 - jmp __alltraps -vector245: - push 0 - push 245 - jmp __alltraps -vector246: - push 0 - push 246 - jmp __alltraps -vector247: - push 0 - push 247 - jmp __alltraps -vector248: - push 0 - push 248 - jmp __alltraps -vector249: - push 0 - push 249 - jmp __alltraps -vector250: - push 0 - push 250 - jmp __alltraps -vector251: - push 0 - push 251 - jmp __alltraps -vector252: - push 0 - push 252 - jmp __alltraps -vector253: - push 0 - push 253 - jmp __alltraps -vector254: - push 0 - push 254 - jmp __alltraps -vector255: - push 0 - push 255 - jmp __alltraps - +global __alltraps __alltraps: - push rax - push rcx - push rdx - push rdi - push rsi - push r8 - push r9 - push r10 - push r11 - - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - - mov rdi, rsp - - ; extern fn rust_trap(rsp) -> rsp - extern rust_trap - call rust_trap - - mov rsp, rax - - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - - pop r11 - pop r10 - pop r9 - pop r8 - pop rsi - pop rdi - pop rdx - pop rcx - pop rax - - ; pop trap_num, error_code - add rsp, 16 - - iretq - -# vector table -.rodata -global __vectors -__vectors: - dq vector0 - dq vector1 - dq vector2 - dq vector3 - dq vector4 - dq vector5 - dq vector6 - dq vector7 - dq vector8 - dq vector9 - dq vector10 - dq vector11 - dq vector12 - dq vector13 - dq vector14 - dq vector15 - dq vector16 - dq vector17 - dq vector18 - dq vector19 - dq vector20 - dq vector21 - dq vector22 - dq vector23 - dq vector24 - dq vector25 - dq vector26 - dq vector27 - dq vector28 - dq vector29 - dq vector30 - dq vector31 - dq vector32 - dq vector33 - dq vector34 - dq vector35 - dq vector36 - dq vector37 - dq vector38 - dq vector39 - dq vector40 - dq vector41 - dq vector42 - dq vector43 - dq vector44 - dq vector45 - dq vector46 - dq vector47 - dq vector48 - dq vector49 - dq vector50 - dq vector51 - dq vector52 - dq vector53 - dq vector54 - dq vector55 - dq vector56 - dq vector57 - dq vector58 - dq vector59 - dq vector60 - dq vector61 - dq vector62 - dq vector63 - dq vector64 - dq vector65 - dq vector66 - dq vector67 - dq vector68 - dq vector69 - dq vector70 - dq vector71 - dq vector72 - dq vector73 - dq vector74 - dq vector75 - dq vector76 - dq vector77 - dq vector78 - dq vector79 - dq vector80 - dq vector81 - dq vector82 - dq vector83 - dq vector84 - dq vector85 - dq vector86 - dq vector87 - dq vector88 - dq vector89 - dq vector90 - dq vector91 - dq vector92 - dq vector93 - dq vector94 - dq vector95 - dq vector96 - dq vector97 - dq vector98 - dq vector99 - dq vector100 - dq vector101 - dq vector102 - dq vector103 - dq vector104 - dq vector105 - dq vector106 - dq vector107 - dq vector108 - dq vector109 - dq vector110 - dq vector111 - dq vector112 - dq vector113 - dq vector114 - dq vector115 - dq vector116 - dq vector117 - dq vector118 - dq vector119 - dq vector120 - dq vector121 - dq vector122 - dq vector123 - dq vector124 - dq vector125 - dq vector126 - dq vector127 - dq vector128 - dq vector129 - dq vector130 - dq vector131 - dq vector132 - dq vector133 - dq vector134 - dq vector135 - dq vector136 - dq vector137 - dq vector138 - dq vector139 - dq vector140 - dq vector141 - dq vector142 - dq vector143 - dq vector144 - dq vector145 - dq vector146 - dq vector147 - dq vector148 - dq vector149 - dq vector150 - dq vector151 - dq vector152 - dq vector153 - dq vector154 - dq vector155 - dq vector156 - dq vector157 - dq vector158 - dq vector159 - dq vector160 - dq vector161 - dq vector162 - dq vector163 - dq vector164 - dq vector165 - dq vector166 - dq vector167 - dq vector168 - dq vector169 - dq vector170 - dq vector171 - dq vector172 - dq vector173 - dq vector174 - dq vector175 - dq vector176 - dq vector177 - dq vector178 - dq vector179 - dq vector180 - dq vector181 - dq vector182 - dq vector183 - dq vector184 - dq vector185 - dq vector186 - dq vector187 - dq vector188 - dq vector189 - dq vector190 - dq vector191 - dq vector192 - dq vector193 - dq vector194 - dq vector195 - dq vector196 - dq vector197 - dq vector198 - dq vector199 - dq vector200 - dq vector201 - dq vector202 - dq vector203 - dq vector204 - dq vector205 - dq vector206 - dq vector207 - dq vector208 - dq vector209 - dq vector210 - dq vector211 - dq vector212 - dq vector213 - dq vector214 - dq vector215 - dq vector216 - dq vector217 - dq vector218 - dq vector219 - dq vector220 - dq vector221 - dq vector222 - dq vector223 - dq vector224 - dq vector225 - dq vector226 - dq vector227 - dq vector228 - dq vector229 - dq vector230 - dq vector231 - dq vector232 - dq vector233 - dq vector234 - dq vector235 - dq vector236 - dq vector237 - dq vector238 - dq vector239 - dq vector240 - dq vector241 - dq vector242 - dq vector243 - dq vector244 - dq vector245 - dq vector246 - dq vector247 - dq vector248 - dq vector249 - dq vector250 - dq vector251 - dq vector252 - dq vector253 - dq vector254 - dq vector255 + push rax + push rcx + push rdx + push rdi + push rsi + push r8 + push r9 + push r10 + push r11 + + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + + mov rdi, rsp + + ; extern fn rust_trap(rsp) -> rsp + extern rust_trap + call rust_trap + + mov rsp, rax + + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + + pop r11 + pop r10 + pop r9 + pop r8 + pop rsi + pop rdi + pop rdx + pop rcx + pop rax + + ; pop trap_num, error_code + add rsp, 16 + + iretq \ No newline at end of file