merge mainline into intwrap
This commit is contained in:
commit
4dff488793
94 changed files with 2524 additions and 699 deletions
|
@ -26,6 +26,7 @@
|
|||
#include <grub/file.h>
|
||||
#include <grub/device.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/i18n.h>
|
||||
|
||||
/* set ENVVAR=VALUE */
|
||||
static grub_err_t
|
||||
|
@ -178,11 +179,13 @@ void
|
|||
grub_register_core_commands (void)
|
||||
{
|
||||
grub_register_command ("set", grub_core_cmd_set,
|
||||
"[ENVVAR=VALUE]", "Set an environment variable.");
|
||||
N_("[ENVVAR=VALUE]"),
|
||||
N_("Set an environment variable."));
|
||||
grub_register_command ("unset", grub_core_cmd_unset,
|
||||
"ENVVAR", "Remove an environment variable.");
|
||||
N_("ENVVAR"),
|
||||
N_("Remove an environment variable."));
|
||||
grub_register_command ("ls", grub_core_cmd_ls,
|
||||
"[ARG]", "List devices or files.");
|
||||
N_("[ARG]"), N_("List devices or files."));
|
||||
grub_register_command ("insmod", grub_core_cmd_insmod,
|
||||
"MODULE", "Insert a module.");
|
||||
N_("MODULE"), N_("Insert a module."));
|
||||
}
|
||||
|
|
|
@ -107,7 +107,9 @@ grub_machine_init (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU)
|
||||
grub_machine_mmap_init ();
|
||||
#endif
|
||||
grub_machine_mmap_iterate (heap_init);
|
||||
|
||||
grub_tsc_init ();
|
||||
|
|
|
@ -57,13 +57,23 @@ signature_found:
|
|||
(long) table_header->size);
|
||||
for (; table_item->size;
|
||||
table_item = (grub_linuxbios_table_item_t) ((long) table_item + (long) table_item->size))
|
||||
if (hook (table_item))
|
||||
return 1;
|
||||
{
|
||||
if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK
|
||||
&& check_signature ((grub_linuxbios_table_header_t) (grub_addr_t)
|
||||
*(grub_uint64_t *) (table_item + 1)))
|
||||
{
|
||||
table_header = (grub_linuxbios_table_header_t) (grub_addr_t)
|
||||
*(grub_uint64_t *) (table_item + 1);
|
||||
goto signature_found;
|
||||
}
|
||||
if (hook (table_item))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
grub_err_t
|
||||
grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t))
|
||||
{
|
||||
mem_region_t mem_region;
|
||||
|
|
|
@ -66,10 +66,12 @@ multiboot_header:
|
|||
.long -0x1BADB002 - MULTIBOOT_MEMORY_INFO
|
||||
|
||||
codestart:
|
||||
#ifdef GRUB_MACHINE_MULTIBOOT
|
||||
cmpl $MULTIBOOT_BOOTLOADER_MAGIC, %eax
|
||||
jne 0f
|
||||
movl %ebx, EXT_C(startup_multiboot_info)
|
||||
0:
|
||||
#endif
|
||||
|
||||
/* initialize the stack */
|
||||
movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp
|
||||
|
|
|
@ -102,7 +102,7 @@ grub_load_config (void)
|
|||
auto int hook (struct grub_module_header *);
|
||||
int hook (struct grub_module_header *header)
|
||||
{
|
||||
/* Not an ELF module, skip. */
|
||||
/* Not an embedded config, skip. */
|
||||
if (header->type != OBJ_TYPE_CONFIG)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -1066,3 +1066,12 @@ void __enable_execute_stack (void *addr __attribute__ ((unused)))
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined (NEED_REGISTER_FRAME_INFO) && !defined(GRUB_UTIL)
|
||||
void __register_frame_info (void)
|
||||
{
|
||||
}
|
||||
|
||||
void __deregister_frame_info (void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
|
38
kern/mm.c
38
kern/mm.c
|
@ -148,15 +148,14 @@ grub_mm_init_region (void *addr, grub_size_t size)
|
|||
grub_printf ("Using memory for heap: start=%p, end=%p\n", addr, addr + (unsigned int) size);
|
||||
#endif
|
||||
|
||||
/* If this region is too small, ignore it. */
|
||||
if (size < GRUB_MM_ALIGN * 2)
|
||||
return;
|
||||
|
||||
/* Allocate a region from the head. */
|
||||
r = (grub_mm_region_t) (((grub_addr_t) addr + GRUB_MM_ALIGN - 1)
|
||||
& (~(GRUB_MM_ALIGN - 1)));
|
||||
r = (grub_mm_region_t) ALIGN_UP ((grub_addr_t) addr, GRUB_MM_ALIGN);
|
||||
size -= (char *) r - (char *) addr + sizeof (*r);
|
||||
|
||||
/* If this region is too small, ignore it. */
|
||||
if (size < GRUB_MM_ALIGN)
|
||||
return;
|
||||
|
||||
h = (grub_mm_header_t) ((char *) r + GRUB_MM_ALIGN);
|
||||
h->next = h;
|
||||
h->magic = GRUB_MM_FREE_MAGIC;
|
||||
|
@ -221,9 +220,8 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
|
|||
+---------------+ v
|
||||
*/
|
||||
q->next = p->next;
|
||||
p->magic = GRUB_MM_ALLOC_MAGIC;
|
||||
}
|
||||
else if (extra == 0 || p->size == n + extra)
|
||||
else if (align == 1 || p->size == n + extra)
|
||||
{
|
||||
/* There might be alignment requirement, when taking it into
|
||||
account memory block fits in.
|
||||
|
@ -240,10 +238,25 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
|
|||
| alloc, size=n | |
|
||||
+---------------+ v
|
||||
*/
|
||||
|
||||
p->size -= n;
|
||||
p += p->size;
|
||||
p->size = n;
|
||||
p->magic = GRUB_MM_ALLOC_MAGIC;
|
||||
}
|
||||
else if (extra == 0)
|
||||
{
|
||||
grub_mm_header_t r;
|
||||
|
||||
r = p + extra + n;
|
||||
r->magic = GRUB_MM_FREE_MAGIC;
|
||||
r->size = p->size - extra - n;
|
||||
r->next = p->next;
|
||||
q->next = r;
|
||||
|
||||
if (q == p)
|
||||
{
|
||||
q = r;
|
||||
r->next = r;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -276,10 +289,11 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
|
|||
p->size = extra;
|
||||
p->next = r;
|
||||
p += extra;
|
||||
p->size = n;
|
||||
p->magic = GRUB_MM_ALLOC_MAGIC;
|
||||
}
|
||||
|
||||
p->magic = GRUB_MM_ALLOC_MAGIC;
|
||||
p->size = n;
|
||||
|
||||
/* Mark find as a start marker for next allocation to fasten it.
|
||||
This will have side effect of fragmenting memory as small
|
||||
pieces before this will be un-used. */
|
||||
|
|
|
@ -249,12 +249,11 @@ grub_parser_execute (char *source)
|
|||
}
|
||||
|
||||
p = grub_strchr (source, '\n');
|
||||
if (p)
|
||||
*p = 0;
|
||||
|
||||
*line = grub_strdup (source);
|
||||
if (p)
|
||||
*p = '\n';
|
||||
*line = grub_strndup (source, p - source);
|
||||
else
|
||||
*line = grub_strdup (source);
|
||||
source = p ? p + 1 : 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue