/* * Copyright (c) 2010-2016 Richard Braun. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef X86_BIOSMEM_H #define X86_BIOSMEM_H #include #include #include #include /* * BIOS Data Area. */ #define BIOSMEM_BDA_ADDR 0x400 #define BIOSMEM_BDA_SIZE 0x100 /* * Address where the address of the Extended BIOS Data Area segment can be * found. */ #define BIOSMEM_EBDA_PTR 0x40e /* * Significant low memory addresses. * * The first 64 KiB are reserved for various reasons (e.g. to preserve BIOS * data and to work around data corruption on some hardware). */ #define BIOSMEM_BASE 0x010000 #define BIOSMEM_BASE_END 0x0a0000 #define BIOSMEM_EXT_ROM 0x0e0000 #define BIOSMEM_ROM 0x0f0000 #define BIOSMEM_END 0x100000 /* * Report reserved addresses to the biosmem module. * * Once all boot data have been registered, the user can set up the * early page allocator. * * If the range is marked temporary, it will be unregistered once * the boot data have been saved/consumed so that their backing * pages are loaded into the VM system. * * This function is called before paging is enabled. */ void biosmem_register_boot_data(phys_addr_t start, phys_addr_t end, bool temporary); /* * Initialize the early page allocator. * * This function uses the memory map provided by the boot loader along * with the registered boot data addresses to set up a heap of free pages * of physical memory. * * This function is called before paging is enabled. */ void biosmem_bootstrap(const struct multiboot_raw_info *mbi); /* * Allocate contiguous physical pages during bootstrap. * * The pages returned are guaranteed to be part of the direct physical * mapping when paging is enabled. * * This function should only be used to allocate initial page table pages. * Those pages are later loaded into the VM system (as reserved pages) * which means they can be freed like other regular pages. Users should * fix up the type of those pages once the VM system is initialized. * * This function is called before paging is enabled. */ void * biosmem_bootalloc(unsigned int nr_pages); /* * Return a pointer to a copy of the BIOS Data Area. * * The region denoted by the returned address is of size BIOSMEM_BDA_SIZE, * and is only valid during initialization. */ const void * biosmem_get_bda(void); /* * Return the limit of physical memory that can be directly mapped. */ phys_addr_t biosmem_directmap_end(void); /* * This init operation provides : * - heaps of physical memory are loaded by the VM system */ INIT_OP_DECLARE(biosmem_setup); #endif /* X86_BIOSMEM_H */