Merge mainline into boottest
This commit is contained in:
commit
de69d952cf
41 changed files with 999 additions and 302 deletions
180
ChangeLog
180
ChangeLog
|
@ -1,3 +1,183 @@
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* conf/mips.rmk (kernel_img_HEADERS): Add env_private.h
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Optimise glyph lookup by Basic Multilingual Plane lookup array.
|
||||||
|
|
||||||
|
* font/font.c (struct grub_font): New member 'bmp_idx'.
|
||||||
|
(font_init): Initialise 'bmp_idx'.
|
||||||
|
(load_font_index): Fill 'bmp_idx'.
|
||||||
|
(find_glyph): Make inline. Use bmp_idx for BMP characters.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* video/fb/video_fb.c (grub_video_fb_scroll): Optimise by avoiding
|
||||||
|
unnecessary calls.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Move context handling out of the kernel.
|
||||||
|
|
||||||
|
* conf/any-emu.rmk (grub_emu_SOURCES): Add normal/context.c.
|
||||||
|
* conf/common.rmk (normal_mod_SOURCES): Add normal/context.c.
|
||||||
|
* conf/i386-coreboot.rmk (kernel_img_HEADERS): Add env_private.h.
|
||||||
|
* conf/i386-efi.rmk: Likewise.
|
||||||
|
* conf/i386-ieee1275.rmk: Likewise.
|
||||||
|
* conf/i386-pc.rmk: Likewise.
|
||||||
|
* conf/powerpc-ieee1275.rmk: Likewise.
|
||||||
|
* conf/sparc64-ieee1275.rmk: Likewise.
|
||||||
|
* conf/x86_64-efi.rmk: Likewise.
|
||||||
|
* include/grub/env.h: Include grub/menu.h.
|
||||||
|
(grub_env_var_type): Removed.
|
||||||
|
(grub_env_var): Replaced field 'type' with 'global'.
|
||||||
|
(grub_env_find): New prototype.
|
||||||
|
(grub_env_context_open): Remove EXPORT_FUNC.
|
||||||
|
(grub_env_context_close): Likewise.
|
||||||
|
(grub_env_export): Likewise.
|
||||||
|
(grub_env_set_data_slot): Removed.
|
||||||
|
(grub_env_get_data_slot): Likewise.
|
||||||
|
(grub_env_unset_data_slot): Likewise.
|
||||||
|
(grub_env_unset_menu): New prototype.
|
||||||
|
(grub_env_set_menu): Likewise.
|
||||||
|
(grub_env_get_menu): Likewise.
|
||||||
|
* include/grub/env_private.h: New file.
|
||||||
|
* include/grub/normal.h (grub_context_init): New prototype.
|
||||||
|
(grub_context_fini): Likewise.
|
||||||
|
* kern/corecmd.c (grub_core_cmd_export): Moved from here ...
|
||||||
|
* normal/context.c (grub_cmd_export): ... to here.
|
||||||
|
* kern/env.c: Include env_private.h.
|
||||||
|
(HASHSZ): Moved to include/grub/env_private.h.
|
||||||
|
(grub_env_context): Likewise.
|
||||||
|
(grub_env_sorted_var): Likewise.
|
||||||
|
(current_context): Renamed from this ...
|
||||||
|
(grub_current_context): ...to this. 'static' removed. All users updated.
|
||||||
|
(grub_env_find): Removed 'static'.
|
||||||
|
(grub_env_context_open): Moved to normal/context.c.
|
||||||
|
(grub_env_context_close): Likewise.
|
||||||
|
(grub_env_export): Likewise.
|
||||||
|
(mangle_data_slot_name): Removed.
|
||||||
|
(grub_env_set_data_slot): Likewise.
|
||||||
|
(grub_env_get_data_slot): Likewise.
|
||||||
|
(grub_env_unset_data_slot): Likewise.
|
||||||
|
* kern/main.c (grub_set_root_dev): Don't export root.
|
||||||
|
It will be done later.
|
||||||
|
(grub_main): Don't export prefix.
|
||||||
|
It will be done later.
|
||||||
|
* normal/context.c: New file.
|
||||||
|
* normal/main.c (free_menu): Use grub_env_unset_menu.
|
||||||
|
(grub_normal_add_menu_entry): Use grub_env_get_menu.
|
||||||
|
(read_config_file): Use grub_env_get_menu and grub_env_set_menu.
|
||||||
|
(GRUB_MOD_INIT(normal)): Call grub_context_init.
|
||||||
|
(GRUB_MOD_FINI(normal)): Call grub_context_fini.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
setpci support.
|
||||||
|
|
||||||
|
* commands/setpci.c: New file.
|
||||||
|
* conf/i386.rmk (pkglib_MODULES): Add setpci.mod.
|
||||||
|
(setpci_mod_SOURCES): New variable.
|
||||||
|
(setpci_mod_CFLAGS): Likewise.
|
||||||
|
(setpci_mod_LDFLAGS): Likewise.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Byte-addressable PCI configuration space.
|
||||||
|
|
||||||
|
* bus/pci.c (grub_pci_make_address): Use byte address instead of
|
||||||
|
dword address.
|
||||||
|
(grub_pci_iterate): Use macroses GRUB_PCI_REG_PCI_ID and
|
||||||
|
GRUB_PCI_REG_CACHELINE.
|
||||||
|
* bus/usb/ohci.c (grub_ohci_pci_iter): Use macroses
|
||||||
|
GRUB_PCI_REG_CLASS and GRUB_PCI_REG_ADDRESS_REG0.
|
||||||
|
* bus/usb/uhci.c (grub_ohci_pci_iter): Use macroses
|
||||||
|
GRUB_PCI_REG_CLASS and GRUB_PCI_REG_ADDRESS_REG4.
|
||||||
|
* commands/efi/fixvideo.c (scan_card): Use macros GRUB_PCI_REG_CLASS.
|
||||||
|
* commands/efi/loadbios.c (enable_rom_area): Pass byte-address to
|
||||||
|
grub_pci_make_address.
|
||||||
|
(lock_rom_area): Likewise.
|
||||||
|
* commands/lspci.c (grub_lspci_iter): Use macroses
|
||||||
|
GRUB_PCI_REG_CLASS and GRUB_PCI_REG_ADDRESSES. Handle byte-addressing
|
||||||
|
of grub_pci_make_address.
|
||||||
|
* disk/ata.c (grub_ata_pciinit): Likewise.
|
||||||
|
* include/grub/pci.h (GRUB_PCI_REG_PCI_ID): New macro.
|
||||||
|
(GRUB_PCI_REG_VENDOR): Likewise.
|
||||||
|
(GRUB_PCI_REG_DEVICE): Likewise.
|
||||||
|
(GRUB_PCI_REG_COMMAND): Likewise.
|
||||||
|
(GRUB_PCI_REG_STATUS): Likewise.
|
||||||
|
(GRUB_PCI_REG_REVISION): Likewise.
|
||||||
|
(GRUB_PCI_REG_CLASS): Likewise.
|
||||||
|
(GRUB_PCI_REG_CACHELINE): Likewise.
|
||||||
|
(GRUB_PCI_REG_LAT_TIMER): Likewise.
|
||||||
|
(GRUB_PCI_REG_HEADER_TYPE): Likewise.
|
||||||
|
(GRUB_PCI_REG_BIST): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESSES): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESS_REG): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESS_REG): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESS_REG): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESS_REG): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESS_REG): Likewise.
|
||||||
|
(GRUB_PCI_REG_ADDRESS_REG): Likewise.
|
||||||
|
(GRUB_PCI_REG_CIS_POINTER): Likewise.
|
||||||
|
(GRUB_PCI_REG_SUBVENDOR): Likewise.
|
||||||
|
(GRUB_PCI_REG_SUBSYSTEM): Likewise.
|
||||||
|
(GRUB_PCI_REG_ROM_ADDRESS): Likewise.
|
||||||
|
(GRUB_PCI_REG_CAP_POINTER): Likewise.
|
||||||
|
(GRUB_PCI_REG_IRQ_LINE): Likewise.
|
||||||
|
(GRUB_PCI_REG_IRQ_PIN): Likewise.
|
||||||
|
(GRUB_PCI_REG_MIN_GNT): Likewise.
|
||||||
|
(GRUB_PCI_REG_MAX_LAT): Likewise.
|
||||||
|
* loader/i386/efi/linux.c (find_framebuf): Use GRUB_PCI_REG_CLASS.
|
||||||
|
* loader/i386/efi/xnu.c (find_framebuf): Likewise.
|
||||||
|
* video/efi_uga.c (find_framebuf): Likewise.
|
||||||
|
* video/sm712.c (grub_video_sm712_setup): Likewise.
|
||||||
|
* util/pci.c (grub_pci_make_address): Use byte-addressed configuration
|
||||||
|
space.
|
||||||
|
|
||||||
|
2010-01-20 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* util/grub.d/10_linux.in (linux_entry): Set gfxpayload=keep when it
|
||||||
|
can be reliably determined to be supported.
|
||||||
|
|
||||||
|
2010-01-20 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* loader/i386/linux.c (grub_cmd_linux): If `vga=' was used, write down
|
||||||
|
that VESA is supported.
|
||||||
|
(grub_linux_boot): Use generic framebuffer unless VESA is known to be
|
||||||
|
supported.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* conf/common.rmk (font/font.c_DEPENDENCIES): Condition on FONT_SOURCE.
|
||||||
|
|
||||||
|
2010-01-20 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* util/misc.c (make_system_path_relative_to_its_root): Work around
|
||||||
|
special-casing of "/", as previous incarnation of this routine did.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Fix any-emu compilation.
|
||||||
|
|
||||||
|
* conf/any-emu.rmk (bin_UTILITIES): Add grub-bin2h.
|
||||||
|
* grub_bin2h_SOURCES: New variable.
|
||||||
|
|
||||||
|
2010-01-20 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* util/grub.d/00_header.in: Fix stupid mistake from last commit.
|
||||||
|
|
||||||
|
2010-01-20 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* util/grub.d/00_header.in: Fix handling of locale_dir.
|
||||||
|
|
||||||
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* configure.ac: Add /usr/share/fonts/unifont/unifont.pcf.gz
|
||||||
|
as possible unifont location (Gentoo).
|
||||||
|
Reported by: Alexander Brüning
|
||||||
|
|
||||||
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
Don't try to generate lists for kernel.img.
|
Don't try to generate lists for kernel.img.
|
||||||
|
|
|
@ -24,7 +24,7 @@ grub_pci_address_t
|
||||||
grub_pci_make_address (grub_pci_device_t dev, int reg)
|
grub_pci_make_address (grub_pci_device_t dev, int reg)
|
||||||
{
|
{
|
||||||
return (1 << 31) | (dev.bus << 16) | (dev.device << 11)
|
return (1 << 31) | (dev.bus << 16) | (dev.device << 11)
|
||||||
| (dev.function << 8) | (reg << 2);
|
| (dev.function << 8) | reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -41,7 +41,7 @@ grub_pci_iterate (grub_pci_iteratefunc_t hook)
|
||||||
{
|
{
|
||||||
for (dev.function = 0; dev.function < 8; dev.function++)
|
for (dev.function = 0; dev.function < 8; dev.function++)
|
||||||
{
|
{
|
||||||
addr = grub_pci_make_address (dev, 0);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_PCI_ID);
|
||||||
id = grub_pci_read (addr);
|
id = grub_pci_read (addr);
|
||||||
|
|
||||||
/* Check if there is a device present. */
|
/* Check if there is a device present. */
|
||||||
|
@ -54,7 +54,7 @@ grub_pci_iterate (grub_pci_iteratefunc_t hook)
|
||||||
/* Probe only func = 0 if the device if not multifunction */
|
/* Probe only func = 0 if the device if not multifunction */
|
||||||
if (dev.function == 0)
|
if (dev.function == 0)
|
||||||
{
|
{
|
||||||
addr = grub_pci_make_address (dev, 3);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CACHELINE);
|
||||||
hdr = grub_pci_read (addr);
|
hdr = grub_pci_read (addr);
|
||||||
if (!(hdr & 0x800000))
|
if (!(hdr & 0x800000))
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -126,7 +126,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev,
|
||||||
grub_uint32_t revision;
|
grub_uint32_t revision;
|
||||||
grub_uint32_t frame_interval;
|
grub_uint32_t frame_interval;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
class_code = grub_pci_read (addr) >> 8;
|
class_code = grub_pci_read (addr) >> 8;
|
||||||
|
|
||||||
interf = class_code & 0xFF;
|
interf = class_code & 0xFF;
|
||||||
|
@ -138,7 +138,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Determine IO base address. */
|
/* Determine IO base address. */
|
||||||
addr = grub_pci_make_address (dev, 4);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||||
base = grub_pci_read (addr);
|
base = grub_pci_read (addr);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
@ -150,7 +150,7 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
|
||||||
struct grub_uhci *u;
|
struct grub_uhci *u;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
class_code = grub_pci_read (addr) >> 8;
|
class_code = grub_pci_read (addr) >> 8;
|
||||||
|
|
||||||
interf = class_code & 0xFF;
|
interf = class_code & 0xFF;
|
||||||
|
@ -162,7 +162,7 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Determine IO base address. */
|
/* Determine IO base address. */
|
||||||
addr = grub_pci_make_address (dev, 8);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG4);
|
||||||
base = grub_pci_read (addr);
|
base = grub_pci_read (addr);
|
||||||
/* Stop if there is no IO space base address defined. */
|
/* Stop if there is no IO space base address defined. */
|
||||||
if (! (base & 1))
|
if (! (base & 1))
|
||||||
|
|
|
@ -43,7 +43,7 @@ scan_card (grub_pci_device_t dev, grub_pci_id_t pciid)
|
||||||
{
|
{
|
||||||
grub_pci_address_t addr;
|
grub_pci_address_t addr;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
if (grub_pci_read_byte (addr + 3) == 0x3)
|
if (grub_pci_read_byte (addr + 3) == 0x3)
|
||||||
{
|
{
|
||||||
struct grub_video_patch *p = video_patches;
|
struct grub_video_patch *p = video_patches;
|
||||||
|
|
|
@ -51,7 +51,8 @@ enable_rom_area (void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 36);
|
/* FIXME: should be macroified. */
|
||||||
|
addr = grub_pci_make_address (dev, 144);
|
||||||
grub_pci_write_byte (addr++, 0x30);
|
grub_pci_write_byte (addr++, 0x30);
|
||||||
grub_pci_write_byte (addr++, 0x33);
|
grub_pci_write_byte (addr++, 0x33);
|
||||||
grub_pci_write_byte (addr++, 0x33);
|
grub_pci_write_byte (addr++, 0x33);
|
||||||
|
@ -77,7 +78,8 @@ lock_rom_area (void)
|
||||||
grub_pci_address_t addr;
|
grub_pci_address_t addr;
|
||||||
grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0};
|
grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0};
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 36);
|
/* FIXME: should be macroified. */
|
||||||
|
addr = grub_pci_make_address (dev, 144);
|
||||||
grub_pci_write_byte (addr++, 0x10);
|
grub_pci_write_byte (addr++, 0x10);
|
||||||
grub_pci_write_byte (addr++, 0x11);
|
grub_pci_write_byte (addr++, 0x11);
|
||||||
grub_pci_write_byte (addr++, 0x11);
|
grub_pci_write_byte (addr++, 0x11);
|
||||||
|
|
|
@ -135,7 +135,7 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
|
||||||
grub_printf ("%02x:%02x.%x %04x:%04x", grub_pci_get_bus (dev),
|
grub_printf ("%02x:%02x.%x %04x:%04x", grub_pci_get_bus (dev),
|
||||||
grub_pci_get_device (dev), grub_pci_get_function (dev),
|
grub_pci_get_device (dev), grub_pci_get_function (dev),
|
||||||
pciid & 0xFFFF, pciid >> 16);
|
pciid & 0xFFFF, pciid >> 16);
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
class = grub_pci_read (addr);
|
class = grub_pci_read (addr);
|
||||||
|
|
||||||
/* Lookup the class name, if there isn't a specific one,
|
/* Lookup the class name, if there isn't a specific one,
|
||||||
|
@ -156,22 +156,24 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
|
||||||
|
|
||||||
if (iospace)
|
if (iospace)
|
||||||
{
|
{
|
||||||
reg = 4;
|
reg = GRUB_PCI_REG_ADDRESSES;
|
||||||
while (reg < 10)
|
while (reg < GRUB_PCI_REG_CIS_POINTER)
|
||||||
{
|
{
|
||||||
grub_uint64_t space;
|
grub_uint64_t space;
|
||||||
addr = grub_pci_make_address (dev, reg);
|
addr = grub_pci_make_address (dev, reg);
|
||||||
space = grub_pci_read (addr);
|
space = grub_pci_read (addr);
|
||||||
|
|
||||||
reg++;
|
reg += sizeof (grub_uint32_t);
|
||||||
|
|
||||||
if (space == 0)
|
if (space == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch (space & GRUB_PCI_ADDR_SPACE_MASK)
|
switch (space & GRUB_PCI_ADDR_SPACE_MASK)
|
||||||
{
|
{
|
||||||
case GRUB_PCI_ADDR_SPACE_IO:
|
case GRUB_PCI_ADDR_SPACE_IO:
|
||||||
grub_printf ("\tIO space %d at 0x%llx\n", (reg - 1) - 4,
|
grub_printf ("\tIO space %d at 0x%llx\n",
|
||||||
|
(unsigned) ((reg - GRUB_PCI_REG_ADDRESSES)
|
||||||
|
/ sizeof (grub_uint32_t)) - 1,
|
||||||
(unsigned long long)
|
(unsigned long long)
|
||||||
(space & GRUB_PCI_ADDR_IO_MASK));
|
(space & GRUB_PCI_ADDR_IO_MASK));
|
||||||
break;
|
break;
|
||||||
|
@ -181,9 +183,11 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
|
||||||
{
|
{
|
||||||
addr = grub_pci_make_address (dev, reg);
|
addr = grub_pci_make_address (dev, reg);
|
||||||
space |= ((grub_uint64_t) grub_pci_read (addr)) << 32;
|
space |= ((grub_uint64_t) grub_pci_read (addr)) << 32;
|
||||||
reg++;
|
reg += sizeof (grub_uint32_t);
|
||||||
grub_printf ("\t64-bit memory space %d at 0x%016llx [%s]\n",
|
grub_printf ("\t64-bit memory space %d at 0x%016llx [%s]\n",
|
||||||
(reg - 2) - 4, (unsigned long long)
|
(unsigned) ((reg - GRUB_PCI_REG_ADDRESSES)
|
||||||
|
/ sizeof (grub_uint32_t)) - 2,
|
||||||
|
(unsigned long long)
|
||||||
(space & GRUB_PCI_ADDR_MEM_MASK),
|
(space & GRUB_PCI_ADDR_MEM_MASK),
|
||||||
space & GRUB_PCI_ADDR_MEM_PREFETCH
|
space & GRUB_PCI_ADDR_MEM_PREFETCH
|
||||||
? "prefetchable" : "non-prefetchable");
|
? "prefetchable" : "non-prefetchable");
|
||||||
|
@ -191,7 +195,9 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
grub_printf ("\t32-bit memory space %d at 0x%016llx [%s]\n",
|
grub_printf ("\t32-bit memory space %d at 0x%016llx [%s]\n",
|
||||||
(reg - 1) - 4, (unsigned long long)
|
(unsigned) ((reg - GRUB_PCI_REG_ADDRESSES)
|
||||||
|
/ sizeof (grub_uint32_t)) - 1,
|
||||||
|
(unsigned long long)
|
||||||
(space & GRUB_PCI_ADDR_MEM_MASK),
|
(space & GRUB_PCI_ADDR_MEM_MASK),
|
||||||
space & GRUB_PCI_ADDR_MEM_PREFETCH
|
space & GRUB_PCI_ADDR_MEM_PREFETCH
|
||||||
? "prefetchable" : "non-prefetchable");
|
? "prefetchable" : "non-prefetchable");
|
||||||
|
|
340
commands/setpci.c
Normal file
340
commands/setpci.c
Normal file
|
@ -0,0 +1,340 @@
|
||||||
|
/* lspci.c - List PCI devices. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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.
|
||||||
|
*
|
||||||
|
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/pci.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
|
||||||
|
struct pci_register
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
grub_uint16_t addr;
|
||||||
|
unsigned size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pci_register pci_registers[] =
|
||||||
|
{
|
||||||
|
{"VENDOR_ID", GRUB_PCI_REG_VENDOR , 2},
|
||||||
|
{"DEVICE_ID", GRUB_PCI_REG_DEVICE , 2},
|
||||||
|
{"COMMAND", GRUB_PCI_REG_COMMAND , 2},
|
||||||
|
{"STATUS", GRUB_PCI_REG_STATUS , 2},
|
||||||
|
{"REVISION", GRUB_PCI_REG_REVISION , 1},
|
||||||
|
{"CLASS_PROG", GRUB_PCI_REG_CLASS + 1 , 1},
|
||||||
|
{"CLASS_DEVICE", GRUB_PCI_REG_CLASS + 2 , 2},
|
||||||
|
{"CACHE_LINE_SIZE", GRUB_PCI_REG_CACHELINE , 1},
|
||||||
|
{"LATENCY_TIMER", GRUB_PCI_REG_LAT_TIMER , 1},
|
||||||
|
{"HEADER_TYPE", GRUB_PCI_REG_HEADER_TYPE , 1},
|
||||||
|
{"BIST", GRUB_PCI_REG_BIST , 1},
|
||||||
|
{"BASE_ADDRESS_0", GRUB_PCI_REG_ADDRESS_REG0, 4},
|
||||||
|
{"BASE_ADDRESS_1", GRUB_PCI_REG_ADDRESS_REG1, 4},
|
||||||
|
{"BASE_ADDRESS_2", GRUB_PCI_REG_ADDRESS_REG2, 4},
|
||||||
|
{"BASE_ADDRESS_3", GRUB_PCI_REG_ADDRESS_REG3, 4},
|
||||||
|
{"BASE_ADDRESS_4", GRUB_PCI_REG_ADDRESS_REG4, 4},
|
||||||
|
{"BASE_ADDRESS_5", GRUB_PCI_REG_ADDRESS_REG5, 4},
|
||||||
|
{"CARDBUS_CIS", GRUB_PCI_REG_CIS_POINTER , 4},
|
||||||
|
{"SUBVENDOR_ID", GRUB_PCI_REG_SUBVENDOR , 2},
|
||||||
|
{"SUBSYSTEM_ID", GRUB_PCI_REG_SUBSYSTEM , 2},
|
||||||
|
{"ROM_ADDRESS", GRUB_PCI_REG_ROM_ADDRESS , 4},
|
||||||
|
{"CAP_POINTER", GRUB_PCI_REG_CAP_POINTER , 1},
|
||||||
|
{"INTERRUPT_LINE", GRUB_PCI_REG_IRQ_LINE , 1},
|
||||||
|
{"INTERRUPT_PIN", GRUB_PCI_REG_IRQ_PIN , 1},
|
||||||
|
{"MIN_GNT", GRUB_PCI_REG_MIN_GNT , 1},
|
||||||
|
{"MAX_LAT", GRUB_PCI_REG_MIN_GNT , 1},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct grub_arg_option options[] =
|
||||||
|
{
|
||||||
|
{0, 'd', 0, "Select device by vendor and device IDs.",
|
||||||
|
"[vendor]:[device]", ARG_TYPE_STRING},
|
||||||
|
{0, 's', 0, "Select device by its position on the bus.",
|
||||||
|
"[bus]:[slot][.func]", ARG_TYPE_STRING},
|
||||||
|
{0, 'v', 0, "Save read value into variable VARNAME.",
|
||||||
|
"VARNAME", ARG_TYPE_STRING},
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static grub_uint32_t pciid_check_mask, pciid_check_value;
|
||||||
|
static int bus, device, function;
|
||||||
|
static int check_bus, check_device, check_function;
|
||||||
|
static grub_uint32_t write_mask, regwrite;
|
||||||
|
static int regsize;
|
||||||
|
static grub_uint16_t regaddr;
|
||||||
|
static const char *varname;
|
||||||
|
|
||||||
|
static int NESTED_FUNC_ATTR
|
||||||
|
grub_setpci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
|
||||||
|
{
|
||||||
|
grub_uint32_t regval = 0;
|
||||||
|
grub_pci_address_t addr;
|
||||||
|
|
||||||
|
if ((pciid & pciid_check_mask) != pciid_check_value)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (check_bus && grub_pci_get_bus (dev) != bus)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (check_device && grub_pci_get_device (dev) != device)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (check_function && grub_pci_get_function (dev) != device)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
addr = grub_pci_make_address (dev, regaddr);
|
||||||
|
|
||||||
|
switch (regsize)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
regval = grub_pci_read_byte (addr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
regval = grub_pci_read_word (addr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
regval = grub_pci_read (addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (varname)
|
||||||
|
{
|
||||||
|
char buf[sizeof ("XXXXXXXX")];
|
||||||
|
grub_snprintf (buf, sizeof (buf), "%x", regval);
|
||||||
|
grub_env_set (varname, buf);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!write_mask)
|
||||||
|
{
|
||||||
|
grub_printf ("Register %x of %d:%d.%d is %x\n", regaddr,
|
||||||
|
grub_pci_get_bus (dev),
|
||||||
|
grub_pci_get_device (dev),
|
||||||
|
grub_pci_get_function (dev),
|
||||||
|
regval);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
regval = (regval & ~write_mask) | regwrite;
|
||||||
|
|
||||||
|
switch (regsize)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
grub_pci_write_byte (addr, regval);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
grub_pci_write_word (addr, regval);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
grub_pci_write (addr, regval);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_setpci (grub_extcmd_t cmd, int argc, char **argv)
|
||||||
|
{
|
||||||
|
const char *ptr;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
pciid_check_value = 0;
|
||||||
|
pciid_check_mask = 0;
|
||||||
|
|
||||||
|
if (cmd->state[0].set)
|
||||||
|
{
|
||||||
|
ptr = cmd->state[0].arg;
|
||||||
|
pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff);
|
||||||
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
|
{
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
ptr = cmd->state[0].arg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pciid_check_mask |= 0xffff;
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
if (*ptr != ':')
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Colon expected.");
|
||||||
|
ptr++;
|
||||||
|
pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff)
|
||||||
|
<< 16;
|
||||||
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
else
|
||||||
|
pciid_check_mask |= 0xffff0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
pciid_check_value &= pciid_check_mask;
|
||||||
|
|
||||||
|
check_bus = check_device = check_function = 0;
|
||||||
|
|
||||||
|
if (cmd->state[1].set)
|
||||||
|
{
|
||||||
|
const char *optr;
|
||||||
|
|
||||||
|
ptr = cmd->state[1].arg;
|
||||||
|
optr = ptr;
|
||||||
|
bus = grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
|
{
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
ptr = optr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
check_bus = 1;
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
if (*ptr != ':')
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Colon expected.");
|
||||||
|
ptr++;
|
||||||
|
optr = ptr;
|
||||||
|
device = grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
|
{
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
ptr = optr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
check_device = 1;
|
||||||
|
if (*ptr == '.')
|
||||||
|
{
|
||||||
|
ptr++;
|
||||||
|
function = grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
check_function = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd->state[2].set)
|
||||||
|
varname = cmd->state[2].arg;
|
||||||
|
else
|
||||||
|
varname = NULL;
|
||||||
|
|
||||||
|
write_mask = 0;
|
||||||
|
|
||||||
|
if (argc == 0)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Command expected.");
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Only one command is supported.");
|
||||||
|
|
||||||
|
ptr = argv[0];
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE (pci_registers); i++)
|
||||||
|
{
|
||||||
|
if (grub_strncmp (ptr, pci_registers[i].name,
|
||||||
|
grub_strlen (pci_registers[i].name)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == ARRAY_SIZE (pci_registers))
|
||||||
|
{
|
||||||
|
regsize = 0;
|
||||||
|
regaddr = grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown register");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
regaddr = pci_registers[i].addr;
|
||||||
|
regsize = pci_registers[i].size;
|
||||||
|
ptr += grub_strlen (pci_registers[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
if (*ptr == '+')
|
||||||
|
{
|
||||||
|
ptr++;
|
||||||
|
regaddr += grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_memcmp (ptr, ".L", sizeof (".L") - 1) == 0
|
||||||
|
|| grub_memcmp (ptr, ".l", sizeof (".l") - 1) == 0)
|
||||||
|
{
|
||||||
|
regsize = 4;
|
||||||
|
ptr += sizeof (".l") - 1;
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (ptr, ".W", sizeof (".W") - 1) == 0
|
||||||
|
|| grub_memcmp (ptr, ".w", sizeof (".w") - 1) == 0)
|
||||||
|
{
|
||||||
|
regsize = 2;
|
||||||
|
ptr += sizeof (".w") - 1;
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (ptr, ".B", sizeof (".B") - 1) == 0
|
||||||
|
|| grub_memcmp (ptr, ".b", sizeof (".b") - 1) == 0)
|
||||||
|
{
|
||||||
|
regsize = 1;
|
||||||
|
ptr += sizeof (".b") - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!regsize)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"Unknown register size.");
|
||||||
|
|
||||||
|
write_mask = 0;
|
||||||
|
if (*ptr == '=')
|
||||||
|
{
|
||||||
|
ptr++;
|
||||||
|
regwrite = grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
write_mask = 0xffffffff;
|
||||||
|
if (*ptr == ':')
|
||||||
|
{
|
||||||
|
ptr++;
|
||||||
|
write_mask = grub_strtoul (ptr, (char **) &ptr, 16);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
write_mask = 0xffffffff;
|
||||||
|
}
|
||||||
|
regwrite &= write_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write_mask && varname)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"Option -v isn't valid for writes.");
|
||||||
|
|
||||||
|
grub_pci_iterate (grub_setpci_iter);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd;
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(setpci)
|
||||||
|
{
|
||||||
|
cmd = grub_register_extcmd ("setpci", grub_cmd_setpci, GRUB_COMMAND_FLAG_BOTH,
|
||||||
|
"setpci [-s POSITION] [-d DEVICE] [-v VAR] "
|
||||||
|
"[REGISTER][=VALUE[:MASK]]",
|
||||||
|
"Manipulate PCI devices.", options);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(setpci)
|
||||||
|
{
|
||||||
|
grub_unregister_extcmd (cmd);
|
||||||
|
}
|
|
@ -30,7 +30,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \
|
||||||
normal/completion.c normal/main.c normal/color.c \
|
normal/completion.c normal/main.c normal/color.c \
|
||||||
normal/menu.c normal/menu_entry.c \
|
normal/menu.c normal/menu_entry.c \
|
||||||
normal/menu_text.c normal/crypto.c normal/term.c \
|
normal/menu_text.c normal/crypto.c normal/term.c \
|
||||||
commands/terminal.c lib/charset.c \
|
commands/terminal.c normal/context.c lib/charset.c \
|
||||||
script/main.c script/execute.c script/function.c \
|
script/main.c script/execute.c script/function.c \
|
||||||
script/lexer.c script/script.c grub_script.tab.c \
|
script/lexer.c script/script.c grub_script.tab.c \
|
||||||
partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \
|
partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \
|
||||||
|
@ -98,3 +98,6 @@ endif
|
||||||
grub_script.tab.c grub_script.tab.h: script/parser.y
|
grub_script.tab.c grub_script.tab.h: script/parser.y
|
||||||
$(YACC) -d -p grub_script_yy -b grub_script $(srcdir)/script/parser.y
|
$(YACC) -d -p grub_script_yy -b grub_script $(srcdir)/script/parser.y
|
||||||
DISTCLEANFILES += grub_script.tab.c grub_script.tab.h
|
DISTCLEANFILES += grub_script.tab.c grub_script.tab.h
|
||||||
|
|
||||||
|
bin_UTILITIES += grub-bin2h
|
||||||
|
grub_bin2h_SOURCES = gnulib/progname.c util/bin2h.c
|
||||||
|
|
|
@ -588,7 +588,7 @@ normal_mod_SOURCES = normal/main.c normal/cmdline.c normal/dyncmd.c \
|
||||||
normal/auth.c normal/autofs.c normal/handler.c \
|
normal/auth.c normal/autofs.c normal/handler.c \
|
||||||
normal/color.c normal/completion.c normal/datetime.c normal/menu.c \
|
normal/color.c normal/completion.c normal/datetime.c normal/menu.c \
|
||||||
normal/menu_entry.c normal/menu_text.c \
|
normal/menu_entry.c normal/menu_text.c \
|
||||||
normal/misc.c normal/crypto.c normal/term.c
|
normal/misc.c normal/crypto.c normal/term.c normal/context.c
|
||||||
normal_mod_CFLAGS = $(COMMON_CFLAGS)
|
normal_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
|
@ -638,7 +638,9 @@ png_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
png_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
png_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
pkglib_MODULES += font.mod
|
pkglib_MODULES += font.mod
|
||||||
|
ifneq (, $(FONT_SOURCE))
|
||||||
font/font.c_DEPENDENCIES = ascii.h
|
font/font.c_DEPENDENCIES = ascii.h
|
||||||
|
endif
|
||||||
font_mod_SOURCES = font/font_cmd.c font/font.c
|
font_mod_SOURCES = font/font_cmd.c font/font.c
|
||||||
font_mod_CFLAGS = $(COMMON_CFLAGS)
|
font_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
font_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
font_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
|
@ -35,7 +35,8 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
machine/boot.h machine/console.h machine/init.h \
|
machine/boot.h machine/console.h machine/init.h \
|
||||||
machine/memory.h machine/loader.h list.h handler.h command.h i18n.h
|
machine/memory.h machine/loader.h list.h handler.h command.h i18n.h \
|
||||||
|
env_private.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
|
||||||
|
@ -81,7 +82,8 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
machine/boot.h machine/console.h machine/init.h \
|
machine/boot.h machine/console.h machine/init.h \
|
||||||
machine/memory.h machine/loader.h list.h handler.h command.h i18n.h
|
machine/memory.h machine/loader.h list.h handler.h command.h i18n.h \
|
||||||
|
env_private.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
||||||
|
|
|
@ -52,7 +52,8 @@ kernel_img_SOURCES = kern/i386/efi/startup.S kern/main.c kern/device.c \
|
||||||
kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
efi/efi.h efi/time.h efi/disk.h i386/pit.h list.h handler.h command.h i18n.h
|
efi/efi.h efi/time.h efi/disk.h i386/pit.h list.h handler.h command.h \
|
||||||
|
i18n.h env_private.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
|
@ -33,7 +33,7 @@ kernel_img_HEADERS = cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
ieee1275/ieee1275.h machine/kernel.h machine/loader.h machine/memory.h \
|
ieee1275/ieee1275.h machine/kernel.h machine/loader.h machine/memory.h \
|
||||||
list.h handler.h command.h i18n.h
|
list.h handler.h command.h i18n.h env_private.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x10000,-Bstatic
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x10000,-Bstatic
|
||||||
|
|
|
@ -64,7 +64,8 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \
|
machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \
|
||||||
machine/memory.h machine/loader.h machine/vga.h machine/vbe.h \
|
machine/memory.h machine/loader.h machine/vga.h machine/vbe.h \
|
||||||
machine/kernel.h machine/pxe.h i386/pit.h list.h handler.h command.h i18n.h
|
machine/kernel.h machine/pxe.h i386/pit.h list.h handler.h command.h \
|
||||||
|
i18n.h env_private.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS)
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS)
|
||||||
|
|
|
@ -26,6 +26,12 @@ ata_mod_SOURCES = disk/ata.c
|
||||||
ata_mod_CFLAGS = $(COMMON_CFLAGS)
|
ata_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
ata_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
ata_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
|
# For setpci.mod
|
||||||
|
pkglib_MODULES += setpci.mod
|
||||||
|
setpci_mod_SOURCES = commands/setpci.c
|
||||||
|
setpci_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
|
setpci_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
pkglib_MODULES += multiboot.mod
|
pkglib_MODULES += multiboot.mod
|
||||||
multiboot_mod_SOURCES = loader/i386/multiboot.c \
|
multiboot_mod_SOURCES = loader/i386/multiboot.c \
|
||||||
loader/i386/multiboot_mbi.c \
|
loader/i386/multiboot_mbi.c \
|
||||||
|
|
|
@ -17,7 +17,7 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h misc.h mm.h net.h parser.h reader.h \
|
env.h err.h file.h fs.h kernel.h misc.h mm.h net.h parser.h reader.h \
|
||||||
symbol.h term.h time.h types.h loader.h partition.h \
|
symbol.h term.h time.h types.h loader.h partition.h \
|
||||||
msdos_partition.h machine/kernel.h handler.h list.h \
|
msdos_partition.h machine/kernel.h handler.h list.h \
|
||||||
command.h machine/memory.h cpu/libgcc.h cpu/cache.h i18n.h
|
command.h machine/memory.h cpu/libgcc.h cpu/cache.h i18n.h env_private.h
|
||||||
|
|
||||||
ifeq ($(platform), yeeloong)
|
ifeq ($(platform), yeeloong)
|
||||||
kernel_img_HEADERS += pci.h
|
kernel_img_HEADERS += pci.h
|
||||||
|
|
|
@ -17,7 +17,7 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h misc.h mm.h net.h parser.h reader.h \
|
env.h err.h file.h fs.h kernel.h misc.h mm.h net.h parser.h reader.h \
|
||||||
symbol.h term.h time.h types.h powerpc/libgcc.h loader.h partition.h \
|
symbol.h term.h time.h types.h powerpc/libgcc.h loader.h partition.h \
|
||||||
msdos_partition.h ieee1275/ieee1275.h machine/kernel.h handler.h list.h \
|
msdos_partition.h ieee1275/ieee1275.h machine/kernel.h handler.h list.h \
|
||||||
command.h i18n.h
|
command.h i18n.h env_private.h
|
||||||
|
|
||||||
symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh
|
symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh
|
||||||
/bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1)
|
/bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1)
|
||||||
|
|
|
@ -31,7 +31,7 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
list.h handler.h command.h i18n.h \
|
list.h handler.h command.h i18n.h \
|
||||||
sparc64/libgcc.h ieee1275/ieee1275.h machine/kernel.h \
|
sparc64/libgcc.h ieee1275/ieee1275.h machine/kernel.h \
|
||||||
sparc64/ieee1275/ieee1275.h
|
sparc64/ieee1275/ieee1275.h env_private.h
|
||||||
kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
|
kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
|
||||||
kern/ieee1275/ieee1275.c kern/main.c kern/device.c \
|
kern/ieee1275/ieee1275.c kern/main.c kern/device.c \
|
||||||
kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \
|
kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \
|
||||||
|
|
|
@ -52,7 +52,7 @@ kernel_img_HEADERS = boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
efi/efi.h efi/time.h efi/disk.h machine/loader.h i386/pit.h list.h \
|
efi/efi.h efi/time.h efi/disk.h machine/loader.h i386/pit.h list.h \
|
||||||
handler.h command.h i18n.h
|
handler.h command.h i18n.h env_private.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
|
@ -168,7 +168,7 @@ if test "x$YACC" = x; then
|
||||||
AC_MSG_ERROR([bison is not found])
|
AC_MSG_ERROR([bison is not found])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for file in /usr/src/unifont.bdf /usr/share/fonts/X11/misc/unifont.pcf.gz ; do
|
for file in /usr/src/unifont.bdf /usr/share/fonts/X11/misc/unifont.pcf.gz /usr/share/fonts/unifont/unifont.pcf.gz; do
|
||||||
if test -e $file ; then
|
if test -e $file ; then
|
||||||
AC_SUBST([FONT_SOURCE], [$file])
|
AC_SUBST([FONT_SOURCE], [$file])
|
||||||
break
|
break
|
||||||
|
|
|
@ -404,7 +404,7 @@ grub_ata_pciinit (grub_pci_device_t dev,
|
||||||
int nports = 2;
|
int nports = 2;
|
||||||
|
|
||||||
/* Read class. */
|
/* Read class. */
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
class = grub_pci_read (addr);
|
class = grub_pci_read (addr);
|
||||||
|
|
||||||
/* AMD CS5536 Southbridge. */
|
/* AMD CS5536 Southbridge. */
|
||||||
|
@ -444,9 +444,12 @@ grub_ata_pciinit (grub_pci_device_t dev,
|
||||||
{
|
{
|
||||||
/* Read the BARs, which either contain a mmapped IO address
|
/* Read the BARs, which either contain a mmapped IO address
|
||||||
or the IO port address. */
|
or the IO port address. */
|
||||||
addr = grub_pci_make_address (dev, 4 + 2 * i);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESSES
|
||||||
|
+ sizeof (grub_uint64_t) * i);
|
||||||
bar1 = grub_pci_read (addr);
|
bar1 = grub_pci_read (addr);
|
||||||
addr = grub_pci_make_address (dev, 5 + 2 * i);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESSES
|
||||||
|
+ sizeof (grub_uint64_t) * i
|
||||||
|
+ sizeof (grub_uint32_t));
|
||||||
bar2 = grub_pci_read (addr);
|
bar2 = grub_pci_read (addr);
|
||||||
|
|
||||||
/* Check if the BARs describe an IO region. */
|
/* Check if the BARs describe an IO region. */
|
||||||
|
|
26
font/font.c
26
font/font.c
|
@ -63,6 +63,7 @@ struct grub_font
|
||||||
short leading;
|
short leading;
|
||||||
grub_uint32_t num_chars;
|
grub_uint32_t num_chars;
|
||||||
struct char_index_entry *char_index;
|
struct char_index_entry *char_index;
|
||||||
|
grub_uint16_t *bmp_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Definition of font registry. */
|
/* Definition of font registry. */
|
||||||
|
@ -227,6 +228,7 @@ font_init (grub_font_t font)
|
||||||
font->descent = 0;
|
font->descent = 0;
|
||||||
font->num_chars = 0;
|
font->num_chars = 0;
|
||||||
font->char_index = 0;
|
font->char_index = 0;
|
||||||
|
font->bmp_idx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the next section in the file.
|
/* Open the next section in the file.
|
||||||
|
@ -320,6 +322,14 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
* sizeof (struct char_index_entry));
|
* sizeof (struct char_index_entry));
|
||||||
if (! font->char_index)
|
if (! font->char_index)
|
||||||
return 1;
|
return 1;
|
||||||
|
font->bmp_idx = grub_malloc (0x10000 * sizeof (grub_uint16_t));
|
||||||
|
if (! font->bmp_idx)
|
||||||
|
{
|
||||||
|
grub_free (font->char_index);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
grub_memset (font->bmp_idx, 0xff, 0x10000 * sizeof (grub_uint16_t));
|
||||||
|
|
||||||
|
|
||||||
#if FONT_DEBUG >= 2
|
#if FONT_DEBUG >= 2
|
||||||
grub_printf("num_chars=%d)\n", font->num_chars);
|
grub_printf("num_chars=%d)\n", font->num_chars);
|
||||||
|
@ -346,6 +356,9 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entry->code < 0x10000)
|
||||||
|
font->bmp_idx[entry->code] = i;
|
||||||
|
|
||||||
last_code = entry->code;
|
last_code = entry->code;
|
||||||
|
|
||||||
/* Read storage flags byte. */
|
/* Read storage flags byte. */
|
||||||
|
@ -641,7 +654,7 @@ read_be_int16 (grub_file_t file, grub_int16_t * value)
|
||||||
|
|
||||||
/* Return a pointer to the character index entry for the glyph corresponding to
|
/* Return a pointer to the character index entry for the glyph corresponding to
|
||||||
the codepoint CODE in the font FONT. If not found, return zero. */
|
the codepoint CODE in the font FONT. If not found, return zero. */
|
||||||
static struct char_index_entry *
|
static inline struct char_index_entry *
|
||||||
find_glyph (const grub_font_t font, grub_uint32_t code)
|
find_glyph (const grub_font_t font, grub_uint32_t code)
|
||||||
{
|
{
|
||||||
struct char_index_entry *table;
|
struct char_index_entry *table;
|
||||||
|
@ -649,8 +662,17 @@ find_glyph (const grub_font_t font, grub_uint32_t code)
|
||||||
grub_size_t hi;
|
grub_size_t hi;
|
||||||
grub_size_t mid;
|
grub_size_t mid;
|
||||||
|
|
||||||
/* Do a binary search in `char_index', which is ordered by code point. */
|
|
||||||
table = font->char_index;
|
table = font->char_index;
|
||||||
|
|
||||||
|
/* Use BMP index if possible. */
|
||||||
|
if (code < 0x10000)
|
||||||
|
{
|
||||||
|
if (font->bmp_idx[code] == 0xffff)
|
||||||
|
return 0;
|
||||||
|
return &table[font->bmp_idx[code]];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do a binary search in `char_index', which is ordered by code point. */
|
||||||
lo = 0;
|
lo = 0;
|
||||||
hi = font->num_chars - 1;
|
hi = font->num_chars - 1;
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <grub/symbol.h>
|
#include <grub/symbol.h>
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
|
#include <grub/menu.h>
|
||||||
|
|
||||||
struct grub_env_var;
|
struct grub_env_var;
|
||||||
|
|
||||||
|
@ -30,18 +31,6 @@ typedef char *(*grub_env_read_hook_t) (struct grub_env_var *var,
|
||||||
typedef char *(*grub_env_write_hook_t) (struct grub_env_var *var,
|
typedef char *(*grub_env_write_hook_t) (struct grub_env_var *var,
|
||||||
const char *val);
|
const char *val);
|
||||||
|
|
||||||
enum grub_env_var_type
|
|
||||||
{
|
|
||||||
/* The default variable type which is local in current context. */
|
|
||||||
GRUB_ENV_VAR_LOCAL,
|
|
||||||
|
|
||||||
/* The exported type, which is passed to new contexts. */
|
|
||||||
GRUB_ENV_VAR_GLOBAL,
|
|
||||||
|
|
||||||
/* The data slot type, which is used to store arbitrary data. */
|
|
||||||
GRUB_ENV_VAR_DATA
|
|
||||||
};
|
|
||||||
|
|
||||||
struct grub_env_var
|
struct grub_env_var
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -50,23 +39,24 @@ struct grub_env_var
|
||||||
grub_env_write_hook_t write_hook;
|
grub_env_write_hook_t write_hook;
|
||||||
struct grub_env_var *next;
|
struct grub_env_var *next;
|
||||||
struct grub_env_var **prevp;
|
struct grub_env_var **prevp;
|
||||||
enum grub_env_var_type type;
|
int global;
|
||||||
};
|
};
|
||||||
|
|
||||||
grub_err_t EXPORT_FUNC(grub_env_set) (const char *name, const char *val);
|
grub_err_t EXPORT_FUNC(grub_env_set) (const char *name, const char *val);
|
||||||
char *EXPORT_FUNC(grub_env_get) (const char *name);
|
char *EXPORT_FUNC(grub_env_get) (const char *name);
|
||||||
void EXPORT_FUNC(grub_env_unset) (const char *name);
|
void EXPORT_FUNC(grub_env_unset) (const char *name);
|
||||||
void EXPORT_FUNC(grub_env_iterate) (int (*func) (struct grub_env_var *var));
|
void EXPORT_FUNC(grub_env_iterate) (int (*func) (struct grub_env_var *var));
|
||||||
|
struct grub_env_var *EXPORT_FUNC(grub_env_find) (const char *name);
|
||||||
grub_err_t EXPORT_FUNC(grub_register_variable_hook) (const char *name,
|
grub_err_t EXPORT_FUNC(grub_register_variable_hook) (const char *name,
|
||||||
grub_env_read_hook_t read_hook,
|
grub_env_read_hook_t read_hook,
|
||||||
grub_env_write_hook_t write_hook);
|
grub_env_write_hook_t write_hook);
|
||||||
grub_err_t EXPORT_FUNC(grub_env_context_open) (int export);
|
|
||||||
grub_err_t EXPORT_FUNC(grub_env_context_close) (void);
|
|
||||||
grub_err_t EXPORT_FUNC(grub_env_export) (const char *name);
|
|
||||||
|
|
||||||
grub_err_t EXPORT_FUNC(grub_env_set_data_slot) (const char *name,
|
grub_err_t grub_env_context_open (int export);
|
||||||
const void *ptr);
|
grub_err_t grub_env_context_close (void);
|
||||||
void *EXPORT_FUNC(grub_env_get_data_slot) (const char *name);
|
grub_err_t grub_env_export (const char *name);
|
||||||
void EXPORT_FUNC(grub_env_unset_data_slot) (const char *name);
|
|
||||||
|
void grub_env_unset_menu (void);
|
||||||
|
grub_menu_t grub_env_get_menu (void);
|
||||||
|
void grub_env_set_menu (grub_menu_t nmenu);
|
||||||
|
|
||||||
#endif /* ! GRUB_ENV_HEADER */
|
#endif /* ! GRUB_ENV_HEADER */
|
||||||
|
|
46
include/grub/env_private.h
Normal file
46
include/grub/env_private.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2003,2005,2006,2007,2009 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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.
|
||||||
|
*
|
||||||
|
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_ENV_PRIVATE_HEADER
|
||||||
|
#define GRUB_ENV_PRIVATE_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/env.h>
|
||||||
|
|
||||||
|
/* The size of the hash table. */
|
||||||
|
#define HASHSZ 13
|
||||||
|
|
||||||
|
/* A hashtable for quick lookup of variables. */
|
||||||
|
struct grub_env_context
|
||||||
|
{
|
||||||
|
/* A hash table for variables. */
|
||||||
|
struct grub_env_var *vars[HASHSZ];
|
||||||
|
|
||||||
|
/* One level deeper on the stack. */
|
||||||
|
struct grub_env_context *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This is used for sorting only. */
|
||||||
|
struct grub_env_sorted_var
|
||||||
|
{
|
||||||
|
struct grub_env_var *var;
|
||||||
|
struct grub_env_sorted_var *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct grub_env_context *EXPORT_VAR(grub_current_context);
|
||||||
|
|
||||||
|
#endif /* ! GRUB_ENV_PRIVATE_HEADER */
|
|
@ -101,6 +101,9 @@ void read_command_list (void);
|
||||||
/* Defined in `autofs.c'. */
|
/* Defined in `autofs.c'. */
|
||||||
void read_fs_list (void);
|
void read_fs_list (void);
|
||||||
|
|
||||||
|
void grub_context_init (void);
|
||||||
|
void grub_context_fini (void);
|
||||||
|
|
||||||
void read_crypto_list (void);
|
void read_crypto_list (void);
|
||||||
|
|
||||||
void read_terminal_list (void);
|
void read_terminal_list (void);
|
||||||
|
|
|
@ -35,6 +35,37 @@
|
||||||
#define GRUB_PCI_ADDR_MEM_MASK ~0xf
|
#define GRUB_PCI_ADDR_MEM_MASK ~0xf
|
||||||
#define GRUB_PCI_ADDR_IO_MASK ~0x03
|
#define GRUB_PCI_ADDR_IO_MASK ~0x03
|
||||||
|
|
||||||
|
#define GRUB_PCI_REG_PCI_ID 0x00
|
||||||
|
#define GRUB_PCI_REG_VENDOR 0x00
|
||||||
|
#define GRUB_PCI_REG_DEVICE 0x02
|
||||||
|
#define GRUB_PCI_REG_COMMAND 0x04
|
||||||
|
#define GRUB_PCI_REG_STATUS 0x06
|
||||||
|
#define GRUB_PCI_REG_REVISION 0x08
|
||||||
|
#define GRUB_PCI_REG_CLASS 0x08
|
||||||
|
#define GRUB_PCI_REG_CACHELINE 0x0c
|
||||||
|
#define GRUB_PCI_REG_LAT_TIMER 0x0d
|
||||||
|
#define GRUB_PCI_REG_HEADER_TYPE 0x0e
|
||||||
|
#define GRUB_PCI_REG_BIST 0x0f
|
||||||
|
#define GRUB_PCI_REG_ADDRESSES 0x10
|
||||||
|
|
||||||
|
/* Beware that 64-bit address takes 2 registers. */
|
||||||
|
#define GRUB_PCI_REG_ADDRESS_REG0 0x10
|
||||||
|
#define GRUB_PCI_REG_ADDRESS_REG1 0x14
|
||||||
|
#define GRUB_PCI_REG_ADDRESS_REG2 0x18
|
||||||
|
#define GRUB_PCI_REG_ADDRESS_REG3 0x1c
|
||||||
|
#define GRUB_PCI_REG_ADDRESS_REG4 0x20
|
||||||
|
#define GRUB_PCI_REG_ADDRESS_REG5 0x24
|
||||||
|
|
||||||
|
#define GRUB_PCI_REG_CIS_POINTER 0x28
|
||||||
|
#define GRUB_PCI_REG_SUBVENDOR 0x2c
|
||||||
|
#define GRUB_PCI_REG_SUBSYSTEM 0x2e
|
||||||
|
#define GRUB_PCI_REG_ROM_ADDRESS 0x30
|
||||||
|
#define GRUB_PCI_REG_CAP_POINTER 0x34
|
||||||
|
#define GRUB_PCI_REG_IRQ_LINE 0x3c
|
||||||
|
#define GRUB_PCI_REG_IRQ_PIN 0x3d
|
||||||
|
#define GRUB_PCI_REG_MIN_GNT 0x3e
|
||||||
|
#define GRUB_PCI_REG_MAX_LAT 0x3f
|
||||||
|
|
||||||
typedef grub_uint32_t grub_pci_id_t;
|
typedef grub_uint32_t grub_pci_id_t;
|
||||||
|
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
|
|
|
@ -73,18 +73,6 @@ grub_core_cmd_unset (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
|
||||||
grub_core_cmd_export (struct grub_command *cmd __attribute__ ((unused)),
|
|
||||||
int argc, char **args)
|
|
||||||
{
|
|
||||||
if (argc < 1)
|
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
|
||||||
"no environment variable specified");
|
|
||||||
|
|
||||||
grub_env_export (args[0]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* insmod MODULE */
|
/* insmod MODULE */
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_core_cmd_insmod (struct grub_command *cmd __attribute__ ((unused)),
|
grub_core_cmd_insmod (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
|
@ -193,8 +181,6 @@ grub_register_core_commands (void)
|
||||||
"[ENVVAR=VALUE]", "Set an environment variable.");
|
"[ENVVAR=VALUE]", "Set an environment variable.");
|
||||||
grub_register_command ("unset", grub_core_cmd_unset,
|
grub_register_command ("unset", grub_core_cmd_unset,
|
||||||
"ENVVAR", "Remove an environment variable.");
|
"ENVVAR", "Remove an environment variable.");
|
||||||
grub_register_command ("export", grub_core_cmd_export,
|
|
||||||
"ENVVAR", "Export a variable.");
|
|
||||||
grub_register_command ("ls", grub_core_cmd_ls,
|
grub_register_command ("ls", grub_core_cmd_ls,
|
||||||
"[ARG]", "List devices or files.");
|
"[ARG]", "List devices or files.");
|
||||||
grub_register_command ("insmod", grub_core_cmd_insmod,
|
grub_register_command ("insmod", grub_core_cmd_insmod,
|
||||||
|
|
205
kern/env.c
205
kern/env.c
|
@ -18,34 +18,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <grub/env.h>
|
#include <grub/env.h>
|
||||||
|
#include <grub/env_private.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
|
|
||||||
/* The size of the hash table. */
|
|
||||||
#define HASHSZ 13
|
|
||||||
|
|
||||||
/* A hashtable for quick lookup of variables. */
|
|
||||||
struct grub_env_context
|
|
||||||
{
|
|
||||||
/* A hash table for variables. */
|
|
||||||
struct grub_env_var *vars[HASHSZ];
|
|
||||||
|
|
||||||
/* One level deeper on the stack. */
|
|
||||||
struct grub_env_context *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* This is used for sorting only. */
|
|
||||||
struct grub_env_sorted_var
|
|
||||||
{
|
|
||||||
struct grub_env_var *var;
|
|
||||||
struct grub_env_sorted_var *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The initial context. */
|
/* The initial context. */
|
||||||
static struct grub_env_context initial_context;
|
static struct grub_env_context initial_context;
|
||||||
|
|
||||||
/* The current context. */
|
/* The current context. */
|
||||||
static struct grub_env_context *current_context = &initial_context;
|
struct grub_env_context *grub_current_context = &initial_context;
|
||||||
|
|
||||||
/* Return the hash representation of the string S. */
|
/* Return the hash representation of the string S. */
|
||||||
static unsigned int
|
static unsigned int
|
||||||
|
@ -60,88 +41,20 @@ grub_env_hashval (const char *s)
|
||||||
return i % HASHSZ;
|
return i % HASHSZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct grub_env_var *
|
struct grub_env_var *
|
||||||
grub_env_find (const char *name)
|
grub_env_find (const char *name)
|
||||||
{
|
{
|
||||||
struct grub_env_var *var;
|
struct grub_env_var *var;
|
||||||
int idx = grub_env_hashval (name);
|
int idx = grub_env_hashval (name);
|
||||||
|
|
||||||
/* Look for the variable in the current context. */
|
/* Look for the variable in the current context. */
|
||||||
for (var = current_context->vars[idx]; var; var = var->next)
|
for (var = grub_current_context->vars[idx]; var; var = var->next)
|
||||||
if (grub_strcmp (var->name, name) == 0)
|
if (grub_strcmp (var->name, name) == 0)
|
||||||
return var;
|
return var;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_err_t
|
|
||||||
grub_env_context_open (int export)
|
|
||||||
{
|
|
||||||
struct grub_env_context *context;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
context = grub_zalloc (sizeof (*context));
|
|
||||||
if (! context)
|
|
||||||
return grub_errno;
|
|
||||||
|
|
||||||
context->prev = current_context;
|
|
||||||
current_context = context;
|
|
||||||
|
|
||||||
/* Copy exported variables. */
|
|
||||||
for (i = 0; i < HASHSZ; i++)
|
|
||||||
{
|
|
||||||
struct grub_env_var *var;
|
|
||||||
|
|
||||||
for (var = context->prev->vars[i]; var; var = var->next)
|
|
||||||
{
|
|
||||||
if (export && var->type == GRUB_ENV_VAR_GLOBAL)
|
|
||||||
{
|
|
||||||
if (grub_env_set (var->name, var->value) != GRUB_ERR_NONE)
|
|
||||||
{
|
|
||||||
grub_env_context_close ();
|
|
||||||
return grub_errno;
|
|
||||||
}
|
|
||||||
grub_env_export (var->name);
|
|
||||||
grub_register_variable_hook (var->name, var->read_hook, var->write_hook);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
grub_err_t
|
|
||||||
grub_env_context_close (void)
|
|
||||||
{
|
|
||||||
struct grub_env_context *context;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (! current_context->prev)
|
|
||||||
grub_fatal ("cannot close the initial context");
|
|
||||||
|
|
||||||
/* Free the variables associated with this context. */
|
|
||||||
for (i = 0; i < HASHSZ; i++)
|
|
||||||
{
|
|
||||||
struct grub_env_var *p, *q;
|
|
||||||
|
|
||||||
for (p = current_context->vars[i]; p; p = q)
|
|
||||||
{
|
|
||||||
q = p->next;
|
|
||||||
grub_free (p->name);
|
|
||||||
if (p->type != GRUB_ENV_VAR_DATA)
|
|
||||||
grub_free (p->value);
|
|
||||||
grub_free (p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore the previous context. */
|
|
||||||
context = current_context->prev;
|
|
||||||
grub_free (current_context);
|
|
||||||
current_context = context;
|
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
grub_env_insert (struct grub_env_context *context,
|
grub_env_insert (struct grub_env_context *context,
|
||||||
struct grub_env_var *var)
|
struct grub_env_var *var)
|
||||||
|
@ -165,26 +78,6 @@ grub_env_remove (struct grub_env_var *var)
|
||||||
var->next->prevp = var->prevp;
|
var->next->prevp = var->prevp;
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_err_t
|
|
||||||
grub_env_export (const char *name)
|
|
||||||
{
|
|
||||||
struct grub_env_var *var;
|
|
||||||
|
|
||||||
var = grub_env_find (name);
|
|
||||||
if (! var)
|
|
||||||
{
|
|
||||||
grub_err_t err;
|
|
||||||
|
|
||||||
err = grub_env_set (name, "");
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
var = grub_env_find (name);
|
|
||||||
}
|
|
||||||
var->type = GRUB_ENV_VAR_GLOBAL;
|
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_env_set (const char *name, const char *val)
|
grub_env_set (const char *name, const char *val)
|
||||||
{
|
{
|
||||||
|
@ -216,9 +109,8 @@ grub_env_set (const char *name, const char *val)
|
||||||
if (! var)
|
if (! var)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
/* This is not necessary, because GRUB_ENV_VAR_LOCAL == 0. But leave
|
/* This is not necessary. But leave this for readability. */
|
||||||
this for readability. */
|
var->global = 0;
|
||||||
var->type = GRUB_ENV_VAR_LOCAL;
|
|
||||||
|
|
||||||
var->name = grub_strdup (name);
|
var->name = grub_strdup (name);
|
||||||
if (! var->name)
|
if (! var->name)
|
||||||
|
@ -228,7 +120,7 @@ grub_env_set (const char *name, const char *val)
|
||||||
if (! var->value)
|
if (! var->value)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
grub_env_insert (current_context, var);
|
grub_env_insert (grub_current_context, var);
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
@ -273,8 +165,7 @@ grub_env_unset (const char *name)
|
||||||
grub_env_remove (var);
|
grub_env_remove (var);
|
||||||
|
|
||||||
grub_free (var->name);
|
grub_free (var->name);
|
||||||
if (var->type != GRUB_ENV_VAR_DATA)
|
grub_free (var->value);
|
||||||
grub_free (var->value);
|
|
||||||
grub_free (var);
|
grub_free (var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,14 +181,10 @@ grub_env_iterate (int (*func) (struct grub_env_var *var))
|
||||||
{
|
{
|
||||||
struct grub_env_var *var;
|
struct grub_env_var *var;
|
||||||
|
|
||||||
for (var = current_context->vars[i]; var; var = var->next)
|
for (var = grub_current_context->vars[i]; var; var = var->next)
|
||||||
{
|
{
|
||||||
struct grub_env_sorted_var *p, **q;
|
struct grub_env_sorted_var *p, **q;
|
||||||
|
|
||||||
/* Ignore data slots. */
|
|
||||||
if (var->type == GRUB_ENV_VAR_DATA)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sorted_var = grub_malloc (sizeof (*sorted_var));
|
sorted_var = grub_malloc (sizeof (*sorted_var));
|
||||||
if (! sorted_var)
|
if (! sorted_var)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -353,77 +240,3 @@ grub_register_variable_hook (const char *name,
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
mangle_data_slot_name (const char *name)
|
|
||||||
{
|
|
||||||
return grub_xasprintf ("\e%s", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
grub_err_t
|
|
||||||
grub_env_set_data_slot (const char *name, const void *ptr)
|
|
||||||
{
|
|
||||||
char *mangled_name;
|
|
||||||
struct grub_env_var *var;
|
|
||||||
|
|
||||||
mangled_name = mangle_data_slot_name (name);
|
|
||||||
if (! mangled_name)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
/* If the variable does already exist, just update the variable. */
|
|
||||||
var = grub_env_find (mangled_name);
|
|
||||||
if (var)
|
|
||||||
{
|
|
||||||
var->value = (char *) ptr;
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The variable does not exist, so create a new one. */
|
|
||||||
var = grub_zalloc (sizeof (*var));
|
|
||||||
if (! var)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
var->type = GRUB_ENV_VAR_DATA;
|
|
||||||
var->name = mangled_name;
|
|
||||||
var->value = (char *) ptr;
|
|
||||||
|
|
||||||
grub_env_insert (current_context, var);
|
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
|
|
||||||
grub_free (mangled_name);
|
|
||||||
return grub_errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
grub_env_get_data_slot (const char *name)
|
|
||||||
{
|
|
||||||
char *mangled_name;
|
|
||||||
void *ptr = 0;
|
|
||||||
|
|
||||||
mangled_name = mangle_data_slot_name (name);
|
|
||||||
if (! mangled_name)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
ptr = grub_env_get (mangled_name);
|
|
||||||
grub_free (mangled_name);
|
|
||||||
|
|
||||||
fail:
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
grub_env_unset_data_slot (const char *name)
|
|
||||||
{
|
|
||||||
char *mangled_name;
|
|
||||||
|
|
||||||
mangled_name = mangle_data_slot_name (name);
|
|
||||||
if (! mangled_name)
|
|
||||||
return;
|
|
||||||
|
|
||||||
grub_env_unset (mangled_name);
|
|
||||||
grub_free (mangled_name);
|
|
||||||
}
|
|
||||||
|
|
|
@ -114,7 +114,6 @@ grub_set_root_dev (void)
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
|
|
||||||
grub_register_variable_hook ("root", 0, grub_env_write_root);
|
grub_register_variable_hook ("root", 0, grub_env_write_root);
|
||||||
grub_env_export ("root");
|
|
||||||
|
|
||||||
prefix = grub_env_get ("prefix");
|
prefix = grub_env_get ("prefix");
|
||||||
|
|
||||||
|
@ -167,7 +166,6 @@ grub_main (void)
|
||||||
/* It is better to set the root device as soon as possible,
|
/* It is better to set the root device as soon as possible,
|
||||||
for convenience. */
|
for convenience. */
|
||||||
grub_machine_set_prefix ();
|
grub_machine_set_prefix ();
|
||||||
grub_env_export ("prefix");
|
|
||||||
grub_set_root_dev ();
|
grub_set_root_dev ();
|
||||||
|
|
||||||
grub_register_core_commands ();
|
grub_register_core_commands ();
|
||||||
|
|
|
@ -478,7 +478,7 @@ find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
|
||||||
{
|
{
|
||||||
grub_pci_address_t addr;
|
grub_pci_address_t addr;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
if (grub_pci_read (addr) >> 24 == 0x3)
|
if (grub_pci_read (addr) >> 24 == 0x3)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -79,7 +79,7 @@ find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
|
||||||
{
|
{
|
||||||
grub_pci_address_t addr;
|
grub_pci_address_t addr;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
if (grub_pci_read (addr) >> 24 == 0x3)
|
if (grub_pci_read (addr) >> 24 == 0x3)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -536,7 +536,11 @@ grub_linux_boot (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! grub_linux_setup_video (params))
|
if (! grub_linux_setup_video (params))
|
||||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
|
{
|
||||||
|
/* Use generic framebuffer unless VESA is known to be supported. */
|
||||||
|
if (params->have_vga != GRUB_VIDEO_LINUX_TYPE_VESA)
|
||||||
|
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
|
params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
|
||||||
|
@ -794,6 +798,10 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We can't detect VESA, but user is implicitly telling us that it
|
||||||
|
is built-in because `vga=' parameter was used. */
|
||||||
|
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
|
||||||
|
|
||||||
linux_mode
|
linux_mode
|
||||||
= &linux_vesafb_modes[vid_mode - GRUB_LINUX_VID_MODE_VESA_START];
|
= &linux_vesafb_modes[vid_mode - GRUB_LINUX_VID_MODE_VESA_START];
|
||||||
|
|
||||||
|
|
182
normal/context.c
Normal file
182
normal/context.c
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
/* env.c - Environment variables */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2003,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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.
|
||||||
|
*
|
||||||
|
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/env_private.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/command.h>
|
||||||
|
#include <grub/normal.h>
|
||||||
|
|
||||||
|
struct menu_pointer
|
||||||
|
{
|
||||||
|
grub_menu_t menu;
|
||||||
|
struct menu_pointer *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct menu_pointer initial_menu;
|
||||||
|
struct menu_pointer *current_menu = &initial_menu;
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_env_unset_menu (void)
|
||||||
|
{
|
||||||
|
current_menu->menu = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_menu_t
|
||||||
|
grub_env_get_menu (void)
|
||||||
|
{
|
||||||
|
return current_menu->menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_env_set_menu (grub_menu_t nmenu)
|
||||||
|
{
|
||||||
|
current_menu->menu = nmenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_env_context_open (int export)
|
||||||
|
{
|
||||||
|
struct grub_env_context *context;
|
||||||
|
int i;
|
||||||
|
struct menu_pointer *menu;
|
||||||
|
|
||||||
|
context = grub_zalloc (sizeof (*context));
|
||||||
|
if (! context)
|
||||||
|
return grub_errno;
|
||||||
|
menu = grub_zalloc (sizeof (*menu));
|
||||||
|
if (! menu)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
context->prev = grub_current_context;
|
||||||
|
grub_current_context = context;
|
||||||
|
|
||||||
|
menu->prev = current_menu;
|
||||||
|
current_menu = menu;
|
||||||
|
|
||||||
|
/* Copy exported variables. */
|
||||||
|
for (i = 0; i < HASHSZ; i++)
|
||||||
|
{
|
||||||
|
struct grub_env_var *var;
|
||||||
|
|
||||||
|
for (var = context->prev->vars[i]; var; var = var->next)
|
||||||
|
{
|
||||||
|
if (export && var->global)
|
||||||
|
{
|
||||||
|
if (grub_env_set (var->name, var->value) != GRUB_ERR_NONE)
|
||||||
|
{
|
||||||
|
grub_env_context_close ();
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
grub_env_export (var->name);
|
||||||
|
grub_register_variable_hook (var->name, var->read_hook, var->write_hook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_env_context_close (void)
|
||||||
|
{
|
||||||
|
struct grub_env_context *context;
|
||||||
|
int i;
|
||||||
|
struct menu_pointer *menu;
|
||||||
|
|
||||||
|
if (! grub_current_context->prev)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"cannot close the initial context");
|
||||||
|
|
||||||
|
/* Free the variables associated with this context. */
|
||||||
|
for (i = 0; i < HASHSZ; i++)
|
||||||
|
{
|
||||||
|
struct grub_env_var *p, *q;
|
||||||
|
|
||||||
|
for (p = grub_current_context->vars[i]; p; p = q)
|
||||||
|
{
|
||||||
|
q = p->next;
|
||||||
|
grub_free (p->name);
|
||||||
|
grub_free (p->value);
|
||||||
|
grub_free (p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore the previous context. */
|
||||||
|
context = grub_current_context->prev;
|
||||||
|
grub_free (grub_current_context);
|
||||||
|
grub_current_context = context;
|
||||||
|
|
||||||
|
menu = current_menu->prev;
|
||||||
|
grub_free (current_menu);
|
||||||
|
current_menu = menu;
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_env_export (const char *name)
|
||||||
|
{
|
||||||
|
struct grub_env_var *var;
|
||||||
|
|
||||||
|
var = grub_env_find (name);
|
||||||
|
if (! var)
|
||||||
|
{
|
||||||
|
grub_err_t err;
|
||||||
|
|
||||||
|
err = grub_env_set (name, "");
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
var = grub_env_find (name);
|
||||||
|
}
|
||||||
|
var->global = 1;
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_command_t export_cmd;
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_export (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
|
int argc, char **args)
|
||||||
|
{
|
||||||
|
if (argc < 1)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"no environment variable specified");
|
||||||
|
|
||||||
|
grub_env_export (args[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_context_init (void)
|
||||||
|
{
|
||||||
|
grub_env_export ("root");
|
||||||
|
grub_env_export ("prefix");
|
||||||
|
|
||||||
|
export_cmd = grub_register_command ("export", grub_cmd_export,
|
||||||
|
"export ENVVAR", "Export a variable.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_context_fini (void)
|
||||||
|
{
|
||||||
|
grub_unregister_command (export_cmd);
|
||||||
|
}
|
|
@ -137,7 +137,7 @@ free_menu (grub_menu_t menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_free (menu);
|
grub_free (menu);
|
||||||
grub_env_unset_data_slot ("menu");
|
grub_env_unset_menu ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -178,7 +178,7 @@ grub_normal_add_menu_entry (int argc, const char **args,
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
classes_tail = classes_head;
|
classes_tail = classes_head;
|
||||||
|
|
||||||
menu = grub_env_get_data_slot ("menu");
|
menu = grub_env_get_menu ();
|
||||||
if (! menu)
|
if (! menu)
|
||||||
return grub_error (GRUB_ERR_MENU, "no menu context");
|
return grub_error (GRUB_ERR_MENU, "no menu context");
|
||||||
|
|
||||||
|
@ -361,14 +361,14 @@ read_config_file (const char *config)
|
||||||
|
|
||||||
grub_menu_t newmenu;
|
grub_menu_t newmenu;
|
||||||
|
|
||||||
newmenu = grub_env_get_data_slot ("menu");
|
newmenu = grub_env_get_menu ();
|
||||||
if (! newmenu)
|
if (! newmenu)
|
||||||
{
|
{
|
||||||
newmenu = grub_zalloc (sizeof (*newmenu));
|
newmenu = grub_zalloc (sizeof (*newmenu));
|
||||||
if (! newmenu)
|
if (! newmenu)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
grub_env_set_data_slot ("menu", newmenu);
|
grub_env_set_menu (newmenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to open the config file. */
|
/* Try to open the config file. */
|
||||||
|
@ -642,6 +642,8 @@ grub_env_write_pager (struct grub_env_var *var __attribute__ ((unused)),
|
||||||
|
|
||||||
GRUB_MOD_INIT(normal)
|
GRUB_MOD_INIT(normal)
|
||||||
{
|
{
|
||||||
|
grub_context_init ();
|
||||||
|
|
||||||
/* Normal mode shouldn't be unloaded. */
|
/* Normal mode shouldn't be unloaded. */
|
||||||
if (mod)
|
if (mod)
|
||||||
grub_dl_ref (mod);
|
grub_dl_ref (mod);
|
||||||
|
@ -667,6 +669,8 @@ GRUB_MOD_INIT(normal)
|
||||||
|
|
||||||
GRUB_MOD_FINI(normal)
|
GRUB_MOD_FINI(normal)
|
||||||
{
|
{
|
||||||
|
grub_context_fini ();
|
||||||
|
|
||||||
grub_set_history (0);
|
grub_set_history (0);
|
||||||
grub_register_variable_hook ("pager", 0, 0);
|
grub_register_variable_hook ("pager", 0, 0);
|
||||||
grub_fs_autoload_hook = 0;
|
grub_fs_autoload_hook = 0;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#! /bin/sh -e
|
#! /bin/sh -e
|
||||||
|
|
||||||
# grub-mkconfig helper script.
|
# grub-mkconfig helper script.
|
||||||
# Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
|
# Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# GRUB is free software: you can redistribute it and/or modify
|
# GRUB is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -122,8 +122,9 @@ esac
|
||||||
|
|
||||||
# Gettext variables and module
|
# Gettext variables and module
|
||||||
if [ "x${LANG}" != "xC" ] ; then
|
if [ "x${LANG}" != "xC" ] ; then
|
||||||
|
prepare_grub_to_access_device $(${grub_probe} --target=device ${locale_dir})
|
||||||
cat << EOF
|
cat << EOF
|
||||||
set locale_dir=${locale_dir}
|
set locale_dir=(\$root)$(make_system_path_relative_to_its_root ${locale_dir})
|
||||||
set lang=${grub_lang}
|
set lang=${grub_lang}
|
||||||
insmod gettext
|
insmod gettext
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -60,6 +60,15 @@ linux_entry ()
|
||||||
fi
|
fi
|
||||||
printf "menuentry \"${title}\" {\n" "${os}" "${version}"
|
printf "menuentry \"${title}\" {\n" "${os}" "${version}"
|
||||||
save_default_entry | sed -e "s/^/\t/"
|
save_default_entry | sed -e "s/^/\t/"
|
||||||
|
|
||||||
|
# Use ELILO's generic "efifb" when it's known to be available.
|
||||||
|
# FIXME: We need an interface to select vesafb in case efifb can't be used.
|
||||||
|
if grep -qx "CONFIG_FB_EFI=y" /boot/config-${version} 2> /dev/null ; then
|
||||||
|
cat << EOF
|
||||||
|
set gfxpayload=keep
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "${prepare_boot_cache}" ]; then
|
if [ -z "${prepare_boot_cache}" ]; then
|
||||||
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
|
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -577,6 +577,13 @@ make_system_path_relative_to_its_root (const char *path)
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This works around special-casing of "/" in Un*x. This function never
|
||||||
|
prints trailing slashes (so that its output can be appended a slash
|
||||||
|
unconditionally). Each slash in is considered a preceding slash, and
|
||||||
|
therefore the root directory is an empty string. */
|
||||||
|
if (!strcmp (buf3, "/"))
|
||||||
|
buf3[0] = '\0';
|
||||||
|
|
||||||
return buf3;
|
return buf3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ grub_pci_make_address (grub_pci_device_t dev, int reg)
|
||||||
{
|
{
|
||||||
grub_pci_address_t ret;
|
grub_pci_address_t ret;
|
||||||
ret.dev = dev;
|
ret.dev = dev;
|
||||||
ret.pos = reg << 2;
|
ret.pos = reg;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
|
||||||
{
|
{
|
||||||
grub_pci_address_t addr;
|
grub_pci_address_t addr;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
if (grub_pci_read (addr) >> 24 == 0x3)
|
if (grub_pci_read (addr) >> 24 == 0x3)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -974,32 +974,83 @@ grub_video_fb_scroll (grub_video_color_t color, int dx, int dy)
|
||||||
{
|
{
|
||||||
/* 3. Move data in render target. */
|
/* 3. Move data in render target. */
|
||||||
struct grub_video_fbblit_info target;
|
struct grub_video_fbblit_info target;
|
||||||
grub_uint8_t *src;
|
int i, j;
|
||||||
grub_uint8_t *dst;
|
int linedelta, linelen;
|
||||||
int j;
|
|
||||||
|
|
||||||
target.mode_info = &render_target->mode_info;
|
target.mode_info = &render_target->mode_info;
|
||||||
target.data = render_target->data;
|
target.data = render_target->data;
|
||||||
|
|
||||||
/* Check vertical direction of the move. */
|
linedelta = target.mode_info->pitch
|
||||||
if (dy <= 0)
|
- width * target.mode_info->bytes_per_pixel;
|
||||||
/* 3a. Move data upwards. */
|
linelen = width * target.mode_info->bytes_per_pixel;
|
||||||
for (j = 0; j < height; j++)
|
#define DO_SCROLL \
|
||||||
{
|
/* Check vertical direction of the move. */ \
|
||||||
dst = grub_video_fb_get_video_ptr (&target, dst_x, dst_y + j);
|
if (dy < 0 || (dy == 0 && dx < 0)) \
|
||||||
src = grub_video_fb_get_video_ptr (&target, src_x, src_y + j);
|
{ \
|
||||||
grub_memmove (dst, src,
|
dst = (void *) grub_video_fb_get_video_ptr (&target, \
|
||||||
width * target.mode_info->bytes_per_pixel);
|
dst_x, dst_y); \
|
||||||
}
|
src = (void *) grub_video_fb_get_video_ptr (&target, \
|
||||||
|
src_x, src_y); \
|
||||||
|
/* 3a. Move data upwards. */ \
|
||||||
|
for (j = 0; j < height; j++) \
|
||||||
|
{ \
|
||||||
|
for (i = 0; i < linelen; i++) \
|
||||||
|
*(dst++) = *(src++); \
|
||||||
|
dst += linedelta; \
|
||||||
|
src += linedelta; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
/* 3b. Move data downwards. */ \
|
||||||
|
dst = (void *) grub_video_fb_get_video_ptr (&target, \
|
||||||
|
dst_x + width - 1, \
|
||||||
|
dst_y + height - 1); \
|
||||||
|
src = (void *) grub_video_fb_get_video_ptr (&target, \
|
||||||
|
src_x + width - 1, \
|
||||||
|
src_y + height - 1); \
|
||||||
|
for (j = 0; j < height; j++) \
|
||||||
|
{ \
|
||||||
|
for (i = 0; i < linelen; i++) \
|
||||||
|
*(dst--) = *(src--); \
|
||||||
|
dst -= linedelta; \
|
||||||
|
src -= linedelta; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If everything is aligned on 32-bit use 32-bit copy. */
|
||||||
|
if ((grub_addr_t) grub_video_fb_get_video_ptr (&target, src_x, src_y)
|
||||||
|
% sizeof (grub_uint32_t) == 0
|
||||||
|
&& (grub_addr_t) grub_video_fb_get_video_ptr (&target, dst_x, dst_y)
|
||||||
|
% sizeof (grub_uint32_t) == 0
|
||||||
|
&& linelen % sizeof (grub_uint32_t) == 0
|
||||||
|
&& linedelta % sizeof (grub_uint32_t) == 0)
|
||||||
|
{
|
||||||
|
grub_uint32_t *src, *dst;
|
||||||
|
linelen /= sizeof (grub_uint32_t);
|
||||||
|
linedelta /= sizeof (grub_uint32_t);
|
||||||
|
DO_SCROLL
|
||||||
|
}
|
||||||
|
/* If everything is aligned on 16-bit use 16-bit copy. */
|
||||||
|
else if ((grub_addr_t) grub_video_fb_get_video_ptr (&target, src_x, src_y)
|
||||||
|
% sizeof (grub_uint16_t) == 0
|
||||||
|
&& (grub_addr_t) grub_video_fb_get_video_ptr (&target,
|
||||||
|
dst_x, dst_y)
|
||||||
|
% sizeof (grub_uint16_t) == 0
|
||||||
|
&& linelen % sizeof (grub_uint16_t) == 0
|
||||||
|
&& linedelta % sizeof (grub_uint16_t) == 0)
|
||||||
|
{
|
||||||
|
grub_uint16_t *src, *dst;
|
||||||
|
linelen /= sizeof (grub_uint16_t);
|
||||||
|
linedelta /= sizeof (grub_uint16_t);
|
||||||
|
DO_SCROLL
|
||||||
|
}
|
||||||
|
/* If not aligned at all use 8-bit copy. */
|
||||||
else
|
else
|
||||||
/* 3b. Move data downwards. */
|
{
|
||||||
for (j = (height - 1); j >= 0; j--)
|
grub_uint8_t *src, *dst;
|
||||||
{
|
DO_SCROLL
|
||||||
dst = grub_video_fb_get_video_ptr (&target, dst_x, dst_y + j);
|
}
|
||||||
src = grub_video_fb_get_video_ptr (&target, src_x, src_y + j);
|
|
||||||
grub_memmove (dst, src,
|
|
||||||
width * target.mode_info->bytes_per_pixel);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 4. Fill empty space with specified color. In this implementation
|
/* 4. Fill empty space with specified color. In this implementation
|
||||||
|
|
|
@ -74,7 +74,7 @@ grub_video_sm712_setup (unsigned int width, unsigned int height,
|
||||||
grub_pci_address_t addr;
|
grub_pci_address_t addr;
|
||||||
grub_uint32_t class;
|
grub_uint32_t class;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 2);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
class = grub_pci_read (addr);
|
class = grub_pci_read (addr);
|
||||||
|
|
||||||
if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x0712126f)
|
if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x0712126f)
|
||||||
|
@ -82,7 +82,7 @@ grub_video_sm712_setup (unsigned int width, unsigned int height,
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
addr = grub_pci_make_address (dev, 4);
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||||
framebuffer.base = grub_pci_read (addr);
|
framebuffer.base = grub_pci_read (addr);
|
||||||
framebuffer.dev = dev;
|
framebuffer.dev = dev;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue