locore: organize data by type
Program text, rodata, and data need different MMU permissions. Split out rodata and data from the program text, updating the linker script appropriately. Region size symbols added to the linker script, so these can later be used with MMU_BOOT_REGION(). Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
30ebf52a27
commit
cdd721db3b
2 changed files with 187 additions and 172 deletions
|
@ -252,179 +252,8 @@ __resume:
|
||||||
|
|
||||||
1: iretq
|
1: iretq
|
||||||
|
|
||||||
/*
|
|
||||||
* GDT - a single GDT is shared by all threads (and, eventually, all CPUs).
|
|
||||||
* This layout must agree with the selectors in intel64/kernel_arch_data.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.align 8
|
|
||||||
|
|
||||||
gdt:
|
|
||||||
.word 0, 0, 0, 0 /* 0x00: null descriptor */
|
|
||||||
.word 0xFFFF, 0, 0x9A00, 0x00CF /* 0x08: 32-bit kernel code */
|
|
||||||
.word 0xFFFF, 0, 0x9200, 0x00CF /* 0x10: 32-bit kernel data */
|
|
||||||
.word 0, 0, 0x9800, 0x0020 /* 0x18: 64-bit kernel code */
|
|
||||||
.word 0, 0, 0x9200, 0x0000 /* 0x20: 64-bit kernel data */
|
|
||||||
|
|
||||||
.word 0, 0, 0, 0 /* 0x28: unused */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CPU 0 task state segment descriptors
|
|
||||||
*/
|
|
||||||
|
|
||||||
.word 0 /* 0x30: 64-bit TSS data (for GS) */
|
|
||||||
.word tss0
|
|
||||||
.word 0x9200
|
|
||||||
.word 0
|
|
||||||
|
|
||||||
.word 0, 0, 0, 0 /* 0x38: unused */
|
|
||||||
|
|
||||||
.word __X86_TSS64_SIZEOF-1 /* 0x40: 64-bit TSS (16-byte entry) */
|
|
||||||
.word tss0
|
|
||||||
.word 0x8900
|
|
||||||
.word 0, 0, 0, 0, 0
|
|
||||||
|
|
||||||
#if CONFIG_MP_NUM_CPUS > 1
|
|
||||||
/*
|
|
||||||
* CPU 1 task state segment descriptors
|
|
||||||
*/
|
|
||||||
|
|
||||||
.word 0 /* 0x50: 64-bit TSS data (for GS) */
|
|
||||||
.word tss1
|
|
||||||
.word 0x9200
|
|
||||||
.word 0
|
|
||||||
|
|
||||||
.word 0, 0, 0, 0 /* 0x58: unused */
|
|
||||||
|
|
||||||
.word __X86_TSS64_SIZEOF-1 /* 0x60: 64-bit TSS (16-byte entry) */
|
|
||||||
.word tss1
|
|
||||||
.word 0x8900
|
|
||||||
.word 0, 0, 0, 0, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_MP_NUM_CPUS > 2
|
|
||||||
/*
|
|
||||||
* CPU 2 task state segment descriptors
|
|
||||||
*/
|
|
||||||
|
|
||||||
.word 0 /* 0x70: 64-bit TSS data (for GS) */
|
|
||||||
.word tss2
|
|
||||||
.word 0x9200
|
|
||||||
.word 0
|
|
||||||
|
|
||||||
.word 0, 0, 0, 0 /* 0x78: unused */
|
|
||||||
|
|
||||||
.word __X86_TSS64_SIZEOF-1 /* 0x80: 64-bit TSS (16-byte entry) */
|
|
||||||
.word tss2
|
|
||||||
.word 0x8900
|
|
||||||
.word 0, 0, 0, 0, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_MP_NUM_CPUS > 3
|
|
||||||
/*
|
|
||||||
* CPU 3 task state segment descriptors
|
|
||||||
*/
|
|
||||||
|
|
||||||
.word 0 /* 0x90: 64-bit TSS data (for GS) */
|
|
||||||
.word tss3
|
|
||||||
.word 0x9200
|
|
||||||
.word 0
|
|
||||||
|
|
||||||
.word 0, 0, 0, 0 /* 0x98: unused */
|
|
||||||
|
|
||||||
.word __X86_TSS64_SIZEOF-1 /* 0xA0: 64-bit TSS (16-byte entry) */
|
|
||||||
.word tss3
|
|
||||||
.word 0x8900
|
|
||||||
.word 0, 0, 0, 0, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gdt48:
|
|
||||||
.word (gdt48 - gdt - 1)
|
|
||||||
.long gdt
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IDT.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define TRAP 0x8f
|
|
||||||
#define INTR 0x8e
|
|
||||||
|
|
||||||
#define IDT(nr, type, ist) \
|
|
||||||
.word vector_ ## nr, X86_KERNEL_CS; \
|
|
||||||
.byte ist, type; \
|
|
||||||
.word 0, 0, 0, 0, 0
|
|
||||||
|
|
||||||
.align 16
|
|
||||||
idt:
|
|
||||||
IDT( 0, TRAP, 7); IDT( 1, TRAP, 7); IDT( 2, TRAP, 7); IDT( 3, TRAP, 7)
|
|
||||||
IDT( 4, TRAP, 7); IDT( 5, TRAP, 7); IDT( 6, TRAP, 7); IDT( 7, TRAP, 7)
|
|
||||||
IDT( 8, TRAP, 7); IDT( 9, TRAP, 7); IDT( 10, TRAP, 7); IDT( 11, TRAP, 7)
|
|
||||||
IDT( 12, TRAP, 7); IDT( 13, TRAP, 7); IDT( 14, TRAP, 7); IDT( 15, TRAP, 7)
|
|
||||||
IDT( 16, TRAP, 7); IDT( 17, TRAP, 7); IDT( 18, TRAP, 7); IDT( 19, TRAP, 7)
|
|
||||||
IDT( 20, TRAP, 7); IDT( 21, TRAP, 7); IDT( 22, TRAP, 7); IDT( 23, TRAP, 7)
|
|
||||||
IDT( 24, TRAP, 7); IDT( 25, TRAP, 7); IDT( 26, TRAP, 7); IDT( 27, TRAP, 7)
|
|
||||||
IDT( 28, TRAP, 7); IDT( 29, TRAP, 7); IDT( 30, TRAP, 7); IDT( 31, TRAP, 7)
|
|
||||||
|
|
||||||
IDT( 32, INTR, 1); IDT( 33, INTR, 1); IDT( 34, INTR, 1); IDT( 35, INTR, 1)
|
|
||||||
IDT( 36, INTR, 1); IDT( 37, INTR, 1); IDT( 38, INTR, 1); IDT( 39, INTR, 1)
|
|
||||||
IDT( 40, INTR, 1); IDT( 41, INTR, 1); IDT( 42, INTR, 1); IDT( 43, INTR, 1)
|
|
||||||
IDT( 44, INTR, 1); IDT( 45, INTR, 1); IDT( 46, INTR, 1); IDT( 47, INTR, 1)
|
|
||||||
IDT( 48, INTR, 1); IDT( 49, INTR, 1); IDT( 50, INTR, 1); IDT( 51, INTR, 1)
|
|
||||||
IDT( 52, INTR, 1); IDT( 53, INTR, 1); IDT( 54, INTR, 1); IDT( 55, INTR, 1)
|
|
||||||
IDT( 56, INTR, 1); IDT( 57, INTR, 1); IDT( 58, INTR, 1); IDT( 59, INTR, 1)
|
|
||||||
IDT( 60, INTR, 1); IDT( 61, INTR, 1); IDT( 62, INTR, 1); IDT( 63, INTR, 1)
|
|
||||||
IDT( 64, INTR, 1); IDT( 65, INTR, 1); IDT( 66, INTR, 1); IDT( 67, INTR, 1)
|
|
||||||
IDT( 68, INTR, 1); IDT( 69, INTR, 1); IDT( 70, INTR, 1); IDT( 71, INTR, 1)
|
|
||||||
IDT( 72, INTR, 1); IDT( 73, INTR, 1); IDT( 74, INTR, 1); IDT( 75, INTR, 1)
|
|
||||||
IDT( 76, INTR, 1); IDT( 77, INTR, 1); IDT( 78, INTR, 1); IDT( 79, INTR, 1)
|
|
||||||
IDT( 80, INTR, 1); IDT( 81, INTR, 1); IDT( 82, INTR, 1); IDT( 83, INTR, 1)
|
|
||||||
IDT( 84, INTR, 1); IDT( 85, INTR, 1); IDT( 86, INTR, 1); IDT( 87, INTR, 1)
|
|
||||||
IDT( 88, INTR, 1); IDT( 89, INTR, 1); IDT( 90, INTR, 1); IDT( 91, INTR, 1)
|
|
||||||
IDT( 92, INTR, 1); IDT( 93, INTR, 1); IDT( 94, INTR, 1); IDT( 95, INTR, 1)
|
|
||||||
IDT( 96, INTR, 1); IDT( 97, INTR, 1); IDT( 98, INTR, 1); IDT( 99, INTR, 1)
|
|
||||||
IDT(100, INTR, 1); IDT(101, INTR, 1); IDT(102, INTR, 1); IDT(103, INTR, 1)
|
|
||||||
IDT(104, INTR, 1); IDT(105, INTR, 1); IDT(106, INTR, 1); IDT(107, INTR, 1)
|
|
||||||
IDT(108, INTR, 1); IDT(109, INTR, 1); IDT(110, INTR, 1); IDT(111, INTR, 1)
|
|
||||||
IDT(112, INTR, 1); IDT(113, INTR, 1); IDT(114, INTR, 1); IDT(115, INTR, 1)
|
|
||||||
IDT(116, INTR, 1); IDT(117, INTR, 1); IDT(118, INTR, 1); IDT(119, INTR, 1)
|
|
||||||
IDT(120, INTR, 1); IDT(121, INTR, 1); IDT(122, INTR, 1); IDT(123, INTR, 1)
|
|
||||||
IDT(124, INTR, 1); IDT(125, INTR, 1); IDT(126, INTR, 1); IDT(127, INTR, 1)
|
|
||||||
IDT(128, INTR, 1); IDT(129, INTR, 1); IDT(130, INTR, 1); IDT(131, INTR, 1)
|
|
||||||
IDT(132, INTR, 1); IDT(133, INTR, 1); IDT(134, INTR, 1); IDT(135, INTR, 1)
|
|
||||||
IDT(136, INTR, 1); IDT(137, INTR, 1); IDT(138, INTR, 1); IDT(139, INTR, 1)
|
|
||||||
IDT(140, INTR, 1); IDT(141, INTR, 1); IDT(142, INTR, 1); IDT(143, INTR, 1)
|
|
||||||
IDT(144, INTR, 1); IDT(145, INTR, 1); IDT(146, INTR, 1); IDT(147, INTR, 1)
|
|
||||||
IDT(148, INTR, 1); IDT(149, INTR, 1); IDT(150, INTR, 1); IDT(151, INTR, 1)
|
|
||||||
IDT(152, INTR, 1); IDT(153, INTR, 1); IDT(154, INTR, 1); IDT(155, INTR, 1)
|
|
||||||
IDT(156, INTR, 1); IDT(157, INTR, 1); IDT(158, INTR, 1); IDT(159, INTR, 1)
|
|
||||||
IDT(160, INTR, 1); IDT(161, INTR, 1); IDT(162, INTR, 1); IDT(163, INTR, 1)
|
|
||||||
IDT(164, INTR, 1); IDT(165, INTR, 1); IDT(166, INTR, 1); IDT(167, INTR, 1)
|
|
||||||
IDT(168, INTR, 1); IDT(169, INTR, 1); IDT(170, INTR, 1); IDT(171, INTR, 1)
|
|
||||||
IDT(172, INTR, 1); IDT(173, INTR, 1); IDT(174, INTR, 1); IDT(175, INTR, 1)
|
|
||||||
IDT(176, INTR, 1); IDT(177, INTR, 1); IDT(178, INTR, 1); IDT(179, INTR, 1)
|
|
||||||
IDT(180, INTR, 1); IDT(181, INTR, 1); IDT(182, INTR, 1); IDT(183, INTR, 1)
|
|
||||||
IDT(184, INTR, 1); IDT(185, INTR, 1); IDT(186, INTR, 1); IDT(187, INTR, 1)
|
|
||||||
IDT(188, INTR, 1); IDT(189, INTR, 1); IDT(190, INTR, 1); IDT(191, INTR, 1)
|
|
||||||
IDT(192, INTR, 1); IDT(193, INTR, 1); IDT(194, INTR, 1); IDT(195, INTR, 1)
|
|
||||||
IDT(196, INTR, 1); IDT(197, INTR, 1); IDT(198, INTR, 1); IDT(199, INTR, 1)
|
|
||||||
IDT(200, INTR, 1); IDT(201, INTR, 1); IDT(202, INTR, 1); IDT(203, INTR, 1)
|
|
||||||
IDT(204, INTR, 1); IDT(205, INTR, 1); IDT(206, INTR, 1); IDT(207, INTR, 1)
|
|
||||||
IDT(208, INTR, 1); IDT(209, INTR, 1); IDT(210, INTR, 1); IDT(211, INTR, 1)
|
|
||||||
IDT(212, INTR, 1); IDT(213, INTR, 1); IDT(214, INTR, 1); IDT(215, INTR, 1)
|
|
||||||
IDT(216, INTR, 1); IDT(217, INTR, 1); IDT(218, INTR, 1); IDT(219, INTR, 1)
|
|
||||||
IDT(220, INTR, 1); IDT(221, INTR, 1); IDT(222, INTR, 1); IDT(223, INTR, 1)
|
|
||||||
IDT(224, INTR, 1); IDT(225, INTR, 1); IDT(226, INTR, 1); IDT(227, INTR, 1)
|
|
||||||
IDT(228, INTR, 1); IDT(229, INTR, 1); IDT(230, INTR, 1); IDT(231, INTR, 1)
|
|
||||||
IDT(232, INTR, 1); IDT(233, INTR, 1); IDT(234, INTR, 1); IDT(235, INTR, 1)
|
|
||||||
IDT(236, INTR, 1); IDT(237, INTR, 1); IDT(238, INTR, 1); IDT(239, INTR, 1)
|
|
||||||
IDT(240, INTR, 1); IDT(241, INTR, 1); IDT(242, INTR, 1); IDT(243, INTR, 1)
|
|
||||||
IDT(244, INTR, 1); IDT(245, INTR, 1); IDT(246, INTR, 1); IDT(247, INTR, 1)
|
|
||||||
IDT(248, INTR, 1); IDT(249, INTR, 1); IDT(250, INTR, 1); IDT(251, INTR, 1)
|
|
||||||
IDT(252, INTR, 1); IDT(253, INTR, 1); IDT(254, INTR, 1); IDT(255, INTR, 1)
|
|
||||||
|
|
||||||
idt48:
|
|
||||||
.word (idt48 - idt - 1)
|
|
||||||
.long idt
|
|
||||||
|
|
||||||
#define EXCEPT_CODE(nr) vector_ ## nr: pushq $nr; jmp except
|
#define EXCEPT_CODE(nr) vector_ ## nr: pushq $nr; jmp except
|
||||||
#define EXCEPT(nr) vector_ ## nr: pushq $0; pushq $nr; jmp except
|
#define EXCEPT(nr) vector_ ## nr: pushq $0; pushq $nr; jmp except
|
||||||
|
@ -626,6 +455,92 @@ IRQ(232); IRQ(233); IRQ(234); IRQ(235); IRQ(236); IRQ(237); IRQ(238); IRQ(239)
|
||||||
IRQ(240); IRQ(241); IRQ(242); IRQ(243); IRQ(244); IRQ(245); IRQ(246); IRQ(247)
|
IRQ(240); IRQ(241); IRQ(242); IRQ(243); IRQ(244); IRQ(245); IRQ(246); IRQ(247)
|
||||||
IRQ(248); IRQ(249); IRQ(250); IRQ(251); IRQ(252); IRQ(253); IRQ(254); IRQ(255)
|
IRQ(248); IRQ(249); IRQ(250); IRQ(251); IRQ(252); IRQ(253); IRQ(254); IRQ(255)
|
||||||
|
|
||||||
|
.section .lorodata,"a"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IDT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TRAP 0x8f
|
||||||
|
#define INTR 0x8e
|
||||||
|
|
||||||
|
#define IDT(nr, type, ist) \
|
||||||
|
.word vector_ ## nr, X86_KERNEL_CS; \
|
||||||
|
.byte ist, type; \
|
||||||
|
.word 0, 0, 0, 0, 0
|
||||||
|
|
||||||
|
.align 16
|
||||||
|
idt:
|
||||||
|
IDT( 0, TRAP, 7); IDT( 1, TRAP, 7); IDT( 2, TRAP, 7); IDT( 3, TRAP, 7)
|
||||||
|
IDT( 4, TRAP, 7); IDT( 5, TRAP, 7); IDT( 6, TRAP, 7); IDT( 7, TRAP, 7)
|
||||||
|
IDT( 8, TRAP, 7); IDT( 9, TRAP, 7); IDT( 10, TRAP, 7); IDT( 11, TRAP, 7)
|
||||||
|
IDT( 12, TRAP, 7); IDT( 13, TRAP, 7); IDT( 14, TRAP, 7); IDT( 15, TRAP, 7)
|
||||||
|
IDT( 16, TRAP, 7); IDT( 17, TRAP, 7); IDT( 18, TRAP, 7); IDT( 19, TRAP, 7)
|
||||||
|
IDT( 20, TRAP, 7); IDT( 21, TRAP, 7); IDT( 22, TRAP, 7); IDT( 23, TRAP, 7)
|
||||||
|
IDT( 24, TRAP, 7); IDT( 25, TRAP, 7); IDT( 26, TRAP, 7); IDT( 27, TRAP, 7)
|
||||||
|
IDT( 28, TRAP, 7); IDT( 29, TRAP, 7); IDT( 30, TRAP, 7); IDT( 31, TRAP, 7)
|
||||||
|
|
||||||
|
IDT( 32, INTR, 1); IDT( 33, INTR, 1); IDT( 34, INTR, 1); IDT( 35, INTR, 1)
|
||||||
|
IDT( 36, INTR, 1); IDT( 37, INTR, 1); IDT( 38, INTR, 1); IDT( 39, INTR, 1)
|
||||||
|
IDT( 40, INTR, 1); IDT( 41, INTR, 1); IDT( 42, INTR, 1); IDT( 43, INTR, 1)
|
||||||
|
IDT( 44, INTR, 1); IDT( 45, INTR, 1); IDT( 46, INTR, 1); IDT( 47, INTR, 1)
|
||||||
|
IDT( 48, INTR, 1); IDT( 49, INTR, 1); IDT( 50, INTR, 1); IDT( 51, INTR, 1)
|
||||||
|
IDT( 52, INTR, 1); IDT( 53, INTR, 1); IDT( 54, INTR, 1); IDT( 55, INTR, 1)
|
||||||
|
IDT( 56, INTR, 1); IDT( 57, INTR, 1); IDT( 58, INTR, 1); IDT( 59, INTR, 1)
|
||||||
|
IDT( 60, INTR, 1); IDT( 61, INTR, 1); IDT( 62, INTR, 1); IDT( 63, INTR, 1)
|
||||||
|
IDT( 64, INTR, 1); IDT( 65, INTR, 1); IDT( 66, INTR, 1); IDT( 67, INTR, 1)
|
||||||
|
IDT( 68, INTR, 1); IDT( 69, INTR, 1); IDT( 70, INTR, 1); IDT( 71, INTR, 1)
|
||||||
|
IDT( 72, INTR, 1); IDT( 73, INTR, 1); IDT( 74, INTR, 1); IDT( 75, INTR, 1)
|
||||||
|
IDT( 76, INTR, 1); IDT( 77, INTR, 1); IDT( 78, INTR, 1); IDT( 79, INTR, 1)
|
||||||
|
IDT( 80, INTR, 1); IDT( 81, INTR, 1); IDT( 82, INTR, 1); IDT( 83, INTR, 1)
|
||||||
|
IDT( 84, INTR, 1); IDT( 85, INTR, 1); IDT( 86, INTR, 1); IDT( 87, INTR, 1)
|
||||||
|
IDT( 88, INTR, 1); IDT( 89, INTR, 1); IDT( 90, INTR, 1); IDT( 91, INTR, 1)
|
||||||
|
IDT( 92, INTR, 1); IDT( 93, INTR, 1); IDT( 94, INTR, 1); IDT( 95, INTR, 1)
|
||||||
|
IDT( 96, INTR, 1); IDT( 97, INTR, 1); IDT( 98, INTR, 1); IDT( 99, INTR, 1)
|
||||||
|
IDT(100, INTR, 1); IDT(101, INTR, 1); IDT(102, INTR, 1); IDT(103, INTR, 1)
|
||||||
|
IDT(104, INTR, 1); IDT(105, INTR, 1); IDT(106, INTR, 1); IDT(107, INTR, 1)
|
||||||
|
IDT(108, INTR, 1); IDT(109, INTR, 1); IDT(110, INTR, 1); IDT(111, INTR, 1)
|
||||||
|
IDT(112, INTR, 1); IDT(113, INTR, 1); IDT(114, INTR, 1); IDT(115, INTR, 1)
|
||||||
|
IDT(116, INTR, 1); IDT(117, INTR, 1); IDT(118, INTR, 1); IDT(119, INTR, 1)
|
||||||
|
IDT(120, INTR, 1); IDT(121, INTR, 1); IDT(122, INTR, 1); IDT(123, INTR, 1)
|
||||||
|
IDT(124, INTR, 1); IDT(125, INTR, 1); IDT(126, INTR, 1); IDT(127, INTR, 1)
|
||||||
|
IDT(128, INTR, 1); IDT(129, INTR, 1); IDT(130, INTR, 1); IDT(131, INTR, 1)
|
||||||
|
IDT(132, INTR, 1); IDT(133, INTR, 1); IDT(134, INTR, 1); IDT(135, INTR, 1)
|
||||||
|
IDT(136, INTR, 1); IDT(137, INTR, 1); IDT(138, INTR, 1); IDT(139, INTR, 1)
|
||||||
|
IDT(140, INTR, 1); IDT(141, INTR, 1); IDT(142, INTR, 1); IDT(143, INTR, 1)
|
||||||
|
IDT(144, INTR, 1); IDT(145, INTR, 1); IDT(146, INTR, 1); IDT(147, INTR, 1)
|
||||||
|
IDT(148, INTR, 1); IDT(149, INTR, 1); IDT(150, INTR, 1); IDT(151, INTR, 1)
|
||||||
|
IDT(152, INTR, 1); IDT(153, INTR, 1); IDT(154, INTR, 1); IDT(155, INTR, 1)
|
||||||
|
IDT(156, INTR, 1); IDT(157, INTR, 1); IDT(158, INTR, 1); IDT(159, INTR, 1)
|
||||||
|
IDT(160, INTR, 1); IDT(161, INTR, 1); IDT(162, INTR, 1); IDT(163, INTR, 1)
|
||||||
|
IDT(164, INTR, 1); IDT(165, INTR, 1); IDT(166, INTR, 1); IDT(167, INTR, 1)
|
||||||
|
IDT(168, INTR, 1); IDT(169, INTR, 1); IDT(170, INTR, 1); IDT(171, INTR, 1)
|
||||||
|
IDT(172, INTR, 1); IDT(173, INTR, 1); IDT(174, INTR, 1); IDT(175, INTR, 1)
|
||||||
|
IDT(176, INTR, 1); IDT(177, INTR, 1); IDT(178, INTR, 1); IDT(179, INTR, 1)
|
||||||
|
IDT(180, INTR, 1); IDT(181, INTR, 1); IDT(182, INTR, 1); IDT(183, INTR, 1)
|
||||||
|
IDT(184, INTR, 1); IDT(185, INTR, 1); IDT(186, INTR, 1); IDT(187, INTR, 1)
|
||||||
|
IDT(188, INTR, 1); IDT(189, INTR, 1); IDT(190, INTR, 1); IDT(191, INTR, 1)
|
||||||
|
IDT(192, INTR, 1); IDT(193, INTR, 1); IDT(194, INTR, 1); IDT(195, INTR, 1)
|
||||||
|
IDT(196, INTR, 1); IDT(197, INTR, 1); IDT(198, INTR, 1); IDT(199, INTR, 1)
|
||||||
|
IDT(200, INTR, 1); IDT(201, INTR, 1); IDT(202, INTR, 1); IDT(203, INTR, 1)
|
||||||
|
IDT(204, INTR, 1); IDT(205, INTR, 1); IDT(206, INTR, 1); IDT(207, INTR, 1)
|
||||||
|
IDT(208, INTR, 1); IDT(209, INTR, 1); IDT(210, INTR, 1); IDT(211, INTR, 1)
|
||||||
|
IDT(212, INTR, 1); IDT(213, INTR, 1); IDT(214, INTR, 1); IDT(215, INTR, 1)
|
||||||
|
IDT(216, INTR, 1); IDT(217, INTR, 1); IDT(218, INTR, 1); IDT(219, INTR, 1)
|
||||||
|
IDT(220, INTR, 1); IDT(221, INTR, 1); IDT(222, INTR, 1); IDT(223, INTR, 1)
|
||||||
|
IDT(224, INTR, 1); IDT(225, INTR, 1); IDT(226, INTR, 1); IDT(227, INTR, 1)
|
||||||
|
IDT(228, INTR, 1); IDT(229, INTR, 1); IDT(230, INTR, 1); IDT(231, INTR, 1)
|
||||||
|
IDT(232, INTR, 1); IDT(233, INTR, 1); IDT(234, INTR, 1); IDT(235, INTR, 1)
|
||||||
|
IDT(236, INTR, 1); IDT(237, INTR, 1); IDT(238, INTR, 1); IDT(239, INTR, 1)
|
||||||
|
IDT(240, INTR, 1); IDT(241, INTR, 1); IDT(242, INTR, 1); IDT(243, INTR, 1)
|
||||||
|
IDT(244, INTR, 1); IDT(245, INTR, 1); IDT(246, INTR, 1); IDT(247, INTR, 1)
|
||||||
|
IDT(248, INTR, 1); IDT(249, INTR, 1); IDT(250, INTR, 1); IDT(251, INTR, 1)
|
||||||
|
IDT(252, INTR, 1); IDT(253, INTR, 1); IDT(254, INTR, 1); IDT(255, INTR, 1)
|
||||||
|
|
||||||
|
idt48:
|
||||||
|
.word (idt48 - idt - 1)
|
||||||
|
.long idt
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Page tables. Long mode requires them, but we don't implement any memory
|
* Page tables. Long mode requires them, but we don't implement any memory
|
||||||
* protection yet, so these simply identity-map the first 4GB w/ 1GB pages.
|
* protection yet, so these simply identity-map the first 4GB w/ 1GB pages.
|
||||||
|
@ -648,6 +563,98 @@ pdp: .long 0x00000183 /* 0x183 = G, 1GB, R/W, P */
|
||||||
.long 0
|
.long 0
|
||||||
.fill 4064, 1, 0
|
.fill 4064, 1, 0
|
||||||
|
|
||||||
|
.section .lodata,"ad"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GDT - a single GDT is shared by all threads (and, eventually, all CPUs).
|
||||||
|
* This layout must agree with the selectors in intel64/kernel_arch_data.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
|
||||||
|
gdt:
|
||||||
|
.word 0, 0, 0, 0 /* 0x00: null descriptor */
|
||||||
|
.word 0xFFFF, 0, 0x9A00, 0x00CF /* 0x08: 32-bit kernel code */
|
||||||
|
.word 0xFFFF, 0, 0x9200, 0x00CF /* 0x10: 32-bit kernel data */
|
||||||
|
.word 0, 0, 0x9800, 0x0020 /* 0x18: 64-bit kernel code */
|
||||||
|
.word 0, 0, 0x9200, 0x0000 /* 0x20: 64-bit kernel data */
|
||||||
|
|
||||||
|
.word 0, 0, 0, 0 /* 0x28: unused */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CPU 0 task state segment descriptors
|
||||||
|
*/
|
||||||
|
|
||||||
|
.word 0 /* 0x30: 64-bit TSS data (for GS) */
|
||||||
|
.word tss0
|
||||||
|
.word 0x9200
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.word 0, 0, 0, 0 /* 0x38: unused */
|
||||||
|
|
||||||
|
.word __X86_TSS64_SIZEOF-1 /* 0x40: 64-bit TSS (16-byte entry) */
|
||||||
|
.word tss0
|
||||||
|
.word 0x8900
|
||||||
|
.word 0, 0, 0, 0, 0
|
||||||
|
|
||||||
|
#if CONFIG_MP_NUM_CPUS > 1
|
||||||
|
/*
|
||||||
|
* CPU 1 task state segment descriptors
|
||||||
|
*/
|
||||||
|
|
||||||
|
.word 0 /* 0x50: 64-bit TSS data (for GS) */
|
||||||
|
.word tss1
|
||||||
|
.word 0x9200
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.word 0, 0, 0, 0 /* 0x58: unused */
|
||||||
|
|
||||||
|
.word __X86_TSS64_SIZEOF-1 /* 0x60: 64-bit TSS (16-byte entry) */
|
||||||
|
.word tss1
|
||||||
|
.word 0x8900
|
||||||
|
.word 0, 0, 0, 0, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_MP_NUM_CPUS > 2
|
||||||
|
/*
|
||||||
|
* CPU 2 task state segment descriptors
|
||||||
|
*/
|
||||||
|
|
||||||
|
.word 0 /* 0x70: 64-bit TSS data (for GS) */
|
||||||
|
.word tss2
|
||||||
|
.word 0x9200
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.word 0, 0, 0, 0 /* 0x78: unused */
|
||||||
|
|
||||||
|
.word __X86_TSS64_SIZEOF-1 /* 0x80: 64-bit TSS (16-byte entry) */
|
||||||
|
.word tss2
|
||||||
|
.word 0x8900
|
||||||
|
.word 0, 0, 0, 0, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_MP_NUM_CPUS > 3
|
||||||
|
/*
|
||||||
|
* CPU 3 task state segment descriptors
|
||||||
|
*/
|
||||||
|
|
||||||
|
.word 0 /* 0x90: 64-bit TSS data (for GS) */
|
||||||
|
.word tss3
|
||||||
|
.word 0x9200
|
||||||
|
.word 0
|
||||||
|
|
||||||
|
.word 0, 0, 0, 0 /* 0x98: unused */
|
||||||
|
|
||||||
|
.word __X86_TSS64_SIZEOF-1 /* 0xA0: 64-bit TSS (16-byte entry) */
|
||||||
|
.word tss3
|
||||||
|
.word 0x8900
|
||||||
|
.word 0, 0, 0, 0, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gdt48:
|
||||||
|
.word (gdt48 - gdt - 1)
|
||||||
|
.long gdt
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Known-good stack for handling CPU exceptions.
|
* Known-good stack for handling CPU exceptions.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -27,10 +27,18 @@ SECTIONS
|
||||||
_locore_start = .;
|
_locore_start = .;
|
||||||
*(.locore)
|
*(.locore)
|
||||||
*(.locore.*)
|
*(.locore.*)
|
||||||
|
_lorodata_start = .;
|
||||||
|
*(.lorodata)
|
||||||
|
_lodata_start = .;
|
||||||
*(.tss)
|
*(.tss)
|
||||||
_locore_end = .;
|
*(.lodata)
|
||||||
|
_lodata_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_locore_size = _lorodata_start - _locore_start;
|
||||||
|
_lorodata_size = _lodata_start - _lorodata_start;
|
||||||
|
_lodata_size = _lodata_end - _lodata_start;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The rest of the system is loaded in "normal" memory (typically
|
* The rest of the system is loaded in "normal" memory (typically
|
||||||
* placed above 1MB to avoid the by memory hole at 0x90000-0xFFFFF).
|
* placed above 1MB to avoid the by memory hole at 0x90000-0xFFFFF).
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue