Message ID | 20240307164835.300412-6-gaosong@loongson.cn |
---|---|
State | New |
Headers | show |
Series | Add boot LoongArch elf kernel with FDT | expand |
On 2024/3/8 上午12:48, Song Gao wrote: > Add init_systab and set boot_info->a2 > > Signed-off-by: Song Gao <gaosong@loongson.cn> > Message-Id: <20240301093839.663947-6-gaosong@loongson.cn> > --- > hw/loongarch/boot.c | 22 +++++++++++++++++ > include/hw/loongarch/boot.h | 48 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 70 insertions(+) > > diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c > index ca65dfde07..1e31e2a59f 100644 > --- a/hw/loongarch/boot.c > +++ b/hw/loongarch/boot.c > @@ -63,6 +63,25 @@ static const unsigned int slave_boot_code[] = { > 0x4c000020, /* jirl $r0,$r1,0 */ > }; > > +static void init_systab(struct loongarch_boot_info *info, void *p, void *start) > +{ > + struct efi_system_table *systab = p; > + > + info->a2 = (uint64_t)p - (uint64_t)start; > + > + systab->hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE; > + systab->hdr.revision = EFI_SPECIFICATION_VERSION; > + systab->hdr.revision = sizeof(struct efi_system_table), > + systab->fw_revision = FW_VERSION << 16 | FW_PATCHLEVEL << 8; > + systab->runtime = 0; > + systab->boottime = 0; > + systab->nr_tables = 0; > + > + p += ROUND_UP(sizeof(struct efi_system_table), 64); > + > + systab->tables = p; > +} > + > static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start) > { > hwaddr cmdline_addr = (hwaddr)p - (hwaddr)start; > @@ -135,6 +154,7 @@ static void reset_load_elf(void *opaque) > if (cpu == LOONGARCH_CPU(first_cpu)) { > env->gpr[4] = env->boot_info->a0; > env->gpr[5] = env->boot_info->a1; > + env->gpr[6] = env->boot_info->a2; > } > cpu_set_pc(CPU(cpu), env->elf_address); > } > @@ -182,6 +202,8 @@ static void init_boot_rom(struct loongarch_boot_info *info, void *p) > > init_cmdline(info, p, start); > p += COMMAND_LINE_SIZE; > + > + init_systab(info, p, start); > } > > static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info) > diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h > index 3275c1e295..65ad406f02 100644 > --- a/include/hw/loongarch/boot.h > +++ b/include/hw/loongarch/boot.h > @@ -8,6 +8,54 @@ > #ifndef HW_LOONGARCH_BOOT_H > #define HW_LOONGARCH_BOOT_H > > +/* UEFI 2.10 */ > +#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 > +#define EFI_2_100_SYSTEM_TABLE_REVISION ((2<<16) | (100)) > +#define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION > +#define EFI_SYSTEM_TABLE_REVISION EFI_2_100_SYSTEM_TABLE_REVISION > + > +#define FW_VERSION 0x1 > +#define FW_PATCHLEVEL 0x0 > + > +typedef struct { > + uint8_t b[16]; > +} efi_guid_t __attribute__((aligned(8))); > + > +struct efi_config_table { > + efi_guid_t guid; > + uint64_t *ptr; > + const char name[16]; > +}; > + > +typedef struct { > + uint64_t signature; > + uint32_t revision; > + uint32_t headersize; > + uint32_t crc32; > + uint32_t reserved; > +} efi_table_hdr_t; > + > +struct efi_configuration_table { > + efi_guid_t guid; > + void *table; > +}; > + > +struct efi_system_table { > + efi_table_hdr_t hdr; > + uint64_t fw_vendor; /* physical addr of CHAR16 vendor string */ > + uint32_t fw_revision; > + uint64_t con_in_handle; > + uint64_t *con_in; > + uint64_t con_out_handle; > + uint64_t *con_out; > + uint64_t stderr_handle; > + uint64_t stderr_placeholder; > + uint64_t *runtime; > + uint64_t *boottime; > + uint64_t nr_tables; > + struct efi_configuration_table *tables; > +}; > + > struct loongarch_boot_info { > uint64_t ram_size; > const char *kernel_filename; > Reviewed-by: Bibo Mao <maobibo@loongson.cn>
On 7/3/24 17:48, Song Gao wrote: > Add init_systab and set boot_info->a2 > > Signed-off-by: Song Gao <gaosong@loongson.cn> > Message-Id: <20240301093839.663947-6-gaosong@loongson.cn> > --- > hw/loongarch/boot.c | 22 +++++++++++++++++ > include/hw/loongarch/boot.h | 48 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 70 insertions(+) > diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h > index 3275c1e295..65ad406f02 100644 > --- a/include/hw/loongarch/boot.h > +++ b/include/hw/loongarch/boot.h > @@ -8,6 +8,54 @@ > #ifndef HW_LOONGARCH_BOOT_H > #define HW_LOONGARCH_BOOT_H > > +/* UEFI 2.10 */ > +#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 > +#define EFI_2_100_SYSTEM_TABLE_REVISION ((2<<16) | (100)) > +#define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION > +#define EFI_SYSTEM_TABLE_REVISION EFI_2_100_SYSTEM_TABLE_REVISION > + > +#define FW_VERSION 0x1 > +#define FW_PATCHLEVEL 0x0 > + > +typedef struct { > + uint8_t b[16]; > +} efi_guid_t __attribute__((aligned(8))); QEMU_ALIGNED(8)
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c index ca65dfde07..1e31e2a59f 100644 --- a/hw/loongarch/boot.c +++ b/hw/loongarch/boot.c @@ -63,6 +63,25 @@ static const unsigned int slave_boot_code[] = { 0x4c000020, /* jirl $r0,$r1,0 */ }; +static void init_systab(struct loongarch_boot_info *info, void *p, void *start) +{ + struct efi_system_table *systab = p; + + info->a2 = (uint64_t)p - (uint64_t)start; + + systab->hdr.signature = EFI_SYSTEM_TABLE_SIGNATURE; + systab->hdr.revision = EFI_SPECIFICATION_VERSION; + systab->hdr.revision = sizeof(struct efi_system_table), + systab->fw_revision = FW_VERSION << 16 | FW_PATCHLEVEL << 8; + systab->runtime = 0; + systab->boottime = 0; + systab->nr_tables = 0; + + p += ROUND_UP(sizeof(struct efi_system_table), 64); + + systab->tables = p; +} + static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start) { hwaddr cmdline_addr = (hwaddr)p - (hwaddr)start; @@ -135,6 +154,7 @@ static void reset_load_elf(void *opaque) if (cpu == LOONGARCH_CPU(first_cpu)) { env->gpr[4] = env->boot_info->a0; env->gpr[5] = env->boot_info->a1; + env->gpr[6] = env->boot_info->a2; } cpu_set_pc(CPU(cpu), env->elf_address); } @@ -182,6 +202,8 @@ static void init_boot_rom(struct loongarch_boot_info *info, void *p) init_cmdline(info, p, start); p += COMMAND_LINE_SIZE; + + init_systab(info, p, start); } static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info) diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h index 3275c1e295..65ad406f02 100644 --- a/include/hw/loongarch/boot.h +++ b/include/hw/loongarch/boot.h @@ -8,6 +8,54 @@ #ifndef HW_LOONGARCH_BOOT_H #define HW_LOONGARCH_BOOT_H +/* UEFI 2.10 */ +#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 +#define EFI_2_100_SYSTEM_TABLE_REVISION ((2<<16) | (100)) +#define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION +#define EFI_SYSTEM_TABLE_REVISION EFI_2_100_SYSTEM_TABLE_REVISION + +#define FW_VERSION 0x1 +#define FW_PATCHLEVEL 0x0 + +typedef struct { + uint8_t b[16]; +} efi_guid_t __attribute__((aligned(8))); + +struct efi_config_table { + efi_guid_t guid; + uint64_t *ptr; + const char name[16]; +}; + +typedef struct { + uint64_t signature; + uint32_t revision; + uint32_t headersize; + uint32_t crc32; + uint32_t reserved; +} efi_table_hdr_t; + +struct efi_configuration_table { + efi_guid_t guid; + void *table; +}; + +struct efi_system_table { + efi_table_hdr_t hdr; + uint64_t fw_vendor; /* physical addr of CHAR16 vendor string */ + uint32_t fw_revision; + uint64_t con_in_handle; + uint64_t *con_in; + uint64_t con_out_handle; + uint64_t *con_out; + uint64_t stderr_handle; + uint64_t stderr_placeholder; + uint64_t *runtime; + uint64_t *boottime; + uint64_t nr_tables; + struct efi_configuration_table *tables; +}; + struct loongarch_boot_info { uint64_t ram_size; const char *kernel_filename;
Add init_systab and set boot_info->a2 Signed-off-by: Song Gao <gaosong@loongson.cn> Message-Id: <20240301093839.663947-6-gaosong@loongson.cn> --- hw/loongarch/boot.c | 22 +++++++++++++++++ include/hw/loongarch/boot.h | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+)