]> git.proxmox.com Git - mirror_edk2.git/blob - DuetPkg/BootSector/efi64.S
IntelFrameworkModulePkg: Refine casting expression result to bigger size
[mirror_edk2.git] / DuetPkg / BootSector / efi64.S
1 #------------------------------------------------------------------------------
2 #*
3 #* Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4 #* This program and the accompanying materials
5 #* are licensed and made available under the terms and conditions of the BSD License
6 #* which accompanies this distribution. The full text of the license may be found at
7 #* http://opensource.org/licenses/bsd-license.php
8 #*
9 #* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 #* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 #*
12 #* efi64.asm
13 #*
14 #* Abstract:
15 #*
16 #------------------------------------------------------------------------------
17
18 ##############################################################################
19 # Now in 64-bit long mode.
20 ##############################################################################
21
22 .486:
23 .stack:
24 .code:
25 .org 0x21000
26
27 .global _start
28 _start:
29
30 .equ DEFAULT_HANDLER_SIZE, INT1 - INT0
31
32 .macro jmpCommonIdtEntry
33 # jmp commonIdtEntry - this must be hand coded to keep the assembler from
34 # using a 8 bit reletive jump when the entries are
35 # within 255 bytes of the common entry. This must
36 # be done to maintain the consistency of the size
37 # of entry points...
38 .byte 0xe9 # jmp 16 bit relative
39 .long commonIdtEntry - . - 4 # offset to jump to
40 .endm
41
42
43 Start:
44
45 movl $0x001fffe8,%esp # make final stack aligned
46
47 # set OSFXSR and OSXMMEXCPT because some code will use XMM register
48 .byte 0xf
49 .byte 0x20
50 .byte 0xe0
51 # mov rax, cr4
52 btsl $9,%eax
53 btsl $0xa,%eax
54 .byte 0xf
55 .byte 0x22
56 .byte 0xe0
57 # mov cr4, rax
58
59 call ClearScreen
60
61 # Populate IDT with meaningful offsets for exception handlers...
62 movl $Idtr, %eax
63 sidt (%eax) # get fword address of IDT
64
65
66 movl $Halt, %eax
67 movl %eax,%ebx # use bx to copy 15..0 to descriptors
68 shrl $16,%eax # use ax to copy 31..16 to descriptors
69 # 63..32 of descriptors is 0
70 movl $0x78,%ecx # 78h IDT entries to initialize with unique entry points (exceptions)
71 movl $(Idtr + 2), %esi
72 movl (%esi),%edi
73
74 LOOP_1: # loop through all IDT entries exception handlers and initialize to default handler
75 movw %bx, (%edi) # write bits 15..0 of offset
76 movw $0x38, 2(%edi) # SYS_CODE_SEL64 from GDT
77 movw $(0x0e00 | 0x8000), 4(%edi) # type = 386 interrupt gate, present
78 movw %ax, 6(%edi) # write bits 31..16 of offset
79 movl $0, 8(%edi) # write bits 31..16 of offset
80 addl $16, %edi # move up to next descriptor
81 addw $DEFAULT_HANDLER_SIZE, %bx # move to next entry point
82 loopl LOOP_1 # loop back through again until all descriptors are initialized
83
84 ## at this point edi contains the offset of the descriptor for INT 20
85 ## and bx contains the low 16 bits of the offset of the default handler
86 ## so initialize all the rest of the descriptors with these two values...
87 # mov ecx, 101 ; there are 100 descriptors left (INT 20 (14h) - INT 119 (77h)
88 #@@: ; loop through all IDT entries exception handlers and initialize to default handler
89 # mov word ptr [edi], bx ; write bits 15..0 of offset
90 # mov word ptr [edi+2], 38h ; SYS_CODE64_SEL from GDT
91 # mov word ptr [edi+4], 0e00h OR 8000h ; type = 386 interrupt gate, present
92 # mov word ptr [edi+6], ax ; write bits 31..16 of offset
93 # mov dword ptr [edi+8], 0 ; write bits 63..32 of offset
94 # add edi, 16 ; move up to next descriptor
95 # loop @b ; loop back through again until all descriptors are initialized
96
97
98 ## DUMP location of IDT and several of the descriptors
99 # mov ecx, 8
100 # mov eax, [offset Idtr + 2]
101 # mov eax, [eax]
102 # mov edi, 0b8000h
103 # call PrintQword
104 # mov esi, eax
105 # mov edi, 0b80a0h
106 # jmp OuterLoop
107
108 ##
109 ## just for fun, let's do a software interrupt to see if we correctly land in the exception handler...
110 # mov eax, 011111111h
111 # mov ebx, 022222222h
112 # mov ecx, 033333333h
113 # mov edx, 044444444h
114 # mov ebp, 055555555h
115 # mov esi, 066666666h
116 # mov edi, 077777777h
117 # push 011111111h
118 # push 022222222h
119 # push 033333333h
120 # int 119
121
122 movl $0x22000,%esi # esi = 22000
123 movl 0x14(%esi),%eax # eax = [22014]
124 addl %eax,%esi # esi = 22000 + [22014] = Base of EFILDR.C
125 movl 0x3c(%esi),%ebp # ebp = [22000 + [22014] + 3c] = NT Image Header for EFILDR.C
126 addl %esi,%ebp
127 movl 0x30(%ebp),%edi # edi = [[22000 + [22014] + 3c] + 2c] = ImageBase (63..32 is zero, ignore)
128 movl 0x28(%ebp),%eax # eax = [[22000 + [22014] + 3c] + 24] = EntryPoint
129 addl %edi,%eax # eax = ImageBase + EntryPoint
130 movl $EfiLdrOffset, %ebx
131 movl %eax, (%ebx) # Modify far jump instruction for correct entry point
132
133 movw 6(%ebp), %bx # bx = Number of sections
134 xorl %eax,%eax
135 movw 0x14(%ebp), %ax # ax = Optional Header Size
136 addl %eax,%ebp
137 addl $0x18,%ebp # ebp = Start of 1st Section
138
139 SectionLoop:
140 pushl %esi # Save Base of EFILDR.C
141 pushl %edi # Save ImageBase
142 addl 0x14(%ebp),%esi # esi = Base of EFILDR.C + PointerToRawData
143 addl 0x0c(%ebp),%edi # edi = ImageBase + VirtualAddress
144 movl 0x10(%ebp),%ecx # ecs = SizeOfRawData
145
146 cld
147 shrl $2,%ecx
148 rep
149 movsl
150
151 popl %edi # Restore ImageBase
152 popl %esi # Restore Base of EFILDR.C
153
154 addw $0x28,%bp # ebp = ebp + 028h = Pointer to next section record
155 .byte 0x66
156 .byte 0xff
157 .byte 0xcb
158 # dec bx
159 cmpw $0,%bx
160 jne SectionLoop
161
162 movl $Idtr, %edx # get size of IDT
163 movzxw (%edx), %eax
164 .byte 0xff
165 .byte 0xc0
166 # inc eax
167 addl 2(%edx), %eax # add to base of IDT to get location of memory map...
168 xorl %ecx,%ecx
169 movl %eax,%ecx # put argument to RCX
170
171 .byte 0x48
172 .byte 0xc7
173 .byte 0xc0
174 EfiLdrOffset:
175 .long 0x00401000 # Offset of EFILDR
176 # mov rax, 401000h
177 .byte 0x50
178 # push rax
179
180 # ret
181 .byte 0xc3
182
183 # db "**** DEFAULT IDT ENTRY ***",0
184 .p2align 1
185 Halt:
186 INT0:
187 pushl $0x0 # push error code place holder on the stack
188 pushl $0x0
189 jmpCommonIdtEntry
190 # db 0e9h ; jmp 16 bit reletive
191 # dd commonIdtEntry - $ - 4 ; offset to jump to
192
193 INT1:
194 pushl $0x0 # push error code place holder on the stack
195 pushl $0x1
196 jmpCommonIdtEntry
197
198 INT2:
199 pushl $0x0 # push error code place holder on the stack
200 pushl $0x2
201 jmpCommonIdtEntry
202
203 INT3:
204 pushl $0x0 # push error code place holder on the stack
205 pushl $0x3
206 jmpCommonIdtEntry
207
208 INT4:
209 pushl $0x0 # push error code place holder on the stack
210 pushl $0x4
211 jmpCommonIdtEntry
212
213 INT5:
214 pushl $0x0 # push error code place holder on the stack
215 pushl $0x5
216 jmpCommonIdtEntry
217
218 INT6:
219 pushl $0x0 # push error code place holder on the stack
220 pushl $0x6
221 jmpCommonIdtEntry
222
223 INT7:
224 pushl $0x0 # push error code place holder on the stack
225 pushl $0x7
226 jmpCommonIdtEntry
227
228 INT8:
229 # Double fault causes an error code to be pushed so no phony push necessary
230 nop
231 nop
232 pushl $0x8
233 jmpCommonIdtEntry
234
235 INT9:
236 pushl $0x0 # push error code place holder on the stack
237 pushl $0x9
238 jmpCommonIdtEntry
239
240 INT10:
241 # Invalid TSS causes an error code to be pushed so no phony push necessary
242 nop
243 nop
244 pushl $10
245 jmpCommonIdtEntry
246
247 INT11:
248 # Segment Not Present causes an error code to be pushed so no phony push necessary
249 nop
250 nop
251 pushl $11
252 jmpCommonIdtEntry
253
254 INT12:
255 # Stack fault causes an error code to be pushed so no phony push necessary
256 nop
257 nop
258 pushl $12
259 jmpCommonIdtEntry
260
261 INT13:
262 # GP fault causes an error code to be pushed so no phony push necessary
263 nop
264 nop
265 pushl $13
266 jmpCommonIdtEntry
267
268 INT14:
269 # Page fault causes an error code to be pushed so no phony push necessary
270 nop
271 nop
272 pushl $14
273 jmpCommonIdtEntry
274
275 INT15:
276 pushl $0x0 # push error code place holder on the stack
277 pushl $15
278 jmpCommonIdtEntry
279
280 INT16:
281 pushl $0x0 # push error code place holder on the stack
282 pushl $16
283 jmpCommonIdtEntry
284
285 INT17:
286 # Alignment check causes an error code to be pushed so no phony push necessary
287 nop
288 nop
289 pushl $17
290 jmpCommonIdtEntry
291
292 INT18:
293 pushl $0x0 # push error code place holder on the stack
294 pushl $18
295 jmpCommonIdtEntry
296
297 INT19:
298 pushl $0x0 # push error code place holder on the stack
299 pushl $19
300 jmpCommonIdtEntry
301
302 INTUnknown:
303 # The following segment repeats (0x78 - 20) times:
304 # No. 1
305 pushl $0x0 # push error code place holder on the stack
306 # push xxh ; push vector number
307 .byte 0x6a
308 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
309 jmpCommonIdtEntry
310 # No. 2
311 pushl $0x0 # push error code place holder on the stack
312 # push xxh ; push vector number
313 .byte 0x6a
314 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
315 jmpCommonIdtEntry
316 # No. 3
317 pushl $0x0 # push error code place holder on the stack
318 # push xxh ; push vector number
319 .byte 0x6a
320 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
321 jmpCommonIdtEntry
322 # No. 4
323 pushl $0x0 # push error code place holder on the stack
324 # push xxh ; push vector number
325 .byte 0x6a
326 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
327 jmpCommonIdtEntry
328 # No. 5
329 pushl $0x0 # push error code place holder on the stack
330 # push xxh ; push vector number
331 .byte 0x6a
332 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
333 jmpCommonIdtEntry
334 # No. 6
335 pushl $0x0 # push error code place holder on the stack
336 # push xxh ; push vector number
337 .byte 0x6a
338 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
339 jmpCommonIdtEntry
340 # No. 7
341 pushl $0x0 # push error code place holder on the stack
342 # push xxh ; push vector number
343 .byte 0x6a
344 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
345 jmpCommonIdtEntry
346 # No. 8
347 pushl $0x0 # push error code place holder on the stack
348 # push xxh ; push vector number
349 .byte 0x6a
350 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
351 jmpCommonIdtEntry
352 # No. 9
353 pushl $0x0 # push error code place holder on the stack
354 # push xxh ; push vector number
355 .byte 0x6a
356 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
357 jmpCommonIdtEntry
358 # No. 10
359 pushl $0x0 # push error code place holder on the stack
360 # push xxh ; push vector number
361 .byte 0x6a
362 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
363 jmpCommonIdtEntry
364 # No. 11
365 pushl $0x0 # push error code place holder on the stack
366 # push xxh ; push vector number
367 .byte 0x6a
368 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
369 jmpCommonIdtEntry
370 # No. 12
371 pushl $0x0 # push error code place holder on the stack
372 # push xxh ; push vector number
373 .byte 0x6a
374 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
375 jmpCommonIdtEntry
376 # No. 13
377 pushl $0x0 # push error code place holder on the stack
378 # push xxh ; push vector number
379 .byte 0x6a
380 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
381 jmpCommonIdtEntry
382 # No. 14
383 pushl $0x0 # push error code place holder on the stack
384 # push xxh ; push vector number
385 .byte 0x6a
386 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
387 jmpCommonIdtEntry
388 # No. 15
389 pushl $0x0 # push error code place holder on the stack
390 # push xxh ; push vector number
391 .byte 0x6a
392 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
393 jmpCommonIdtEntry
394 # No. 16
395 pushl $0x0 # push error code place holder on the stack
396 # push xxh ; push vector number
397 .byte 0x6a
398 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
399 jmpCommonIdtEntry
400 # No. 17
401 pushl $0x0 # push error code place holder on the stack
402 # push xxh ; push vector number
403 .byte 0x6a
404 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
405 jmpCommonIdtEntry
406 # No. 18
407 pushl $0x0 # push error code place holder on the stack
408 # push xxh ; push vector number
409 .byte 0x6a
410 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
411 jmpCommonIdtEntry
412 # No. 19
413 pushl $0x0 # push error code place holder on the stack
414 # push xxh ; push vector number
415 .byte 0x6a
416 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
417 jmpCommonIdtEntry
418 # No. 20
419 pushl $0x0 # push error code place holder on the stack
420 # push xxh ; push vector number
421 .byte 0x6a
422 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
423 jmpCommonIdtEntry
424 # No. 21
425 pushl $0x0 # push error code place holder on the stack
426 # push xxh ; push vector number
427 .byte 0x6a
428 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
429 jmpCommonIdtEntry
430 # No. 22
431 pushl $0x0 # push error code place holder on the stack
432 # push xxh ; push vector number
433 .byte 0x6a
434 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
435 jmpCommonIdtEntry
436 # No. 23
437 pushl $0x0 # push error code place holder on the stack
438 # push xxh ; push vector number
439 .byte 0x6a
440 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
441 jmpCommonIdtEntry
442 # No. 24
443 pushl $0x0 # push error code place holder on the stack
444 # push xxh ; push vector number
445 .byte 0x6a
446 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
447 jmpCommonIdtEntry
448 # No. 25
449 pushl $0x0 # push error code place holder on the stack
450 # push xxh ; push vector number
451 .byte 0x6a
452 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
453 jmpCommonIdtEntry
454 # No. 26
455 pushl $0x0 # push error code place holder on the stack
456 # push xxh ; push vector number
457 .byte 0x6a
458 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
459 jmpCommonIdtEntry
460 # No. 27
461 pushl $0x0 # push error code place holder on the stack
462 # push xxh ; push vector number
463 .byte 0x6a
464 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
465 jmpCommonIdtEntry
466 # No. 28
467 pushl $0x0 # push error code place holder on the stack
468 # push xxh ; push vector number
469 .byte 0x6a
470 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
471 jmpCommonIdtEntry
472 # No. 29
473 pushl $0x0 # push error code place holder on the stack
474 # push xxh ; push vector number
475 .byte 0x6a
476 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
477 jmpCommonIdtEntry
478 # No. 30
479 pushl $0x0 # push error code place holder on the stack
480 # push xxh ; push vector number
481 .byte 0x6a
482 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
483 jmpCommonIdtEntry
484 # No. 31
485 pushl $0x0 # push error code place holder on the stack
486 # push xxh ; push vector number
487 .byte 0x6a
488 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
489 jmpCommonIdtEntry
490 # No. 32
491 pushl $0x0 # push error code place holder on the stack
492 # push xxh ; push vector number
493 .byte 0x6a
494 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
495 jmpCommonIdtEntry
496 # No. 33
497 pushl $0x0 # push error code place holder on the stack
498 # push xxh ; push vector number
499 .byte 0x6a
500 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
501 jmpCommonIdtEntry
502 # No. 34
503 pushl $0x0 # push error code place holder on the stack
504 # push xxh ; push vector number
505 .byte 0x6a
506 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
507 jmpCommonIdtEntry
508 # No. 35
509 pushl $0x0 # push error code place holder on the stack
510 # push xxh ; push vector number
511 .byte 0x6a
512 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
513 jmpCommonIdtEntry
514 # No. 36
515 pushl $0x0 # push error code place holder on the stack
516 # push xxh ; push vector number
517 .byte 0x6a
518 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
519 jmpCommonIdtEntry
520 # No. 37
521 pushl $0x0 # push error code place holder on the stack
522 # push xxh ; push vector number
523 .byte 0x6a
524 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
525 jmpCommonIdtEntry
526 # No. 38
527 pushl $0x0 # push error code place holder on the stack
528 # push xxh ; push vector number
529 .byte 0x6a
530 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
531 jmpCommonIdtEntry
532 # No. 39
533 pushl $0x0 # push error code place holder on the stack
534 # push xxh ; push vector number
535 .byte 0x6a
536 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
537 jmpCommonIdtEntry
538 # No. 40
539 pushl $0x0 # push error code place holder on the stack
540 # push xxh ; push vector number
541 .byte 0x6a
542 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
543 jmpCommonIdtEntry
544 # No. 41
545 pushl $0x0 # push error code place holder on the stack
546 # push xxh ; push vector number
547 .byte 0x6a
548 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
549 jmpCommonIdtEntry
550 # No. 42
551 pushl $0x0 # push error code place holder on the stack
552 # push xxh ; push vector number
553 .byte 0x6a
554 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
555 jmpCommonIdtEntry
556 # No. 43
557 pushl $0x0 # push error code place holder on the stack
558 # push xxh ; push vector number
559 .byte 0x6a
560 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
561 jmpCommonIdtEntry
562 # No. 44
563 pushl $0x0 # push error code place holder on the stack
564 # push xxh ; push vector number
565 .byte 0x6a
566 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
567 jmpCommonIdtEntry
568 # No. 45
569 pushl $0x0 # push error code place holder on the stack
570 # push xxh ; push vector number
571 .byte 0x6a
572 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
573 jmpCommonIdtEntry
574 # No. 46
575 pushl $0x0 # push error code place holder on the stack
576 # push xxh ; push vector number
577 .byte 0x6a
578 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
579 jmpCommonIdtEntry
580 # No. 47
581 pushl $0x0 # push error code place holder on the stack
582 # push xxh ; push vector number
583 .byte 0x6a
584 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
585 jmpCommonIdtEntry
586 # No. 48
587 pushl $0x0 # push error code place holder on the stack
588 # push xxh ; push vector number
589 .byte 0x6a
590 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
591 jmpCommonIdtEntry
592 # No. 49
593 pushl $0x0 # push error code place holder on the stack
594 # push xxh ; push vector number
595 .byte 0x6a
596 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
597 jmpCommonIdtEntry
598 # No. 50
599 pushl $0x0 # push error code place holder on the stack
600 # push xxh ; push vector number
601 .byte 0x6a
602 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
603 jmpCommonIdtEntry
604 # No. 51
605 pushl $0x0 # push error code place holder on the stack
606 # push xxh ; push vector number
607 .byte 0x6a
608 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
609 jmpCommonIdtEntry
610 # No. 52
611 pushl $0x0 # push error code place holder on the stack
612 # push xxh ; push vector number
613 .byte 0x6a
614 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
615 jmpCommonIdtEntry
616 # No. 53
617 pushl $0x0 # push error code place holder on the stack
618 # push xxh ; push vector number
619 .byte 0x6a
620 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
621 jmpCommonIdtEntry
622 # No. 54
623 pushl $0x0 # push error code place holder on the stack
624 # push xxh ; push vector number
625 .byte 0x6a
626 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
627 jmpCommonIdtEntry
628 # No. 55
629 pushl $0x0 # push error code place holder on the stack
630 # push xxh ; push vector number
631 .byte 0x6a
632 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
633 jmpCommonIdtEntry
634 # No. 56
635 pushl $0x0 # push error code place holder on the stack
636 # push xxh ; push vector number
637 .byte 0x6a
638 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
639 jmpCommonIdtEntry
640 # No. 57
641 pushl $0x0 # push error code place holder on the stack
642 # push xxh ; push vector number
643 .byte 0x6a
644 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
645 jmpCommonIdtEntry
646 # No. 58
647 pushl $0x0 # push error code place holder on the stack
648 # push xxh ; push vector number
649 .byte 0x6a
650 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
651 jmpCommonIdtEntry
652 # No. 59
653 pushl $0x0 # push error code place holder on the stack
654 # push xxh ; push vector number
655 .byte 0x6a
656 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
657 jmpCommonIdtEntry
658 # No. 60
659 pushl $0x0 # push error code place holder on the stack
660 # push xxh ; push vector number
661 .byte 0x6a
662 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
663 jmpCommonIdtEntry
664 # No. 61
665 pushl $0x0 # push error code place holder on the stack
666 # push xxh ; push vector number
667 .byte 0x6a
668 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
669 jmpCommonIdtEntry
670 # No. 62
671 pushl $0x0 # push error code place holder on the stack
672 # push xxh ; push vector number
673 .byte 0x6a
674 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
675 jmpCommonIdtEntry
676 # No. 63
677 pushl $0x0 # push error code place holder on the stack
678 # push xxh ; push vector number
679 .byte 0x6a
680 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
681 jmpCommonIdtEntry
682 # No. 64
683 pushl $0x0 # push error code place holder on the stack
684 # push xxh ; push vector number
685 .byte 0x6a
686 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
687 jmpCommonIdtEntry
688 # No. 65
689 pushl $0x0 # push error code place holder on the stack
690 # push xxh ; push vector number
691 .byte 0x6a
692 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
693 jmpCommonIdtEntry
694 # No. 66
695 pushl $0x0 # push error code place holder on the stack
696 # push xxh ; push vector number
697 .byte 0x6a
698 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
699 jmpCommonIdtEntry
700 # No. 67
701 pushl $0x0 # push error code place holder on the stack
702 # push xxh ; push vector number
703 .byte 0x6a
704 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
705 jmpCommonIdtEntry
706 # No. 68
707 pushl $0x0 # push error code place holder on the stack
708 # push xxh ; push vector number
709 .byte 0x6a
710 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
711 jmpCommonIdtEntry
712 # No. 69
713 pushl $0x0 # push error code place holder on the stack
714 # push xxh ; push vector number
715 .byte 0x6a
716 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
717 jmpCommonIdtEntry
718 # No. 70
719 pushl $0x0 # push error code place holder on the stack
720 # push xxh ; push vector number
721 .byte 0x6a
722 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
723 jmpCommonIdtEntry
724 # No. 71
725 pushl $0x0 # push error code place holder on the stack
726 # push xxh ; push vector number
727 .byte 0x6a
728 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
729 jmpCommonIdtEntry
730 # No. 72
731 pushl $0x0 # push error code place holder on the stack
732 # push xxh ; push vector number
733 .byte 0x6a
734 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
735 jmpCommonIdtEntry
736 # No. 73
737 pushl $0x0 # push error code place holder on the stack
738 # push xxh ; push vector number
739 .byte 0x6a
740 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
741 jmpCommonIdtEntry
742 # No. 74
743 pushl $0x0 # push error code place holder on the stack
744 # push xxh ; push vector number
745 .byte 0x6a
746 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
747 jmpCommonIdtEntry
748 # No. 75
749 pushl $0x0 # push error code place holder on the stack
750 # push xxh ; push vector number
751 .byte 0x6a
752 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
753 jmpCommonIdtEntry
754 # No. 76
755 pushl $0x0 # push error code place holder on the stack
756 # push xxh ; push vector number
757 .byte 0x6a
758 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
759 jmpCommonIdtEntry
760 # No. 77
761 pushl $0x0 # push error code place holder on the stack
762 # push xxh ; push vector number
763 .byte 0x6a
764 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
765 jmpCommonIdtEntry
766 # No. 78
767 pushl $0x0 # push error code place holder on the stack
768 # push xxh ; push vector number
769 .byte 0x6a
770 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
771 jmpCommonIdtEntry
772 # No. 79
773 pushl $0x0 # push error code place holder on the stack
774 # push xxh ; push vector number
775 .byte 0x6a
776 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
777 jmpCommonIdtEntry
778 # No. 80
779 pushl $0x0 # push error code place holder on the stack
780 # push xxh ; push vector number
781 .byte 0x6a
782 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
783 jmpCommonIdtEntry
784 # No. 81
785 pushl $0x0 # push error code place holder on the stack
786 # push xxh ; push vector number
787 .byte 0x6a
788 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
789 jmpCommonIdtEntry
790 # No. 82
791 pushl $0x0 # push error code place holder on the stack
792 # push xxh ; push vector number
793 .byte 0x6a
794 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
795 jmpCommonIdtEntry
796 # No. 83
797 pushl $0x0 # push error code place holder on the stack
798 # push xxh ; push vector number
799 .byte 0x6a
800 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
801 jmpCommonIdtEntry
802 # No. 84
803 pushl $0x0 # push error code place holder on the stack
804 # push xxh ; push vector number
805 .byte 0x6a
806 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
807 jmpCommonIdtEntry
808 # No. 85
809 pushl $0x0 # push error code place holder on the stack
810 # push xxh ; push vector number
811 .byte 0x6a
812 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
813 jmpCommonIdtEntry
814 # No. 86
815 pushl $0x0 # push error code place holder on the stack
816 # push xxh ; push vector number
817 .byte 0x6a
818 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
819 jmpCommonIdtEntry
820 # No. 87
821 pushl $0x0 # push error code place holder on the stack
822 # push xxh ; push vector number
823 .byte 0x6a
824 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
825 jmpCommonIdtEntry
826 # No. 88
827 pushl $0x0 # push error code place holder on the stack
828 # push xxh ; push vector number
829 .byte 0x6a
830 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
831 jmpCommonIdtEntry
832 # No. 89
833 pushl $0x0 # push error code place holder on the stack
834 # push xxh ; push vector number
835 .byte 0x6a
836 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
837 jmpCommonIdtEntry
838 # No. 90
839 pushl $0x0 # push error code place holder on the stack
840 # push xxh ; push vector number
841 .byte 0x6a
842 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
843 jmpCommonIdtEntry
844 # No. 91
845 pushl $0x0 # push error code place holder on the stack
846 # push xxh ; push vector number
847 .byte 0x6a
848 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
849 jmpCommonIdtEntry
850 # No. 92
851 pushl $0x0 # push error code place holder on the stack
852 # push xxh ; push vector number
853 .byte 0x6a
854 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
855 jmpCommonIdtEntry
856 # No. 93
857 pushl $0x0 # push error code place holder on the stack
858 # push xxh ; push vector number
859 .byte 0x6a
860 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
861 jmpCommonIdtEntry
862 # No. 94
863 pushl $0x0 # push error code place holder on the stack
864 # push xxh ; push vector number
865 .byte 0x6a
866 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
867 jmpCommonIdtEntry
868 # No. 95
869 pushl $0x0 # push error code place holder on the stack
870 # push xxh ; push vector number
871 .byte 0x6a
872 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
873 jmpCommonIdtEntry
874 # No. 96
875 pushl $0x0 # push error code place holder on the stack
876 # push xxh ; push vector number
877 .byte 0x6a
878 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
879 jmpCommonIdtEntry
880 # No. 97
881 pushl $0x0 # push error code place holder on the stack
882 # push xxh ; push vector number
883 .byte 0x6a
884 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
885 jmpCommonIdtEntry
886 # No. 98
887 pushl $0x0 # push error code place holder on the stack
888 # push xxh ; push vector number
889 .byte 0x6a
890 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
891 jmpCommonIdtEntry
892 # No. 99
893 pushl $0x0 # push error code place holder on the stack
894 # push xxh ; push vector number
895 .byte 0x6a
896 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
897 jmpCommonIdtEntry
898 # No. 100
899 pushl $0x0 # push error code place holder on the stack
900 # push xxh ; push vector number
901 .byte 0x6a
902 .byte ( . - INTUnknown - 3 ) / 9 + 20 # vector number
903 jmpCommonIdtEntry
904
905
906 commonIdtEntry:
907 pushl %eax
908 pushl %ecx
909 pushl %edx
910 pushl %ebx
911 pushl %esp
912 pushl %ebp
913 pushl %esi
914 pushl %edi
915 .byte 0x41
916 .byte 0x50
917 # push r8
918 .byte 0x41
919 .byte 0x51
920 # push r9
921 .byte 0x41
922 .byte 0x52
923 # push r10
924 .byte 0x41
925 .byte 0x53
926 # push r11
927 .byte 0x41
928 .byte 0x54
929 # push r12
930 .byte 0x41
931 .byte 0x55
932 # push r13
933 .byte 0x41
934 .byte 0x56
935 # push r14
936 .byte 0x41
937 .byte 0x57
938 # push r15
939 .byte 0x48
940 movl %esp,%ebp
941 # mov rbp, rsp
942
943 ##
944 ## At this point the stack looks like this:
945 ##
946 ## Calling SS
947 ## Calling RSP
948 ## rflags
949 ## Calling CS
950 ## Calling RIP
951 ## Error code or 0
952 ## Int num or 0ffh for unknown int num
953 ## rax
954 ## rcx
955 ## rdx
956 ## rbx
957 ## rsp
958 ## rbp
959 ## rsi
960 ## rdi
961 ## r8
962 ## r9
963 ## r10
964 ## r11
965 ## r12
966 ## r13
967 ## r14
968 ## r15 <------- RSP, RBP
969 ##
970
971 call ClearScreen
972 movl $String1, %esi
973 call PrintString
974 .byte 0x48
975 movl 16*8(%ebp),%eax ## move Int number into RAX
976 .byte 0x48
977 cmpl $18,%eax
978 ja PrintDefaultString
979 PrintExceptionString:
980 shll $3,%eax ## multiply by 8 to get offset from StringTable to actual string address
981 addl $StringTable, %eax
982 movl (%eax),%esi
983 jmp PrintTheString
984 PrintDefaultString:
985 movl $IntUnknownString, %esi
986 # patch Int number
987 movl %eax,%edx
988 call A2C
989 movb %al,1(%esi)
990 movl %edx,%eax
991 shrl $4,%eax
992 call A2C
993 movb %al,(%esi)
994 PrintTheString:
995 call PrintString
996 movl $String2, %esi
997 call PrintString
998 .byte 0x48
999 movl 19*8(%ebp),%eax # CS
1000 call PrintQword
1001 movb $':', %al
1002 movb %al, (%edi)
1003 addl $2,%edi
1004 .byte 0x48
1005 movl 18*8(%ebp),%eax # RIP
1006 call PrintQword
1007 movl $String3, %esi
1008 call PrintString
1009
1010 movl $0xb8140,%edi
1011
1012 movl $StringRax, %esi
1013 call PrintString
1014 .byte 0x48
1015 movl 15*8(%ebp),%eax
1016 call PrintQword
1017
1018 movl $StringRcx, %esi
1019 call PrintString
1020 .byte 0x48
1021 movl 14*8(%ebp),%eax
1022 call PrintQword
1023
1024 movl $StringRdx, %esi
1025 call PrintString
1026 .byte 0x48
1027 movl 13*8(%ebp),%eax
1028 call PrintQword
1029
1030 movl $0xb81e0,%edi
1031
1032 movl $StringRbx, %esi
1033 call PrintString
1034 .byte 0x48
1035 movl 12*8(%ebp),%eax
1036 call PrintQword
1037
1038 movl $StringRsp, %esi
1039 call PrintString
1040 .byte 0x48
1041 movl 21*8(%ebp),%eax
1042 call PrintQword
1043
1044 movl $StringRbp, %esi
1045 call PrintString
1046 .byte 0x48
1047 movl 10*8(%ebp),%eax
1048 call PrintQword
1049
1050 movl $0xb8280,%edi
1051
1052 movl $StringRsi, %esi
1053 call PrintString
1054 .byte 0x48
1055 movl 9*8(%ebp),%eax
1056 call PrintQword
1057
1058 movl $StringRdi, %esi
1059 call PrintString
1060 .byte 0x48
1061 movl 8*8(%ebp),%eax
1062 call PrintQword
1063
1064 movl $StringEcode, %esi
1065 call PrintString
1066 .byte 0x48
1067 movl 17*8(%ebp),%eax
1068 call PrintQword
1069
1070 movl $0xb8320,%edi
1071
1072 movl $StringR8, %esi
1073 call PrintString
1074 .byte 0x48
1075 movl 7*8(%ebp),%eax
1076 call PrintQword
1077
1078 movl $StringR9, %esi
1079 call PrintString
1080 .byte 0x48
1081 movl 6*8(%ebp),%eax
1082 call PrintQword
1083
1084 movl $StringR10, %esi
1085 call PrintString
1086 .byte 0x48
1087 movl 5*8(%ebp),%eax
1088 call PrintQword
1089
1090 movl $0xb83c0,%edi
1091
1092 movl $StringR11, %esi
1093 call PrintString
1094 .byte 0x48
1095 movl 4*8(%ebp),%eax
1096 call PrintQword
1097
1098 movl $StringR12, %esi
1099 call PrintString
1100 .byte 0x48
1101 movl 3*8(%ebp),%eax
1102 call PrintQword
1103
1104 movl $StringR13, %esi
1105 call PrintString
1106 .byte 0x48
1107 movl 2*8(%ebp),%eax
1108 call PrintQword
1109
1110 movl $0xb8460,%edi
1111
1112 movl $StringR14, %esi
1113 call PrintString
1114 .byte 0x48
1115 movl 1*8(%ebp),%eax
1116 call PrintQword
1117
1118 movl $StringR15, %esi
1119 call PrintString
1120 .byte 0x48
1121 movl 0*8(%ebp),%eax
1122 call PrintQword
1123
1124 movl $StringSs, %esi
1125 call PrintString
1126 .byte 0x48
1127 movl 22*8(%ebp),%eax
1128 call PrintQword
1129
1130 movl $0xb8500,%edi
1131
1132 movl $StringRflags, %esi
1133 call PrintString
1134 .byte 0x48
1135 movl 20*8(%ebp),%eax
1136 call PrintQword
1137
1138 movl $0xb8640,%edi
1139
1140 movl %ebp,%esi
1141 addl $23*8,%esi
1142 movl $4,%ecx
1143
1144
1145 OuterLoop:
1146 pushl %ecx
1147 movl $4,%ecx
1148 .byte 0x48
1149 movl %edi,%edx
1150
1151 InnerLoop:
1152 .byte 0x48
1153 movl (%esi),%eax
1154 call PrintQword
1155 addl $8,%esi
1156 movb $0x20, %al # blank character
1157 movb %al,(%edi)
1158 addl $2,%edi
1159 loop InnerLoop
1160
1161 popl %ecx
1162 addl $0xa0,%edx
1163 movl %edx,%edi
1164 loop OuterLoop
1165
1166
1167 movl $0xb8960,%edi
1168
1169 .byte 0x48
1170 movl 18*8(%ebp),%eax # RIP
1171 subl $8*8,%eax
1172 .byte 0x48
1173 movl %eax,%esi # esi = rip - 8 QWORD linear (total 16 QWORD)
1174
1175 movl $4,%ecx
1176
1177 OuterLoop1:
1178 pushl %ecx
1179 movl $4,%ecx
1180 movl %edi,%edx
1181
1182 InnerLoop1:
1183 .byte 0x48
1184 movl (%esi),%eax
1185 call PrintQword
1186 addl $8,%esi
1187 movb $0x20, %al # blank character
1188 movb %al,(%edi)
1189 addl $2,%edi
1190 loop InnerLoop1
1191
1192 popl %ecx
1193 addl $0xa0,%edx
1194 movl %edx,%edi
1195 loop OuterLoop1
1196
1197
1198
1199 #wbinvd
1200 LN_C1:
1201 jmp LN_C1
1202
1203 #
1204 # return
1205 #
1206 movl %ebp,%esp
1207 # mov rsp, rbp
1208 .byte 0x41
1209 .byte 0x5f
1210 # pop r15
1211 .byte 0x41
1212 .byte 0x5e
1213 # pop r14
1214 .byte 0x41
1215 .byte 0x5d
1216 # pop r13
1217 .byte 0x41
1218 .byte 0x5c
1219 # pop r12
1220 .byte 0x41
1221 .byte 0x5b
1222 # pop r11
1223 .byte 0x41
1224 .byte 0x5a
1225 # pop r10
1226 .byte 0x41
1227 .byte 0x59
1228 # pop r9
1229 .byte 0x41
1230 .byte 0x58
1231 # pop r8
1232 popl %edi
1233 popl %esi
1234 popl %ebp
1235 popl %eax # esp
1236 popl %ebx
1237 popl %edx
1238 popl %ecx
1239 popl %eax
1240
1241 .byte 0x48
1242 .byte 0x83
1243 .byte 0xc4
1244 .byte 0x10
1245 # add esp, 16 ; error code and INT number
1246
1247 .byte 0x48
1248 .byte 0xcf
1249 # iretq
1250
1251 PrintString:
1252 pushl %eax
1253 LN_C2:
1254 movb (%esi), %al
1255 cmpb $0,%al
1256 je LN_C3
1257 movb %al, (%edi)
1258 .byte 0xff
1259 .byte 0xc6
1260 # inc esi
1261 addl $2,%edi
1262 jmp LN_C2
1263 LN_C3:
1264 popl %eax
1265 ret
1266
1267 ## RAX contains qword to print
1268 ## RDI contains memory location (screen location) to print it to
1269 PrintQword:
1270 pushl %ecx
1271 pushl %ebx
1272 pushl %eax
1273
1274 .byte 0x48
1275 .byte 0xc7
1276 .byte 0xc1
1277 .long 16
1278 # mov rcx, 16
1279 looptop:
1280 .byte 0x48
1281 roll $4,%eax
1282 movb %al,%bl
1283 andb $0xf,%bl
1284 addb $'0', %bl
1285 cmpb $'9', %bl
1286 jle LN_C4
1287 addb $7,%bl
1288 LN_C4:
1289 movb %bl, (%edi)
1290 addl $2,%edi
1291 loop looptop
1292 #wbinvd
1293
1294 popl %eax
1295 popl %ebx
1296 popl %ecx
1297 ret
1298
1299 ClearScreen:
1300 pushl %eax
1301 pushl %ecx
1302
1303 movb $0x20, %al # blank character
1304 movb $0xc,%ah
1305 movl $0xb8000,%edi
1306 movl $80*24,%ecx
1307 LN_C5:
1308 movw %ax, (%edi)
1309 addl $2,%edi
1310 loop LN_C5
1311 movl $0xb8000,%edi
1312
1313 popl %ecx
1314 popl %eax
1315
1316 ret
1317
1318 A2C:
1319 andb $0xf,%al
1320 addb $'0', %al
1321 cmpb $'9', %al
1322 jle LN_C6
1323 addb $7,%al
1324 LN_C6:
1325 ret
1326
1327 String1: .asciz "*** INT "
1328
1329 Int0String: .asciz "00h Divide by 0 -"
1330 Int1String: .asciz "01h Debug exception -"
1331 Int2String: .asciz "02h NMI -"
1332 Int3String: .asciz "03h Breakpoint -"
1333 Int4String: .asciz "04h Overflow -"
1334 Int5String: .asciz "05h Bound -"
1335 Int6String: .asciz "06h Invalid opcode -"
1336 Int7String: .asciz "07h Device not available -"
1337 Int8String: .asciz "08h Double fault -"
1338 Int9String: .asciz "09h Coprocessor seg overrun (reserved) -"
1339 Int10String: .asciz "0Ah Invalid TSS -"
1340 Int11String: .asciz "0Bh Segment not present -"
1341 Int12String: .asciz "0Ch Stack fault -"
1342 Int13String: .asciz "0Dh General protection fault -"
1343 Int14String: .asciz "0Eh Page fault -"
1344 Int15String: .asciz "0Fh (Intel reserved) -"
1345 Int16String: .asciz "10h Floating point error -"
1346 Int17String: .asciz "11h Alignment check -"
1347 Int18String: .asciz "12h Machine check -"
1348 Int19String: .asciz "13h SIMD Floating-Point Exception -"
1349 IntUnknownString: .asciz "??h Unknown interrupt -"
1350
1351 StringTable: .long Int0String, 0, Int1String, 0, Int2String, 0, Int3String, 0, \
1352 Int4String, 0, Int5String, 0, Int6String, 0, Int7String, 0, \
1353 Int8String, 0, Int9String, 0, Int10String, 0, Int11String, 0, \
1354 Int12String, 0, Int13String, 0, Int14String, 0, Int15String, 0, \
1355 Int16String, 0, Int17String, 0, Int18String, 0, Int19String, 0
1356
1357 String2: .asciz " HALT!! *** ("
1358 String3: .asciz ")"
1359 StringRax: .asciz "RAX="
1360 StringRcx: .asciz " RCX="
1361 StringRdx: .asciz " RDX="
1362 StringRbx: .asciz "RBX="
1363 StringRsp: .asciz " RSP="
1364 StringRbp: .asciz " RBP="
1365 StringRsi: .asciz "RSI="
1366 StringRdi: .asciz " RDI="
1367 StringEcode: .asciz " ECODE="
1368 StringR8: .asciz "R8 ="
1369 StringR9: .asciz " R9 ="
1370 StringR10: .asciz " R10="
1371 StringR11: .asciz "R11="
1372 StringR12: .asciz " R12="
1373 StringR13: .asciz " R13="
1374 StringR14: .asciz "R14="
1375 StringR15: .asciz " R15="
1376 StringSs: .asciz " SS ="
1377 StringRflags: .asciz "RFLAGS="
1378
1379 Idtr: .float 0
1380 .float 0
1381
1382 .org 0x21ffe
1383 BlockSignature:
1384 .word 0xaa55
1385