Implement grub_machine_get_bootlocation for ARC.
This commit is contained in:
parent
dc2a6c8b0e
commit
17f9fd29d3
8 changed files with 207 additions and 9 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
2013-04-27 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Implement grub_machine_get_bootlocation for ARC.
|
||||||
|
|
||||||
2013-04-27 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-04-27 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
Improve AHCI detection and command issuing.
|
Improve AHCI detection and command issuing.
|
||||||
|
|
|
@ -76,6 +76,7 @@ kernel = {
|
||||||
mips_arc_ldflags = '-Wl,-Ttext,$(TARGET_LINK_ADDR)';
|
mips_arc_ldflags = '-Wl,-Ttext,$(TARGET_LINK_ADDR)';
|
||||||
mips_qemu_mips_ldflags = '-Wl,-Ttext,0x80200000';
|
mips_qemu_mips_ldflags = '-Wl,-Ttext,0x80200000';
|
||||||
|
|
||||||
|
mips_arc_cppflags = '-DGRUB_DECOMPRESSOR_LINK_ADDR=$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||||
mips_loongson_cppflags = '-DUSE_ASCII_FAILBACK';
|
mips_loongson_cppflags = '-DUSE_ASCII_FAILBACK';
|
||||||
i386_qemu_cppflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
i386_qemu_cppflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
||||||
emu_cflags = '$(CFLAGS_GNULIB)';
|
emu_cflags = '$(CFLAGS_GNULIB)';
|
||||||
|
|
|
@ -196,6 +196,21 @@ do_check:
|
||||||
argfw:
|
argfw:
|
||||||
not $s7, $a2
|
not $s7, $a2
|
||||||
cmdlinedone:
|
cmdlinedone:
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_ARC
|
||||||
|
lui $t0, %hi(_start - 256)
|
||||||
|
addiu $t0, $t0, %lo(_start - 256)
|
||||||
|
addiu $t3, $t0, 255
|
||||||
|
lw $t1, 0($a1)
|
||||||
|
1:
|
||||||
|
bne $t0, $t3, 2f
|
||||||
|
lb $t2, 0($t1)
|
||||||
|
move $t2, $zero
|
||||||
|
2:
|
||||||
|
sb $t2, 0($t0)
|
||||||
|
addiu $t0, $t0, 1
|
||||||
|
bnez $t2, 1b
|
||||||
|
addiu $t1, $t1, 1
|
||||||
#endif
|
#endif
|
||||||
/* Copy the decompressor. */
|
/* Copy the decompressor. */
|
||||||
lui $t1, %hi(base)
|
lui $t1, %hi(base)
|
||||||
|
@ -253,10 +268,15 @@ cmdlinedone:
|
||||||
lui $t0, %hi(EXT_C(grub_decompress_core))
|
lui $t0, %hi(EXT_C(grub_decompress_core))
|
||||||
addiu $t0, $t0, %lo(EXT_C(grub_decompress_core))
|
addiu $t0, $t0, %lo(EXT_C(grub_decompress_core))
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_ARC
|
||||||
|
lui $sp, %hi(_start - 512)
|
||||||
|
jalr $t0
|
||||||
|
addiu $sp, $sp, %lo(_start - 512)
|
||||||
|
#else
|
||||||
lui $sp, %hi(_start - 256)
|
lui $sp, %hi(_start - 256)
|
||||||
jalr $t0
|
jalr $t0
|
||||||
addiu $sp, $sp, %lo(_start - 256)
|
addiu $sp, $sp, %lo(_start - 256)
|
||||||
|
#endif
|
||||||
move $a0, $s1
|
move $a0, $s1
|
||||||
move $a1, $s6
|
move $a1, $s6
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include <grub/arc/arc.h>
|
#include <grub/arc/arc.h>
|
||||||
#include <grub/offsets.h>
|
#include <grub/offsets.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/disk.h>
|
||||||
|
#include <grub/partition.h>
|
||||||
|
|
||||||
const char *type_names[] = {
|
const char *type_names[] = {
|
||||||
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||||
|
@ -164,10 +166,42 @@ grub_arc_alt_name_to_norm (const char *name, const char *suffix)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
norm_name_to_alt (const char *name)
|
||||||
|
{
|
||||||
|
char *optr;
|
||||||
|
const char *iptr;
|
||||||
|
int state = 0;
|
||||||
|
char * ret = grub_malloc (grub_strlen (name) + sizeof ("arc/"));
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
optr = grub_stpcpy (ret, "arc/");
|
||||||
|
for (iptr = name; *iptr; iptr++)
|
||||||
|
{
|
||||||
|
if (state == 1)
|
||||||
|
{
|
||||||
|
*optr++ = '/';
|
||||||
|
state = 0;
|
||||||
|
}
|
||||||
|
if (*iptr == '(')
|
||||||
|
continue;
|
||||||
|
if (*iptr == ')')
|
||||||
|
{
|
||||||
|
state = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*optr++ = *iptr;
|
||||||
|
}
|
||||||
|
*optr = '\0';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
extern grub_uint32_t grub_total_modules_size __attribute__ ((section(".text")));
|
extern grub_uint32_t grub_total_modules_size __attribute__ ((section(".text")));
|
||||||
grub_addr_t grub_modbase;
|
grub_addr_t grub_modbase;
|
||||||
|
|
||||||
extern char _end[];
|
extern char _end[];
|
||||||
|
static char boot_location[256];
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_machine_init (void)
|
grub_machine_init (void)
|
||||||
|
@ -175,6 +209,9 @@ grub_machine_init (void)
|
||||||
struct grub_arc_memory_descriptor *cur = NULL;
|
struct grub_arc_memory_descriptor *cur = NULL;
|
||||||
grub_addr_t modend;
|
grub_addr_t modend;
|
||||||
|
|
||||||
|
grub_memcpy (boot_location,
|
||||||
|
(char *) (GRUB_DECOMPRESSOR_LINK_ADDR - 256), 256);
|
||||||
|
|
||||||
grub_modbase = ALIGN_UP ((grub_addr_t) _end, GRUB_KERNEL_MACHINE_MOD_ALIGN);
|
grub_modbase = ALIGN_UP ((grub_addr_t) _end, GRUB_KERNEL_MACHINE_MOD_ALIGN);
|
||||||
modend = grub_modbase + grub_total_modules_size;
|
modend = grub_modbase + grub_total_modules_size;
|
||||||
grub_console_init_early ();
|
grub_console_init_early ();
|
||||||
|
@ -239,3 +276,133 @@ grub_exit (void)
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_part (char *dev)
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
if (!*dev)
|
||||||
|
return 0;
|
||||||
|
ptr = dev + grub_strlen (dev) - 1;
|
||||||
|
if (ptr == dev || *ptr != ')')
|
||||||
|
return 0;
|
||||||
|
ptr--;
|
||||||
|
while (grub_isdigit (*ptr) && ptr > dev)
|
||||||
|
ptr--;
|
||||||
|
if (*ptr != '(' || ptr == dev)
|
||||||
|
return 0;
|
||||||
|
ptr--;
|
||||||
|
if (ptr - dev < (int) sizeof ("partition") - 2)
|
||||||
|
return 0;
|
||||||
|
ptr -= sizeof ("partition") - 2;
|
||||||
|
if (grub_memcmp (ptr, "partition", sizeof ("partition") - 1) != 0)
|
||||||
|
return 0;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_disk_addr_t
|
||||||
|
get_partition_offset (char *part, grub_disk_addr_t *en)
|
||||||
|
{
|
||||||
|
grub_arc_fileno_t handle;
|
||||||
|
grub_disk_addr_t ret = -1;
|
||||||
|
struct grub_arc_fileinfo info;
|
||||||
|
grub_arc_err_t r;
|
||||||
|
|
||||||
|
if (GRUB_ARC_FIRMWARE_VECTOR->open (part, GRUB_ARC_FILE_ACCESS_OPEN_RO,
|
||||||
|
&handle))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
r = GRUB_ARC_FIRMWARE_VECTOR->getfileinformation (handle, &info);
|
||||||
|
if (!r)
|
||||||
|
{
|
||||||
|
ret = (info.start >> 9);
|
||||||
|
*en = (info.end >> 9);
|
||||||
|
}
|
||||||
|
GRUB_ARC_FIRMWARE_VECTOR->close (handle);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct get_device_name_ctx
|
||||||
|
{
|
||||||
|
char *partition_name;
|
||||||
|
grub_disk_addr_t poff, pend;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_device_name_iter (grub_disk_t disk __attribute__ ((unused)),
|
||||||
|
const grub_partition_t part, void *data)
|
||||||
|
{
|
||||||
|
struct get_device_name_ctx *ctx = data;
|
||||||
|
|
||||||
|
if (grub_partition_get_start (part) == ctx->poff
|
||||||
|
&& grub_partition_get_len (part) == ctx->pend)
|
||||||
|
{
|
||||||
|
ctx->partition_name = grub_partition_get_name (part);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||||
|
char **path __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
char *loaddev = boot_location;
|
||||||
|
char *pptr, *partptr;
|
||||||
|
char *dname;
|
||||||
|
grub_disk_addr_t poff = -1, pend;
|
||||||
|
struct get_device_name_ctx ctx;
|
||||||
|
grub_disk_t parent = 0;
|
||||||
|
|
||||||
|
pptr = grub_strchr (loaddev, '/');
|
||||||
|
if (pptr)
|
||||||
|
{
|
||||||
|
*path = grub_strdup (pptr);
|
||||||
|
*pptr = '\0';
|
||||||
|
}
|
||||||
|
partptr = get_part (loaddev);
|
||||||
|
if (partptr)
|
||||||
|
{
|
||||||
|
poff = get_partition_offset (loaddev, &pend);
|
||||||
|
*partptr = '\0';
|
||||||
|
}
|
||||||
|
dname = norm_name_to_alt (loaddev);
|
||||||
|
if (poff == (grub_addr_t) -1)
|
||||||
|
{
|
||||||
|
*device = dname;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = grub_disk_open (dname);
|
||||||
|
if (!parent)
|
||||||
|
{
|
||||||
|
*device = dname;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (poff == 0
|
||||||
|
&& pend == grub_disk_get_size (parent))
|
||||||
|
{
|
||||||
|
grub_disk_close (parent);
|
||||||
|
*device = dname;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.partition_name = NULL;
|
||||||
|
ctx.poff = poff;
|
||||||
|
ctx.pend = pend;
|
||||||
|
|
||||||
|
grub_partition_iterate (parent, get_device_name_iter, &ctx);
|
||||||
|
grub_disk_close (parent);
|
||||||
|
|
||||||
|
if (! ctx.partition_name)
|
||||||
|
{
|
||||||
|
*device = dname;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*device = grub_xasprintf ("%s,%s", dname,
|
||||||
|
ctx.partition_name);
|
||||||
|
grub_free (ctx.partition_name);
|
||||||
|
grub_free (dname);
|
||||||
|
}
|
||||||
|
|
|
@ -36,9 +36,3 @@ grub_get_rtc (void)
|
||||||
|
|
||||||
return (((grub_uint64_t) high) << 32) | low;
|
return (((grub_uint64_t) high) << 32) | low;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
|
||||||
char **path __attribute__ ((unused)))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -259,6 +259,12 @@ grub_exit (void)
|
||||||
grub_halt ();
|
grub_halt ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||||
|
char **path __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
extern char _end[];
|
extern char _end[];
|
||||||
grub_addr_t grub_modbase = (grub_addr_t) _end;
|
grub_addr_t grub_modbase = (grub_addr_t) _end;
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,12 @@ grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||||
|
char **path __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
extern char _end[];
|
extern char _end[];
|
||||||
grub_addr_t grub_modbase = (grub_addr_t) _end;
|
grub_addr_t grub_modbase = (grub_addr_t) _end;
|
||||||
|
|
||||||
|
|
|
@ -489,7 +489,7 @@ if [ -e "${iso9660_dir}"/boot/grub/sparc64-ieee1275/core.img ] && [ "$system_are
|
||||||
grub_mkisofs_arguments="${grub_mkisofs_arguments} -G $sysarea_img -B , --grub2-sparc-core /boot/grub/sparc64-ieee1275/core.img"
|
grub_mkisofs_arguments="${grub_mkisofs_arguments} -G $sysarea_img -B , --grub2-sparc-core /boot/grub/sparc64-ieee1275/core.img"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
make_image "${arcs_dir}" mips-arc "${iso9660_dir}/boot/grub/mips-arc/core.img" ""
|
make_image_fwdisk "${arcs_dir}" mips-arc "${iso9660_dir}/boot/grub/mips-arc/core.img" ""
|
||||||
if [ -e "${iso9660_dir}/boot/grub/mips-arc/core.img" ]; then
|
if [ -e "${iso9660_dir}/boot/grub/mips-arc/core.img" ]; then
|
||||||
grub_mkisofs_arguments="${grub_mkisofs_arguments} /boot/grub/mips-arc/grub=${iso9660_dir}/boot/grub/mips-arc/core.img /boot/grub/mips-arc/sashARCS=${iso9660_dir}/boot/grub/mips-arc/core.img /boot/grub/mips-arc/sash=${iso9660_dir}/boot/grub/mips-arc/core.img"
|
grub_mkisofs_arguments="${grub_mkisofs_arguments} /boot/grub/mips-arc/grub=${iso9660_dir}/boot/grub/mips-arc/core.img /boot/grub/mips-arc/sashARCS=${iso9660_dir}/boot/grub/mips-arc/core.img /boot/grub/mips-arc/sash=${iso9660_dir}/boot/grub/mips-arc/core.img"
|
||||||
fi
|
fi
|
||||||
|
@ -497,7 +497,7 @@ if [ -e "${iso9660_dir}/boot/grub/mips-arc/core.img" ] && [ "$system_area" = arc
|
||||||
grub_mkisofs_arguments="${grub_mkisofs_arguments} -mips-boot /boot/grub/mips-arc/sashARCS -mips-boot /boot/grub/mips-arc/sash -mips-boot /boot/grub/mips-arc/grub"
|
grub_mkisofs_arguments="${grub_mkisofs_arguments} -mips-boot /boot/grub/mips-arc/sashARCS -mips-boot /boot/grub/mips-arc/sash -mips-boot /boot/grub/mips-arc/grub"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
make_image "${arc_dir}" mipsel-arc "${iso9660_dir}/boot/grub/arc.exe" ""
|
make_image_fwdisk "${arc_dir}" mipsel-arc "${iso9660_dir}/boot/grub/arc.exe" ""
|
||||||
|
|
||||||
make_image "${mipsel_qemu_dir}" mipsel-qemu_mips-elf "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" "pata"
|
make_image "${mipsel_qemu_dir}" mipsel-qemu_mips-elf "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" "pata"
|
||||||
if [ -e "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" ] && [ -d "${rom_directory}" ]; then
|
if [ -e "${iso9660_dir}/boot/grub/roms/mipsel-qemu_mips.elf" ] && [ -d "${rom_directory}" ]; then
|
||||||
|
|
Loading…
Reference in a new issue