From 99b8fc4408c98b11528eb5159c53c60c76452dcb Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 5 Jul 2016 15:58:46 +0200 Subject: [PATCH] sel4: enable vesa driver kernel : add required and reserved boot regions to device memory Issue #2044 --- repos/base-sel4/mk/spec/sel4_x86_32.mk | 2 +- repos/base-sel4/patches/dev_mem.patch | 83 ++++++++++++++++++++++++++ repos/base-sel4/ports/sel4.hash | 2 +- repos/base-sel4/src/core/platform.cc | 5 +- 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 repos/base-sel4/patches/dev_mem.patch diff --git a/repos/base-sel4/mk/spec/sel4_x86_32.mk b/repos/base-sel4/mk/spec/sel4_x86_32.mk index 28f4105a1..72e22c649 100644 --- a/repos/base-sel4/mk/spec/sel4_x86_32.mk +++ b/repos/base-sel4/mk/spec/sel4_x86_32.mk @@ -2,7 +2,7 @@ # Specifics for the seL4 kernel API x86 32 bit # -SPECS += sel4 x86_32 ps2 +SPECS += sel4 x86_32 ps2 vesa framebuffer include $(call select_from_repositories,mk/spec/x86_32.mk) include $(call select_from_repositories,mk/spec/sel4.mk) diff --git a/repos/base-sel4/patches/dev_mem.patch b/repos/base-sel4/patches/dev_mem.patch new file mode 100644 index 000000000..137a6097f --- /dev/null +++ b/repos/base-sel4/patches/dev_mem.patch @@ -0,0 +1,83 @@ +--- src/kernel/sel4/src/arch/x86/kernel/boot_sys.c ++++ src/kernel/sel4/src/arch/x86/kernel/boot_sys.c +@@ -294,9 +294,11 @@ parse_mem_map(uint32_t mmap_length, uint32_t mmap_addr) + multiboot_mmap_t *mmap = (multiboot_mmap_t *)((word_t)mmap_addr); + printf("Parsing GRUB physical memory map\n"); + ++ p_region_t bios_area = { .start = BIOS_PADDR_START, .end = BIOS_PADDR_END }; ++ + while ((word_t)mmap < (word_t)(mmap_addr + mmap_length)) { +- uint64_t mem_start = mmap->base_addr; +- uint64_t mem_length = mmap->length; ++ uint64_t mem_start = mmap->base_addr & ~0xFFFUL; ++ uint64_t mem_length = (mmap->length + (mmap->base_addr & 0xFFFUL)) & ~0xFFFUL; + uint32_t type = mmap->type; + if (mem_start != (uint64_t)(word_t)mem_start) { + printf("\tPhysical memory region not addressable\n"); +@@ -307,9 +309,46 @@ parse_mem_map(uint32_t mmap_length, uint32_t mmap_addr) + mem_start, mem_start + mem_length + }); + } ++ if (type == MULTIBOOT_MMAP_RESERVED_TYPE) { ++ p_region_t reg = { .start = mem_start, .end = mem_start + mem_length}; ++ ++ bool_t const inside_start = bios_area.start <= reg.start && reg.start < bios_area.end; ++ bool_t const inside_end = bios_area.start < reg.end && reg.end <= bios_area.end; ++ ++ /* trim BIOS area if we detect overlaps */ ++ if (!inside_start && !inside_end && ++ (reg.start <= bios_area.start && bios_area.start < reg.end)) ++ bios_area.start = bios_area.end; ++ else ++ if (inside_start && inside_end) { ++ p_region_t tail = { .start = reg.end, .end = bios_area.end }; ++ if (tail.start < tail.end) ++ insert_dev_p_reg(tail); ++ ++ bios_area.end = reg.start; ++ } else { ++ if (inside_start) ++ bios_area.end = reg.start; ++ if (inside_end) ++ bios_area.start = reg.end; ++ } ++ ++ insert_dev_p_reg(reg); ++ } + } + mmap++; + } ++ ++ /* first physical page - required by acpi drivers and vesa drivers */ ++ insert_dev_p_reg((p_region_t) { .start = 0, .end = 0x1000 }); ++ ++ /* bios data area - required by acpi drivers */ ++ if (bios_area.start < bios_area.end) ++ insert_dev_p_reg(bios_area); ++ ++ /* check this XXX - vesa driver requires the regions on Qemu XXX */ ++ insert_dev_p_reg((p_region_t) { .start = BIOS_PADDR_IVDEO_RAM_END, .end = BIOS_PADDR_START }); ++ insert_dev_p_reg((p_region_t) { .start = BIOS_PADDR_VIDEO_RAM_START, .end = BIOS_PADDR_VIDEO_RAM_START + 0x8000 }); + } + + static BOOT_CODE bool_t +@@ -348,6 +387,9 @@ try_boot_sys( + /* copy CPU bootup code to lower memory */ + memcpy((void*)BOOT_NODE_PADDR, boot_cpu_start, boot_cpu_end - boot_cpu_start); + ++ /* Prepare for accepting device regions from here on */ ++ boot_state.dev_p_regs.count = 0; ++ + boot_state.mem_p_regs.count = 0; + if (mbi->flags & MULTIBOOT_INFO_MMAP_FLAG) { + parse_mem_map(mbi->mmap_length, mbi->mmap_addr); +@@ -377,9 +419,6 @@ try_boot_sys( + pic_disable(); + } + +- /* Prepare for accepting device regions from here on */ +- boot_state.dev_p_regs.count = 0; +- + /* get ACPI root table */ + acpi_rsdt = acpi_init(); + if (!acpi_rsdt) { diff --git a/repos/base-sel4/ports/sel4.hash b/repos/base-sel4/ports/sel4.hash index da4bc27e6..0b780e975 100644 --- a/repos/base-sel4/ports/sel4.hash +++ b/repos/base-sel4/ports/sel4.hash @@ -1 +1 @@ -622f516efe02eb0b0d694d1c94b832aafa903105 +805dca7fb390b8803114548e3c3175fced0c4d58 diff --git a/repos/base-sel4/src/core/platform.cc b/repos/base-sel4/src/core/platform.cc index a1625ec75..1be84d1a5 100644 --- a/repos/base-sel4/src/core/platform.cc +++ b/repos/base-sel4/src/core/platform.cc @@ -93,7 +93,8 @@ void Platform::_init_unused_phys_alloc() /* enable log support early */ init_log(); - _unused_phys_alloc.add_range(0, ~0UL); + /* the lower physical ram is kept by the kernel and not usable to us */ + _unused_phys_alloc.add_range(0x100000, 0UL - 0x100000); } @@ -106,7 +107,7 @@ static inline void init_sel4_ipc_buffer() void Platform::_init_allocators() { /* interrupt allocator */ - _irq_alloc.add_range(0, 255); + _irq_alloc.add_range(0, 256); /* * XXX allocate intermediate CNodes for organizing the untyped pages here