Make cutmem accept a region specification.
Suggested by: Samuel Thibault * grub-core/mmap/mmap.c (parsemem): New function. (grub_cmd_cutmem): Handle new arguments.
This commit is contained in:
parent
2ea57f8844
commit
7bda3a87af
2 changed files with 47 additions and 25 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2010-09-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Make cutmem accept a region specification.
|
||||||
|
Suggested by: Samuel Thibault
|
||||||
|
|
||||||
|
* grub-core/mmap/mmap.c (parsemem): New function.
|
||||||
|
(grub_cmd_cutmem): Handle new arguments.
|
||||||
|
|
||||||
2010-09-20 Vladimir Serbinenko <phcoder@gmail.com>
|
2010-09-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
New command cutmem.
|
New command cutmem.
|
||||||
|
|
|
@ -398,12 +398,33 @@ grub_cmd_badram (grub_command_t cmd __attribute__ ((unused)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_uint64_t
|
||||||
|
parsemem (const char *str)
|
||||||
|
{
|
||||||
|
grub_uint64_t ret;
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
ret = grub_strtoul (str, &ptr, 0);
|
||||||
|
|
||||||
|
switch (*ptr)
|
||||||
|
{
|
||||||
|
case 'K':
|
||||||
|
return ret << 10;
|
||||||
|
case 'M':
|
||||||
|
return ret << 20;
|
||||||
|
case 'G':
|
||||||
|
return ret << 30;
|
||||||
|
case 'T':
|
||||||
|
return ret << 40;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_cmd_cutmem (grub_command_t cmd __attribute__ ((unused)),
|
grub_cmd_cutmem (grub_command_t cmd __attribute__ ((unused)),
|
||||||
int argc, char **args)
|
int argc, char **args)
|
||||||
{
|
{
|
||||||
grub_uint64_t cutmem;
|
grub_uint64_t from, to;
|
||||||
char *ptr;
|
|
||||||
|
|
||||||
auto int NESTED_FUNC_ATTR hook (grub_uint64_t, grub_uint64_t,
|
auto int NESTED_FUNC_ATTR hook (grub_uint64_t, grub_uint64_t,
|
||||||
grub_memory_type_t);
|
grub_memory_type_t);
|
||||||
|
@ -413,36 +434,29 @@ grub_cmd_cutmem (grub_command_t cmd __attribute__ ((unused)),
|
||||||
{
|
{
|
||||||
grub_uint64_t end = addr + size;
|
grub_uint64_t end = addr + size;
|
||||||
|
|
||||||
if (end >= cutmem)
|
if (addr <= from)
|
||||||
|
addr = from;
|
||||||
|
if (end >= to)
|
||||||
|
end = to;
|
||||||
|
|
||||||
|
if (end <= addr)
|
||||||
return 0;
|
return 0;
|
||||||
if (addr < cutmem)
|
|
||||||
addr = cutmem;
|
|
||||||
|
|
||||||
grub_mmap_register (addr, end - addr, GRUB_MEMORY_HOLE);
|
grub_mmap_register (addr, end - addr, GRUB_MEMORY_HOLE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc != 1)
|
if (argc != 2)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "number required");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "argements required");
|
||||||
|
|
||||||
cutmem = grub_strtoul (args[0], &ptr, 0);
|
from = parsemem (args[0]);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
switch (*ptr)
|
|
||||||
{
|
to = parsemem (args[1]);
|
||||||
case 'K':
|
if (grub_errno)
|
||||||
cutmem <<= 10;
|
return grub_errno;
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
cutmem <<= 20;
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
cutmem <<= 30;
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
cutmem <<= 40;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
grub_mmap_iterate (hook);
|
grub_mmap_iterate (hook);
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
|
@ -457,8 +471,8 @@ GRUB_MOD_INIT(mmap)
|
||||||
N_("ADDR1,MASK1[,ADDR2,MASK2[,...]]"),
|
N_("ADDR1,MASK1[,ADDR2,MASK2[,...]]"),
|
||||||
N_("Declare memory regions as badram."));
|
N_("Declare memory regions as badram."));
|
||||||
cmd_cut = grub_register_command ("cutmem", grub_cmd_cutmem,
|
cmd_cut = grub_register_command ("cutmem", grub_cmd_cutmem,
|
||||||
N_("ADDR[K|M|G]"),
|
N_("FROM[K|M|G] TO[K|M|G]"),
|
||||||
N_("Remove any memory regions above ADDR."));
|
N_("Remove any memory regions in specified range."));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue