2N/A/* Mmap management. */ 2N/A * GRUB -- GRand Unified Bootloader 2N/A * Copyright (C) 2009 Free Software Foundation, Inc. 2N/A * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 2N/A * GRUB is free software: you can redistribute it and/or modify 2N/A * it under the terms of the GNU General Public License as published by 2N/A * the Free Software Foundation, either version 3 of the License, or 2N/A * (at your option) any later version. 2N/A * GRUB is distributed in the hope that it will be useful, 2N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of 2N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2N/A * GNU General Public License for more details. 2N/A * You should have received a copy of the GNU General Public License 2N/A /* This function resolves overlapping regions and sorts the memory map. 2N/A It uses scanline (sweeping) algorithm. 2N/A /* If same page is used by multiple types it's resolved 2N/A according to priority: 2N/A 2 - memory usable by firmware-aware code 2N/A 4 - a range deliberately empty 2N/A /* Scanline events. */ 2N/A /* At which memory address. */ 2N/A /* 0 = region starts, 1 = region ends. */ 2N/A /* Which type of memory region? */ 2N/A /* Previous scanline event. */ 2N/A /* Current scanline event. */ 2N/A /* How many regions of given type overlap at current location? */ 2N/A /* Number of mmap chunks. */ 2N/A /* Initialize variables. */ 2N/A "couldn't allocate space for new memory map");
2N/A /* Register scanline events. */ 2N/A#
endif /* ! GRUB_MMAP_REGISTER_BY_FIRMWARE */ 2N/A /* Primitive bubble sort. It has complexity O(n^2) but since we're 2N/A unlikely to have more than 100 chunks it's probably one of the 2N/A fastest for one purpose. */ 2N/A /* Process event. */ 2N/A /* Determine current region type. */ 2N/A /* Announce region to the hook if necessary. */ 2N/A /* Update last values if necessary. */ 2N/A "couldn't allocate memory map overlay");
2N/A#
endif /* ! GRUB_MMAP_REGISTER_BY_FIRMWARE */ 2N/A /* Find first fixed bit. */ 2N/A for (i = 0; i <
64; i++)
2N/A /* How many trailing zeros? */ 2N/A /* How many zeros in mask? */ 2N/A for (i = 0; i <
64; i++)
2N/A /* Find starting value. Keep low and high such that 2N/A fill_mask (low) < addr and fill_mask (high) >= addr; 2N/A /* Parse address and mask. */ 2N/A /* When part of a page is tainted, we discard the whole of it. There's 2N/A no point in providing sub-page chunks. */ 2N/A N_(
"ADDR1,MASK1[,ADDR2,MASK2[,...]]"),
2N/A N_(
"Declare memory regions as badram."));
2N/A N_(
"FROM[K|M|G] TO[K|M|G]"),
2N/A N_(
"Remove any memory regions in specified range."));
2N/A N_(
"FROM[K|M|G] TO[K|M|G]"),
2N/A N_(
"Add an available memory region in the specified range."));