Use memory region map to discover the memory
This commit is contained in:
@ -2,8 +2,10 @@ dir_mm1 := $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
|
||||
|
||||
c_files += $(dir_mm1)/pmm.c \
|
||||
$(dir_mm1)/bba.c \
|
||||
$(dir_mm1)/liballoc.c
|
||||
$(dir_mm1)/liballoc.c \
|
||||
$(dir_mm1)/mregmap.c
|
||||
|
||||
o_files += $(dir_mm1)/pmm.o \
|
||||
$(dir_mm1)/bba.o \
|
||||
$(dir_mm1)/liballoc.o
|
||||
$(dir_mm1)/liballoc.o \
|
||||
$(dir_mm1)/mregmap.o
|
||||
|
||||
68
kernel/mm/mregmap.c
Normal file
68
kernel/mm/mregmap.c
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
Copyright 2025 Kamil Kowalczyk
|
||||
|
||||
Redistribution and use in source and binary forms, with or
|
||||
without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <libk/types.h>
|
||||
#include <libk/bitmap.h>
|
||||
#include <mm/mregmap.h>
|
||||
|
||||
static struct mregmap mregmap;
|
||||
|
||||
struct mregmap *mregmap_get(void) { return &mregmap; }
|
||||
|
||||
void mregmap_init(void) {
|
||||
bitmap_init(&mregmap.bm, (byte_t *)mregmap.bm_mem, MREGMAP_MAX);
|
||||
}
|
||||
|
||||
bool_t mregmap_add_region(struct mreg *mreg) {
|
||||
bool_t ret = true;
|
||||
|
||||
for (usize_t i = 0; i < MREGMAP_MAX; i++) {
|
||||
if (!bitmap_test(&mregmap.bm, i)) {
|
||||
mregmap.mregs[i] = *mreg;
|
||||
bitmap_set(&mregmap.bm, i);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
ret = false;
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct mreg *mregmap_first_avail(void) {
|
||||
for (usize_t i = 0; i < MREGMAP_MAX; i++) {
|
||||
if (mregmap.mregs[i].type == MREG_AVAIL_RAM) {
|
||||
return &mregmap.mregs[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
66
kernel/mm/mregmap.h
Normal file
66
kernel/mm/mregmap.h
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright 2025 Kamil Kowalczyk
|
||||
|
||||
Redistribution and use in source and binary forms, with or
|
||||
without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _MM_MREGMAP_H
|
||||
#define _MM_MREGMAP_H
|
||||
|
||||
#include <libk/types.h>
|
||||
#include <libk/bitmap.h>
|
||||
|
||||
enum {
|
||||
MREG_AVAIL_RAM = 1, /* available ram */
|
||||
/* i386 PC */
|
||||
MREG_I386_PC_RESERVED = 2, /* reserved by hardware/firmware */
|
||||
MREG_ACPI = 3, /* ACPI info */
|
||||
MREG_MEM_HBRNT = 4, /* must be preserved in hibernation */
|
||||
MREG_DEFCT_RMOD = 5, /* defective ram modules */
|
||||
};
|
||||
|
||||
struct mreg {
|
||||
uptr_t start;
|
||||
usize_t size;
|
||||
int type;
|
||||
};
|
||||
|
||||
#define MREGMAP_MAX 256
|
||||
|
||||
struct mregmap {
|
||||
struct mreg mregs[MREGMAP_MAX];
|
||||
byte_t bm_mem[MREGMAP_MAX];
|
||||
struct bitmap bm;
|
||||
};
|
||||
|
||||
void mregmap_init(void);
|
||||
struct mregmap *mregmap_get(void);
|
||||
bool_t mregmap_add_region(struct mreg *mreg);
|
||||
struct mreg *mregmap_first_avail(void);
|
||||
|
||||
#endif // _MM_MREGMAP_H
|
||||
@ -29,10 +29,7 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define F_MEMALIGN (1<<0)
|
||||
#define F_MEMINFO (1<<1)
|
||||
|
||||
#define FLAGS (F_MEMALIGN | F_MEMINFO)
|
||||
#define FLAGS ((1<<0) | (1<<1))
|
||||
#define MAGIC (0x1BADB002)
|
||||
#define CHECKSUM (-(MAGIC + FLAGS))
|
||||
|
||||
|
||||
@ -39,6 +39,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <mm/pmm.h>
|
||||
#include <mm/bba.h>
|
||||
#include <mm/liballoc.h>
|
||||
#include <mm/mregmap.h>
|
||||
#include <config.h>
|
||||
|
||||
extern byte_t __kernel_end;
|
||||
@ -46,19 +47,47 @@ extern byte_t __kernel_end;
|
||||
static void dump_multiboot_header(void) {
|
||||
struct multiboot *mb = multiboot_get();
|
||||
|
||||
dbgf("multiboot=%p\n", mb);
|
||||
dbgf("multiboot=%p, flags=%08x\n", mb, mb->flags);
|
||||
dbgf("multiboot sanity dump:\n");
|
||||
dbgf("flags=%08x, mem_low=%08x, mem_up=%08x\n",
|
||||
mb->flags, mb->mem_low, mb->mem_up);
|
||||
dbgf("flags=%08x, mem_lower=%08x, mem_upper=%08x\n",
|
||||
mb->flags, mb->mem_lower, mb->mem_upper);
|
||||
}
|
||||
|
||||
static void mregmap_init1(void) {
|
||||
struct multiboot *mb = multiboot_get();
|
||||
|
||||
struct multiboot_mmap_entry *mmap;
|
||||
for (mmap = (struct multiboot_mmap_entry *)(mb->mmap_addr + VIRT_BASE);
|
||||
(uptr_t)mmap < (mb->mmap_addr + VIRT_BASE + mb->mmap_length);
|
||||
mmap = (struct multiboot_mmap_entry *)((uptr_t)mmap + mmap->size + sizeof(mmap->size))) {
|
||||
dbgf("mmap entry: size=%08x, addr=%08x, len=%08x, type=%u\n",
|
||||
mmap->size, mmap->addr1, mmap->len1, mmap->type);
|
||||
|
||||
static int type_map[] = {
|
||||
[1] = MREG_AVAIL_RAM,
|
||||
[2] = MREG_I386_PC_RESERVED,
|
||||
[3] = MREG_ACPI,
|
||||
[4] = MREG_MEM_HBRNT,
|
||||
[5] = MREG_DEFCT_RMOD,
|
||||
};
|
||||
|
||||
struct mreg mreg = {
|
||||
.start = (uptr_t)mmap->addr1,
|
||||
.size = (usize_t)mmap->len1,
|
||||
.type = type_map[mmap->type],
|
||||
};
|
||||
|
||||
mregmap_add_region(&mreg);
|
||||
}
|
||||
}
|
||||
|
||||
static void pmm_init1(void) {
|
||||
struct multiboot *mb = multiboot_get();
|
||||
|
||||
dbgf("__kernel_end=%p, %p\n", &__kernel_end, (uptr_t)&__kernel_end - VIRT_BASE);
|
||||
struct mreg *avail_ram = mregmap_first_avail();
|
||||
|
||||
usize_t usable_ram_bytes = mb->mem_up * 1024;
|
||||
dbgf("usable ram = %zu\n", usable_ram_bytes);
|
||||
usize_t usable_ram_bytes = avail_ram->size;
|
||||
dbgf("usable ram = %08x\n", usable_ram_bytes);
|
||||
|
||||
uptr_t ram_start = ALIGN_UP((uptr_t)&__kernel_end - VIRT_BASE, 0x1000);
|
||||
uptr_t ram_end = ALIGN_DOWN(0x100000 + usable_ram_bytes, 0x1000);
|
||||
@ -89,6 +118,7 @@ void bootmain(void *mbootptr) {
|
||||
#endif
|
||||
|
||||
dump_multiboot_header();
|
||||
mregmap_init1();
|
||||
pmm_init1();
|
||||
bba_init();
|
||||
mm_init();
|
||||
|
||||
@ -77,10 +77,8 @@ void mm_map_page(struct page_dir *pd, uptr_t vaddr, uptr_t paddr, uint32_t flags
|
||||
if (!(pd->pd[pd_idx] & PF_PRESENT)) {
|
||||
pt = (volatile uint32_t *)bba_alloc();
|
||||
if (pt == 0) {
|
||||
if (flags & PF_LOCK)
|
||||
sl_unlock(&pd->sl);
|
||||
dbgf("mm_map_page(): run out of BBA memory to alloc a PD\n");
|
||||
return;
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (usize_t i = 0; i < PAGE_SIZE/sizeof(uint32_t); i++)
|
||||
@ -94,6 +92,7 @@ void mm_map_page(struct page_dir *pd, uptr_t vaddr, uptr_t paddr, uint32_t flags
|
||||
|
||||
pt[pt_idx] = (paddr & ~(PAGE_SIZE - 1)) | (flags & ~PF_LOCK);
|
||||
|
||||
done:
|
||||
if (flags & PF_LOCK)
|
||||
sl_unlock(&pd->sl);
|
||||
}
|
||||
@ -107,9 +106,7 @@ void mm_unmap_page(struct page_dir *pd, uptr_t vaddr, uint32_t flags) {
|
||||
volatile uint32_t *pt;
|
||||
|
||||
if (!(pd->pd[pd_idx] & PF_PRESENT)) {
|
||||
if (flags & PF_LOCK)
|
||||
sl_unlock(&pd->sl);
|
||||
return;
|
||||
goto done;
|
||||
} else {
|
||||
uptr_t pt_phys = pd->pd[pd_idx] & ~(PAGE_SIZE - 1);
|
||||
pt = (volatile uint32_t *)(pt_phys + VIRT_BASE);
|
||||
@ -119,6 +116,7 @@ void mm_unmap_page(struct page_dir *pd, uptr_t vaddr, uint32_t flags) {
|
||||
|
||||
__asm__ volatile ("invlpg (%0)" :: "r"(vaddr) : "memory");
|
||||
|
||||
done:
|
||||
if (flags & PF_LOCK)
|
||||
sl_unlock(&pd->sl);
|
||||
}
|
||||
|
||||
@ -49,6 +49,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
it would be inefficient to constantly (un)lock. */
|
||||
|
||||
#define KERNEL_HEAP_START 0xF0000000
|
||||
#define MEM_PROBE_HEAP_START 0xE0000000
|
||||
|
||||
struct page_dir {
|
||||
volatile uint32_t *pd;
|
||||
|
||||
@ -35,12 +35,256 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <libk/types.h>
|
||||
#include <libk/compiler.h>
|
||||
|
||||
struct multiboot {
|
||||
uint32_t flags;
|
||||
uint32_t mem_low;
|
||||
uint32_t mem_up;
|
||||
uint32_t boot_dev;
|
||||
/* How many bytes from the start of the file we search for the header. */
|
||||
#define MULTIBOOT_SEARCH 8192
|
||||
#define MULTIBOOT_HEADER_ALIGN 4
|
||||
|
||||
/* The magic field should contain this. */
|
||||
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
|
||||
|
||||
/* This should be in %eax. */
|
||||
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
|
||||
|
||||
/* Alignment of multiboot modules. */
|
||||
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
||||
|
||||
/* Alignment of the multiboot info structure. */
|
||||
#define MULTIBOOT_INFO_ALIGN 0x00000004
|
||||
|
||||
/* Flags set in the ’flags’ member of the multiboot header. */
|
||||
|
||||
/* Align all boot modules on i386 page (4KB) boundaries. */
|
||||
#define MULTIBOOT_PAGE_ALIGN 0x00000001
|
||||
|
||||
/* Must pass memory information to OS. */
|
||||
#define MULTIBOOT_MEMORY_INFO 0x00000002
|
||||
|
||||
/* Must pass video information to OS. */
|
||||
#define MULTIBOOT_VIDEO_MODE 0x00000004
|
||||
|
||||
/* This flag indicates the use of the address fields in the header. */
|
||||
#define MULTIBOOT_AOUT_KLUDGE 0x00010000
|
||||
|
||||
/* Flags to be set in the ’flags’ member of the multiboot info structure. */
|
||||
|
||||
/* is there basic lower/upper memory information? */
|
||||
#define MULTIBOOT_INFO_MEMORY 0x00000001
|
||||
/* is there a boot device set? */
|
||||
#define MULTIBOOT_INFO_BOOTDEV 0x00000002
|
||||
/* is the command-line defined? */
|
||||
#define MULTIBOOT_INFO_CMDLINE 0x00000004
|
||||
/* are there modules to do something with? */
|
||||
#define MULTIBOOT_INFO_MODS 0x00000008
|
||||
|
||||
/* These next two are mutually exclusive */
|
||||
|
||||
/* is there a symbol table loaded? */
|
||||
#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010
|
||||
/* is there an ELF section header table? */
|
||||
#define MULTIBOOT_INFO_ELF_SHDR 0X00000020
|
||||
|
||||
/* is there a full memory map? */
|
||||
#define MULTIBOOT_INFO_MEM_MAP 0x00000040
|
||||
|
||||
/* Is there drive info? */
|
||||
#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080
|
||||
|
||||
/* Is there a config table? */
|
||||
#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100
|
||||
|
||||
/* Is there a boot loader name? */
|
||||
#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200
|
||||
|
||||
/* Is there a APM table? */
|
||||
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
|
||||
|
||||
/* Is there video information? */
|
||||
#define MULTIBOOT_INFO_VBE_INFO 0x00000800
|
||||
#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000
|
||||
|
||||
#ifndef ASM_FILE
|
||||
|
||||
typedef unsigned char multiboot_uint8_t;
|
||||
typedef unsigned short multiboot_uint16_t;
|
||||
typedef unsigned int multiboot_uint32_t;
|
||||
typedef unsigned long long multiboot_uint64_t;
|
||||
|
||||
struct multiboot_header
|
||||
{
|
||||
/* Must be MULTIBOOT_MAGIC - see above. */
|
||||
multiboot_uint32_t magic;
|
||||
|
||||
/* Feature flags. */
|
||||
multiboot_uint32_t flags;
|
||||
|
||||
/* The above fields plus this one must equal 0 mod 2^32. */
|
||||
multiboot_uint32_t checksum;
|
||||
|
||||
/* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
|
||||
multiboot_uint32_t header_addr;
|
||||
multiboot_uint32_t load_addr;
|
||||
multiboot_uint32_t load_end_addr;
|
||||
multiboot_uint32_t bss_end_addr;
|
||||
multiboot_uint32_t entry_addr;
|
||||
|
||||
/* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
|
||||
multiboot_uint32_t mode_type;
|
||||
multiboot_uint32_t width;
|
||||
multiboot_uint32_t height;
|
||||
multiboot_uint32_t depth;
|
||||
};
|
||||
|
||||
/* The symbol table for a.out. */
|
||||
struct multiboot_aout_symbol_table
|
||||
{
|
||||
multiboot_uint32_t tabsize;
|
||||
multiboot_uint32_t strsize;
|
||||
multiboot_uint32_t addr;
|
||||
multiboot_uint32_t reserved;
|
||||
};
|
||||
typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
|
||||
|
||||
/* The section header table for ELF. */
|
||||
struct multiboot_elf_section_header_table
|
||||
{
|
||||
multiboot_uint32_t num;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t addr;
|
||||
multiboot_uint32_t shndx;
|
||||
};
|
||||
typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
|
||||
|
||||
struct multiboot
|
||||
{
|
||||
/* Multiboot info version number */
|
||||
multiboot_uint32_t flags;
|
||||
|
||||
/* Available memory from BIOS */
|
||||
multiboot_uint32_t mem_lower;
|
||||
multiboot_uint32_t mem_upper;
|
||||
|
||||
/* "root" partition */
|
||||
multiboot_uint32_t boot_device;
|
||||
|
||||
/* Kernel command line */
|
||||
multiboot_uint32_t cmdline;
|
||||
|
||||
/* Boot-Module list */
|
||||
multiboot_uint32_t mods_count;
|
||||
multiboot_uint32_t mods_addr;
|
||||
|
||||
union
|
||||
{
|
||||
multiboot_aout_symbol_table_t aout_sym;
|
||||
multiboot_elf_section_header_table_t elf_sec;
|
||||
} u;
|
||||
|
||||
/* Memory Mapping buffer */
|
||||
multiboot_uint32_t mmap_length;
|
||||
multiboot_uint32_t mmap_addr;
|
||||
|
||||
/* Drive Info buffer */
|
||||
multiboot_uint32_t drives_length;
|
||||
multiboot_uint32_t drives_addr;
|
||||
|
||||
/* ROM configuration table */
|
||||
multiboot_uint32_t config_table;
|
||||
|
||||
/* Boot Loader Name */
|
||||
multiboot_uint32_t boot_loader_name;
|
||||
|
||||
/* APM table */
|
||||
multiboot_uint32_t apm_table;
|
||||
|
||||
/* Video */
|
||||
multiboot_uint32_t vbe_control_info;
|
||||
multiboot_uint32_t vbe_mode_info;
|
||||
multiboot_uint16_t vbe_mode;
|
||||
multiboot_uint16_t vbe_interface_seg;
|
||||
multiboot_uint16_t vbe_interface_off;
|
||||
multiboot_uint16_t vbe_interface_len;
|
||||
|
||||
multiboot_uint64_t framebuffer_addr;
|
||||
multiboot_uint32_t framebuffer_pitch;
|
||||
multiboot_uint32_t framebuffer_width;
|
||||
multiboot_uint32_t framebuffer_height;
|
||||
multiboot_uint8_t framebuffer_bpp;
|
||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
||||
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
|
||||
multiboot_uint8_t framebuffer_type;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
multiboot_uint32_t framebuffer_palette_addr;
|
||||
multiboot_uint16_t framebuffer_palette_num_colors;
|
||||
};
|
||||
struct
|
||||
{
|
||||
multiboot_uint8_t framebuffer_red_field_position;
|
||||
multiboot_uint8_t framebuffer_red_mask_size;
|
||||
multiboot_uint8_t framebuffer_green_field_position;
|
||||
multiboot_uint8_t framebuffer_green_mask_size;
|
||||
multiboot_uint8_t framebuffer_blue_field_position;
|
||||
multiboot_uint8_t framebuffer_blue_mask_size;
|
||||
};
|
||||
};
|
||||
};
|
||||
typedef struct multiboot multiboot_t;
|
||||
|
||||
struct multiboot_color
|
||||
{
|
||||
multiboot_uint8_t red;
|
||||
multiboot_uint8_t green;
|
||||
multiboot_uint8_t blue;
|
||||
};
|
||||
|
||||
struct multiboot_mmap_entry
|
||||
{
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t addr1;
|
||||
multiboot_uint32_t addr2;
|
||||
multiboot_uint32_t len1;
|
||||
multiboot_uint32_t len2;
|
||||
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
||||
#define MULTIBOOT_MEMORY_RESERVED 2
|
||||
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
|
||||
#define MULTIBOOT_MEMORY_NVS 4
|
||||
#define MULTIBOOT_MEMORY_BADRAM 5
|
||||
multiboot_uint32_t type;
|
||||
} packed;
|
||||
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
||||
|
||||
struct multiboot_mod_list
|
||||
{
|
||||
/* the memory used goes from bytes ’mod_start’ to ’mod_end-1’ inclusive */
|
||||
multiboot_uint32_t mod_start;
|
||||
multiboot_uint32_t mod_end;
|
||||
|
||||
/* Module command line */
|
||||
multiboot_uint32_t cmdline;
|
||||
|
||||
/* padding to take it to 16 bytes (must be zero) */
|
||||
multiboot_uint32_t pad;
|
||||
};
|
||||
typedef struct multiboot_mod_list multiboot_module_t;
|
||||
|
||||
/* APM BIOS info. */
|
||||
struct multiboot_apm_info
|
||||
{
|
||||
multiboot_uint16_t version;
|
||||
multiboot_uint16_t cseg;
|
||||
multiboot_uint32_t offset;
|
||||
multiboot_uint16_t cseg_16;
|
||||
multiboot_uint16_t dseg;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint16_t cseg_len;
|
||||
multiboot_uint16_t cseg_16_len;
|
||||
multiboot_uint16_t dseg_len;
|
||||
};
|
||||
|
||||
#endif /* ! ASM_FILE */
|
||||
|
||||
void multiboot_set(struct multiboot *mb);
|
||||
struct multiboot *multiboot_get(void);
|
||||
|
||||
@ -8,7 +8,7 @@ boot ?= iso
|
||||
|
||||
qemu_extra ?=
|
||||
|
||||
qemu_opts := -M pc \
|
||||
qemu_opts := -M pc -cpu pentium \
|
||||
-serial mon:stdio \
|
||||
$(QEMU_EXTRA)
|
||||
|
||||
@ -34,8 +34,7 @@ i386_pc_prepdirs:
|
||||
mkdir -p $(srctree)/out/i386_pc/tmp
|
||||
|
||||
i386_pc_images: i386_pc_cleandirs i386_pc_prepdirs \
|
||||
$(srctree)/out/i386_pc/mop3.iso \
|
||||
$(srctree)/out/i386_pc/mop3.img
|
||||
$(srctree)/out/i386_pc/mop3.iso
|
||||
|
||||
platform_clean: i386_pc_cleandirs
|
||||
-rm -f $(srctree)/out/i386_pc/mop3.iso \
|
||||
|
||||
Reference in New Issue
Block a user