Message ID | 20240307164835.300412-5-gaosong@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add boot LoongArch elf kernel with FDT | expand |
On 2024/3/8 上午12:48, Song Gao wrote: > Add init_cmline and set boot_info->a0, a1 > > Signed-off-by: Song Gao <gaosong@loongson.cn> > Message-Id: <20240301093839.663947-5-gaosong@loongson.cn> > --- > hw/loongarch/boot.c | 19 +++++++++++++++++++ > include/hw/loongarch/virt.h | 2 ++ > target/loongarch/cpu.h | 2 ++ > 3 files changed, 23 insertions(+) > > diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c > index e560ac178a..ca65dfde07 100644 > --- a/hw/loongarch/boot.c > +++ b/hw/loongarch/boot.c > @@ -63,6 +63,16 @@ static const unsigned int slave_boot_code[] = { > 0x4c000020, /* jirl $r0,$r1,0 */ > }; > > +static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start) > +{ > + hwaddr cmdline_addr = (hwaddr)p - (hwaddr)start; > + > + info->a0 = 1; > + info->a1 = cmdline_addr; > + > + memcpy(p, info->kernel_cmdline, COMMAND_LINE_SIZE); > +} > + > static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr) > { > return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS); > @@ -122,6 +132,10 @@ static void reset_load_elf(void *opaque) > > cpu_reset(CPU(cpu)); > if (env->load_elf) { > + if (cpu == LOONGARCH_CPU(first_cpu)) { > + env->gpr[4] = env->boot_info->a0; > + env->gpr[5] = env->boot_info->a1; > + } > cpu_set_pc(CPU(cpu), env->elf_address); > } > } > @@ -161,8 +175,13 @@ static void loongarch_firmware_boot(LoongArchMachineState *lams, > > static void init_boot_rom(struct loongarch_boot_info *info, void *p) > { > + void *start = p; > + > memcpy(p, &slave_boot_code, sizeof(slave_boot_code)); > p += sizeof(slave_boot_code); > + > + init_cmdline(info, p, start); > + p += COMMAND_LINE_SIZE; > } > > static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info) > diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h > index cf2f2bfb19..d7a074d69f 100644 > --- a/include/hw/loongarch/virt.h > +++ b/include/hw/loongarch/virt.h > @@ -33,6 +33,8 @@ > #define VIRT_GED_MEM_ADDR (VIRT_GED_EVT_ADDR + ACPI_GED_EVT_SEL_LEN) > #define VIRT_GED_REG_ADDR (VIRT_GED_MEM_ADDR + MEMORY_HOTPLUG_IO_LEN) > > +#define COMMAND_LINE_SIZE 512 > + > struct LoongArchMachineState { > /*< private >*/ > MachineState parent_obj; > diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h > index ec37579fd6..ce02ef3979 100644 > --- a/target/loongarch/cpu.h > +++ b/target/loongarch/cpu.h > @@ -361,6 +361,8 @@ typedef struct CPUArchState { > uint32_t mp_state; > /* Store ipistate to access from this struct */ > DeviceState *ipistate; > + > + struct loongarch_boot_info *boot_info; > #endif > } CPULoongArchState; > > Reviewed-by: Bibo Mao <maobibo@loongson.cn>
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c index e560ac178a..ca65dfde07 100644 --- a/hw/loongarch/boot.c +++ b/hw/loongarch/boot.c @@ -63,6 +63,16 @@ static const unsigned int slave_boot_code[] = { 0x4c000020, /* jirl $r0,$r1,0 */ }; +static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start) +{ + hwaddr cmdline_addr = (hwaddr)p - (hwaddr)start; + + info->a0 = 1; + info->a1 = cmdline_addr; + + memcpy(p, info->kernel_cmdline, COMMAND_LINE_SIZE); +} + static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr) { return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS); @@ -122,6 +132,10 @@ static void reset_load_elf(void *opaque) cpu_reset(CPU(cpu)); if (env->load_elf) { + if (cpu == LOONGARCH_CPU(first_cpu)) { + env->gpr[4] = env->boot_info->a0; + env->gpr[5] = env->boot_info->a1; + } cpu_set_pc(CPU(cpu), env->elf_address); } } @@ -161,8 +175,13 @@ static void loongarch_firmware_boot(LoongArchMachineState *lams, static void init_boot_rom(struct loongarch_boot_info *info, void *p) { + void *start = p; + memcpy(p, &slave_boot_code, sizeof(slave_boot_code)); p += sizeof(slave_boot_code); + + init_cmdline(info, p, start); + p += COMMAND_LINE_SIZE; } static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info) diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h index cf2f2bfb19..d7a074d69f 100644 --- a/include/hw/loongarch/virt.h +++ b/include/hw/loongarch/virt.h @@ -33,6 +33,8 @@ #define VIRT_GED_MEM_ADDR (VIRT_GED_EVT_ADDR + ACPI_GED_EVT_SEL_LEN) #define VIRT_GED_REG_ADDR (VIRT_GED_MEM_ADDR + MEMORY_HOTPLUG_IO_LEN) +#define COMMAND_LINE_SIZE 512 + struct LoongArchMachineState { /*< private >*/ MachineState parent_obj; diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h index ec37579fd6..ce02ef3979 100644 --- a/target/loongarch/cpu.h +++ b/target/loongarch/cpu.h @@ -361,6 +361,8 @@ typedef struct CPUArchState { uint32_t mp_state; /* Store ipistate to access from this struct */ DeviceState *ipistate; + + struct loongarch_boot_info *boot_info; #endif } CPULoongArchState;
Add init_cmline and set boot_info->a0, a1 Signed-off-by: Song Gao <gaosong@loongson.cn> Message-Id: <20240301093839.663947-5-gaosong@loongson.cn> --- hw/loongarch/boot.c | 19 +++++++++++++++++++ include/hw/loongarch/virt.h | 2 ++ target/loongarch/cpu.h | 2 ++ 3 files changed, 23 insertions(+)