Adjust mips relocator
This commit is contained in:
parent
97b2dc70b4
commit
a51df0a1b4
2 changed files with 31 additions and 7 deletions
|
@ -31,7 +31,6 @@
|
||||||
#define GRUB_ARCH_LOWMEMMAXSIZE 0x10000000
|
#define GRUB_ARCH_LOWMEMMAXSIZE 0x10000000
|
||||||
#define GRUB_ARCH_HIGHMEMPSTART 0x10000000
|
#define GRUB_ARCH_HIGHMEMPSTART 0x10000000
|
||||||
|
|
||||||
|
|
||||||
#define GRUB_MACHINE_MEMORY_AVAILABLE 1
|
#define GRUB_MACHINE_MEMORY_AVAILABLE 1
|
||||||
#define GRUB_MACHINE_MEMORY_MAX_TYPE 1
|
#define GRUB_MACHINE_MEMORY_MAX_TYPE 1
|
||||||
/* This one is special: it's used internally but is never reported
|
/* This one is special: it's used internally but is never reported
|
||||||
|
@ -40,6 +39,27 @@
|
||||||
#define GRUB_MACHINE_MEMORY_RESERVED GRUB_MACHINE_MEMORY_HOLE
|
#define GRUB_MACHINE_MEMORY_RESERVED GRUB_MACHINE_MEMORY_HOLE
|
||||||
|
|
||||||
#ifndef ASM_FILE
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
typedef grub_addr_t grub_phys_addr_t;
|
||||||
|
|
||||||
|
static inline grub_phys_addr_t
|
||||||
|
grub_vtop (void *a)
|
||||||
|
{
|
||||||
|
return ((grub_phys_addr_t) a) & 0x1fffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
grub_map_memory (grub_phys_addr_t a, grub_size_t size __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
return (void *) (a | 0x80000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_unmap_memory (void *a __attribute__ ((unused)),
|
||||||
|
grub_size_t size __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
grub_err_t EXPORT_FUNC (grub_machine_mmap_iterate)
|
grub_err_t EXPORT_FUNC (grub_machine_mmap_iterate)
|
||||||
(int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t));
|
(int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t));
|
||||||
|
|
||||||
|
|
|
@ -111,15 +111,16 @@ grub_err_t
|
||||||
grub_relocator32_boot (struct grub_relocator *rel,
|
grub_relocator32_boot (struct grub_relocator *rel,
|
||||||
struct grub_relocator32_state state)
|
struct grub_relocator32_state state)
|
||||||
{
|
{
|
||||||
grub_addr_t target;
|
grub_relocator_chunk_t ch;
|
||||||
void *src, *ptr;
|
void *ptr;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
grub_addr_t relst;
|
void *relst;
|
||||||
grub_size_t relsize;
|
grub_size_t relsize;
|
||||||
grub_size_t stateset_size = 31 * REGW_SIZEOF + JUMP_SIZEOF;
|
grub_size_t stateset_size = 31 * REGW_SIZEOF + JUMP_SIZEOF;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
grub_addr_t vtarget;
|
||||||
|
|
||||||
err = grub_relocator_alloc_chunk_align (rel, &src, &target, 0,
|
err = grub_relocator_alloc_chunk_align (rel, &ch, 0,
|
||||||
(0xffffffff - stateset_size)
|
(0xffffffff - stateset_size)
|
||||||
+ 1, stateset_size,
|
+ 1, stateset_size,
|
||||||
sizeof (grub_uint32_t),
|
sizeof (grub_uint32_t),
|
||||||
|
@ -127,12 +128,15 @@ grub_relocator32_boot (struct grub_relocator *rel,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
ptr = src;
|
ptr = get_virtual_current_address (ch);
|
||||||
for (i = 1; i < 32; i++)
|
for (i = 1; i < 32; i++)
|
||||||
write_reg (i, state.gpr[i], &ptr);
|
write_reg (i, state.gpr[i], &ptr);
|
||||||
write_jump (state.jumpreg, &ptr);
|
write_jump (state.jumpreg, &ptr);
|
||||||
|
|
||||||
err = grub_relocator_prepare_relocs (rel, target, &relst, &relsize);
|
vtarget = (grub_addr_t) grub_map_memory (get_physical_target_address (ch),
|
||||||
|
stateset_size);
|
||||||
|
|
||||||
|
err = grub_relocator_prepare_relocs (rel, vtarget, &relst, &relsize);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue