Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On 1/17/21 10:52 AM, Philippe Mathieu-Daudé wrote: > On 1/16/21 11:38 PM, Alistair Francis wrote: >> On Sat, Jan 16, 2021 at 2:32 PM Philippe Mathieu-Daudé >> wrote: >>> >>> On 1/16/21 12:00 AM, Alistair Francis wrote: We were accidently passing RISCVHartArrayState by value instead of accidentally pointer. The type is 824 bytes long so let's correct that and pass it by pointer instead. -bool riscv_is_32bit(RISCVHartArrayState harts) +bool riscv_is_32bit(RISCVHartArrayState *harts) Definitely better, { -RISCVCPU hart = harts.harts[0]; +RISCVCPU hart = harts->harts[0]; but yeah, this still results in a copy (unless the compiler optimizes it). >>> >>> This doesn't look improved. Maybe you want: >>> >>>return riscv_cpu_is_32bit(>harts[0].env); Whereas this is obviously a pointer into the original without relying on the compiler to elide a copy. >> >> I suspect this ends up generating the same code. > > If the compiler is smart enough, but I'm not sure it can figure out > only 1 element from the structure is accessed... > My understanding is "first copy the content pointed at '*harts' in > 'hart' on the stack", then only use "env". > > Cc'ing Eric/Richard to double check. I agree that relying on the compiler optimization is not as straightforward as writing the code to directly access the correct pointer from the get-go. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On 1/15/21 1:00 PM, Alistair Francis wrote: > +bool riscv_is_32bit(RISCVHartArrayState *harts) > { > -RISCVCPU hart = harts.harts[0]; > +RISCVCPU hart = harts->harts[0]; This is a large structure copy as well. > return riscv_cpu_is_32bit(); > } Better as >harts[0].env surely. r~
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On 1/16/21 11:38 PM, Alistair Francis wrote: > On Sat, Jan 16, 2021 at 2:32 PM Philippe Mathieu-Daudé > wrote: >> >> On 1/16/21 12:00 AM, Alistair Francis wrote: >>> We were accidently passing RISCVHartArrayState by value instead of >>> pointer. The type is 824 bytes long so let's correct that and pass it by >>> pointer instead. >>> >>> Fixes: Coverity CID 1438099 >>> Fixes: Coverity CID 1438100 >>> Fixes: Coverity CID 1438101 >>> Signed-off-by: Alistair Francis >>> --- >>> include/hw/riscv/boot.h | 6 +++--- >>> hw/riscv/boot.c | 8 >>> hw/riscv/sifive_u.c | 10 +- >>> hw/riscv/spike.c| 8 >>> hw/riscv/virt.c | 8 >>> 5 files changed, 20 insertions(+), 20 deletions(-) ... >>> diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c >>> index 83586aef41..acf77675b2 100644 >>> --- a/hw/riscv/boot.c >>> +++ b/hw/riscv/boot.c >>> @@ -33,14 +33,14 @@ >>> >>> #include >>> >>> -bool riscv_is_32bit(RISCVHartArrayState harts) >>> +bool riscv_is_32bit(RISCVHartArrayState *harts) >>> { >>> -RISCVCPU hart = harts.harts[0]; >>> +RISCVCPU hart = harts->harts[0]; >> >> This doesn't look improved. Maybe you want: >> >>return riscv_cpu_is_32bit(>harts[0].env); > > I suspect this ends up generating the same code. If the compiler is smart enough, but I'm not sure it can figure out only 1 element from the structure is accessed... My understanding is "first copy the content pointed at '*harts' in 'hart' on the stack", then only use "env". Cc'ing Eric/Richard to double check. > > Either way, good point I have just squashed this change into the patch. Thanks, Phil.
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On Sat, Jan 16, 2021 at 2:32 PM Philippe Mathieu-Daudé wrote: > > On 1/16/21 12:00 AM, Alistair Francis wrote: > > We were accidently passing RISCVHartArrayState by value instead of > > pointer. The type is 824 bytes long so let's correct that and pass it by > > pointer instead. > > > > Fixes: Coverity CID 1438099 > > Fixes: Coverity CID 1438100 > > Fixes: Coverity CID 1438101 > > Signed-off-by: Alistair Francis > > --- > > include/hw/riscv/boot.h | 6 +++--- > > hw/riscv/boot.c | 8 > > hw/riscv/sifive_u.c | 10 +- > > hw/riscv/spike.c| 8 > > hw/riscv/virt.c | 8 > > 5 files changed, 20 insertions(+), 20 deletions(-) > > > > diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h > > index 20ff5fe5e5..11a21dd584 100644 > > --- a/include/hw/riscv/boot.h > > +++ b/include/hw/riscv/boot.h > > @@ -24,9 +24,9 @@ > > #include "hw/loader.h" > > #include "hw/riscv/riscv_hart.h" > > > > -bool riscv_is_32bit(RISCVHartArrayState harts); > > +bool riscv_is_32bit(RISCVHartArrayState *harts); > > > > -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, > > +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, > >target_ulong firmware_end_addr); > > target_ulong riscv_find_and_load_firmware(MachineState *machine, > >const char > > *default_machine_firmware, > > @@ -42,7 +42,7 @@ target_ulong riscv_load_kernel(const char > > *kernel_filename, > > hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, > > uint64_t kernel_entry, hwaddr *start); > > uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); > > -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > > harts, > > +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > > *harts, > > hwaddr saddr, > > hwaddr rom_base, hwaddr rom_size, > > uint64_t kernel_entry, > > diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c > > index 83586aef41..acf77675b2 100644 > > --- a/hw/riscv/boot.c > > +++ b/hw/riscv/boot.c > > @@ -33,14 +33,14 @@ > > > > #include > > > > -bool riscv_is_32bit(RISCVHartArrayState harts) > > +bool riscv_is_32bit(RISCVHartArrayState *harts) > > { > > -RISCVCPU hart = harts.harts[0]; > > +RISCVCPU hart = harts->harts[0]; > > This doesn't look improved. Maybe you want: > >return riscv_cpu_is_32bit(>harts[0].env); I suspect this ends up generating the same code. Either way, good point I have just squashed this change into the patch. Alistair > > > > > return riscv_cpu_is_32bit(); > > }
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On 1/16/21 12:00 AM, Alistair Francis wrote: > We were accidently passing RISCVHartArrayState by value instead of > pointer. The type is 824 bytes long so let's correct that and pass it by > pointer instead. > > Fixes: Coverity CID 1438099 > Fixes: Coverity CID 1438100 > Fixes: Coverity CID 1438101 > Signed-off-by: Alistair Francis > --- > include/hw/riscv/boot.h | 6 +++--- > hw/riscv/boot.c | 8 > hw/riscv/sifive_u.c | 10 +- > hw/riscv/spike.c| 8 > hw/riscv/virt.c | 8 > 5 files changed, 20 insertions(+), 20 deletions(-) > > diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h > index 20ff5fe5e5..11a21dd584 100644 > --- a/include/hw/riscv/boot.h > +++ b/include/hw/riscv/boot.h > @@ -24,9 +24,9 @@ > #include "hw/loader.h" > #include "hw/riscv/riscv_hart.h" > > -bool riscv_is_32bit(RISCVHartArrayState harts); > +bool riscv_is_32bit(RISCVHartArrayState *harts); > > -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, > +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, >target_ulong firmware_end_addr); > target_ulong riscv_find_and_load_firmware(MachineState *machine, >const char > *default_machine_firmware, > @@ -42,7 +42,7 @@ target_ulong riscv_load_kernel(const char *kernel_filename, > hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, > uint64_t kernel_entry, hwaddr *start); > uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); > -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > harts, > +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > *harts, > hwaddr saddr, > hwaddr rom_base, hwaddr rom_size, > uint64_t kernel_entry, > diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c > index 83586aef41..acf77675b2 100644 > --- a/hw/riscv/boot.c > +++ b/hw/riscv/boot.c > @@ -33,14 +33,14 @@ > > #include > > -bool riscv_is_32bit(RISCVHartArrayState harts) > +bool riscv_is_32bit(RISCVHartArrayState *harts) > { > -RISCVCPU hart = harts.harts[0]; > +RISCVCPU hart = harts->harts[0]; This doesn't look improved. Maybe you want: return riscv_cpu_is_32bit(>harts[0].env); > > return riscv_cpu_is_32bit(); > }
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On Fri, Jan 15, 2021 at 3:00 PM Alistair Francis wrote: > > We were accidently passing RISCVHartArrayState by value instead of > pointer. The type is 824 bytes long so let's correct that and pass it by > pointer instead. > > Fixes: Coverity CID 1438099 > Fixes: Coverity CID 1438100 > Fixes: Coverity CID 1438101 > Signed-off-by: Alistair Francis Thanks! Applied to riscv-to-apply.next Alistair > --- > include/hw/riscv/boot.h | 6 +++--- > hw/riscv/boot.c | 8 > hw/riscv/sifive_u.c | 10 +- > hw/riscv/spike.c| 8 > hw/riscv/virt.c | 8 > 5 files changed, 20 insertions(+), 20 deletions(-) > > diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h > index 20ff5fe5e5..11a21dd584 100644 > --- a/include/hw/riscv/boot.h > +++ b/include/hw/riscv/boot.h > @@ -24,9 +24,9 @@ > #include "hw/loader.h" > #include "hw/riscv/riscv_hart.h" > > -bool riscv_is_32bit(RISCVHartArrayState harts); > +bool riscv_is_32bit(RISCVHartArrayState *harts); > > -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, > +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, >target_ulong firmware_end_addr); > target_ulong riscv_find_and_load_firmware(MachineState *machine, >const char > *default_machine_firmware, > @@ -42,7 +42,7 @@ target_ulong riscv_load_kernel(const char *kernel_filename, > hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, > uint64_t kernel_entry, hwaddr *start); > uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); > -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > harts, > +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > *harts, > hwaddr saddr, > hwaddr rom_base, hwaddr rom_size, > uint64_t kernel_entry, > diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c > index 83586aef41..acf77675b2 100644 > --- a/hw/riscv/boot.c > +++ b/hw/riscv/boot.c > @@ -33,14 +33,14 @@ > > #include > > -bool riscv_is_32bit(RISCVHartArrayState harts) > +bool riscv_is_32bit(RISCVHartArrayState *harts) > { > -RISCVCPU hart = harts.harts[0]; > +RISCVCPU hart = harts->harts[0]; > > return riscv_cpu_is_32bit(); > } > > -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, > +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, >target_ulong firmware_end_addr) { > if (riscv_is_32bit(harts)) { > return QEMU_ALIGN_UP(firmware_end_addr, 4 * MiB); > @@ -247,7 +247,7 @@ void riscv_rom_copy_firmware_info(MachineState *machine, > hwaddr rom_base, > _space_memory); > } > > -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > harts, > +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState > *harts, > hwaddr start_addr, > hwaddr rom_base, hwaddr rom_size, > uint64_t kernel_entry, > diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c > index f5c400dd44..d23f349b4e 100644 > --- a/hw/riscv/sifive_u.c > +++ b/hw/riscv/sifive_u.c > @@ -466,7 +466,7 @@ static void sifive_u_machine_init(MachineState *machine) > > /* create device tree */ > create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, > - riscv_is_32bit(s->soc.u_cpus)); > + riscv_is_32bit(>soc.u_cpus)); > > if (s->start_in_flash) { > /* > @@ -495,7 +495,7 @@ static void sifive_u_machine_init(MachineState *machine) > break; > } > > -if (riscv_is_32bit(s->soc.u_cpus)) { > +if (riscv_is_32bit(>soc.u_cpus)) { > firmware_end_addr = riscv_find_and_load_firmware(machine, > "opensbi-riscv32-generic-fw_dynamic.bin", > start_addr, NULL); > @@ -506,7 +506,7 @@ static void sifive_u_machine_init(MachineState *machine) > } > > if (machine->kernel_filename) { > -kernel_start_addr = riscv_calc_kernel_start_addr(s->soc.u_cpus, > +kernel_start_addr = riscv_calc_kernel_start_addr(>soc.u_cpus, > firmware_end_addr); > > kernel_entry = riscv_load_kernel(machine->kernel_filename, > @@ -533,7 +533,7 @@ static void sifive_u_machine_init(MachineState *machine) > /* Compute the fdt load address in dram */ > fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DEV_DRAM].base, > machine->ram_size, s->fdt); > -if (!riscv_is_32bit(s->soc.u_cpus)) { > +if (!riscv_is_32bit(>soc.u_cpus)) { > start_addr_hi32 = (uint64_t)start_addr >> 32; >
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On Sat, Jan 16, 2021 at 8:30 AM Bin Meng wrote: > > On Sat, Jan 16, 2021 at 7:00 AM Alistair Francis > wrote: > > > > We were accidently passing RISCVHartArrayState by value instead of > > pointer. The type is 824 bytes long so let's correct that and pass it by > > pointer instead. > > > > Fixes: Coverity CID 1438099 > > Fixes: Coverity CID 1438100 > > Fixes: Coverity CID 1438101 > > Where can I look at the Coverity report for QEMU? I don't think you can. I think there are only a few people who can see them and they just report them to everyone else. > > > Signed-off-by: Alistair Francis > > --- > > include/hw/riscv/boot.h | 6 +++--- > > hw/riscv/boot.c | 8 > > hw/riscv/sifive_u.c | 10 +- > > hw/riscv/spike.c| 8 > > hw/riscv/virt.c | 8 > > 5 files changed, 20 insertions(+), 20 deletions(-) > > > > Reviewed-by: Bin Meng Thanks! Alistair
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On Sat, Jan 16, 2021 at 7:00 AM Alistair Francis wrote: > > We were accidently passing RISCVHartArrayState by value instead of > pointer. The type is 824 bytes long so let's correct that and pass it by > pointer instead. > > Fixes: Coverity CID 1438099 > Fixes: Coverity CID 1438100 > Fixes: Coverity CID 1438101 Where can I look at the Coverity report for QEMU? > Signed-off-by: Alistair Francis > --- > include/hw/riscv/boot.h | 6 +++--- > hw/riscv/boot.c | 8 > hw/riscv/sifive_u.c | 10 +- > hw/riscv/spike.c| 8 > hw/riscv/virt.c | 8 > 5 files changed, 20 insertions(+), 20 deletions(-) > Reviewed-by: Bin Meng
Re: [PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
On Fri, 15 Jan 2021 15:00:27 PST (-0800), Alistair Francis wrote: We were accidently passing RISCVHartArrayState by value instead of pointer. The type is 824 bytes long so let's correct that and pass it by pointer instead. Fixes: Coverity CID 1438099 Fixes: Coverity CID 1438100 Fixes: Coverity CID 1438101 Signed-off-by: Alistair Francis --- include/hw/riscv/boot.h | 6 +++--- hw/riscv/boot.c | 8 hw/riscv/sifive_u.c | 10 +- hw/riscv/spike.c| 8 hw/riscv/virt.c | 8 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index 20ff5fe5e5..11a21dd584 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -24,9 +24,9 @@ #include "hw/loader.h" #include "hw/riscv/riscv_hart.h" -bool riscv_is_32bit(RISCVHartArrayState harts); +bool riscv_is_32bit(RISCVHartArrayState *harts); -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, target_ulong firmware_end_addr); target_ulong riscv_find_and_load_firmware(MachineState *machine, const char *default_machine_firmware, @@ -42,7 +42,7 @@ target_ulong riscv_load_kernel(const char *kernel_filename, hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, uint64_t kernel_entry, hwaddr *start); uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState harts, +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts, hwaddr saddr, hwaddr rom_base, hwaddr rom_size, uint64_t kernel_entry, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 83586aef41..acf77675b2 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -33,14 +33,14 @@ #include -bool riscv_is_32bit(RISCVHartArrayState harts) +bool riscv_is_32bit(RISCVHartArrayState *harts) { -RISCVCPU hart = harts.harts[0]; +RISCVCPU hart = harts->harts[0]; return riscv_cpu_is_32bit(); } -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, target_ulong firmware_end_addr) { if (riscv_is_32bit(harts)) { return QEMU_ALIGN_UP(firmware_end_addr, 4 * MiB); @@ -247,7 +247,7 @@ void riscv_rom_copy_firmware_info(MachineState *machine, hwaddr rom_base, _space_memory); } -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState harts, +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts, hwaddr start_addr, hwaddr rom_base, hwaddr rom_size, uint64_t kernel_entry, diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index f5c400dd44..d23f349b4e 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -466,7 +466,7 @@ static void sifive_u_machine_init(MachineState *machine) /* create device tree */ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, - riscv_is_32bit(s->soc.u_cpus)); + riscv_is_32bit(>soc.u_cpus)); if (s->start_in_flash) { /* @@ -495,7 +495,7 @@ static void sifive_u_machine_init(MachineState *machine) break; } -if (riscv_is_32bit(s->soc.u_cpus)) { +if (riscv_is_32bit(>soc.u_cpus)) { firmware_end_addr = riscv_find_and_load_firmware(machine, "opensbi-riscv32-generic-fw_dynamic.bin", start_addr, NULL); @@ -506,7 +506,7 @@ static void sifive_u_machine_init(MachineState *machine) } if (machine->kernel_filename) { -kernel_start_addr = riscv_calc_kernel_start_addr(s->soc.u_cpus, +kernel_start_addr = riscv_calc_kernel_start_addr(>soc.u_cpus, firmware_end_addr); kernel_entry = riscv_load_kernel(machine->kernel_filename, @@ -533,7 +533,7 @@ static void sifive_u_machine_init(MachineState *machine) /* Compute the fdt load address in dram */ fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DEV_DRAM].base, machine->ram_size, s->fdt); -if (!riscv_is_32bit(s->soc.u_cpus)) { +if (!riscv_is_32bit(>soc.u_cpus)) { start_addr_hi32 = (uint64_t)start_addr >> 32; } @@ -552,7 +552,7 @@ static void sifive_u_machine_init(MachineState *machine) 0x, /* fw_dyn: */ }; -if (riscv_is_32bit(s->soc.u_cpus)) { +if (riscv_is_32bit(>soc.u_cpus)) {
[PATCH v1 1/1] riscv: Pass RISCVHartArrayState by pointer
We were accidently passing RISCVHartArrayState by value instead of pointer. The type is 824 bytes long so let's correct that and pass it by pointer instead. Fixes: Coverity CID 1438099 Fixes: Coverity CID 1438100 Fixes: Coverity CID 1438101 Signed-off-by: Alistair Francis --- include/hw/riscv/boot.h | 6 +++--- hw/riscv/boot.c | 8 hw/riscv/sifive_u.c | 10 +- hw/riscv/spike.c| 8 hw/riscv/virt.c | 8 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index 20ff5fe5e5..11a21dd584 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -24,9 +24,9 @@ #include "hw/loader.h" #include "hw/riscv/riscv_hart.h" -bool riscv_is_32bit(RISCVHartArrayState harts); +bool riscv_is_32bit(RISCVHartArrayState *harts); -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, target_ulong firmware_end_addr); target_ulong riscv_find_and_load_firmware(MachineState *machine, const char *default_machine_firmware, @@ -42,7 +42,7 @@ target_ulong riscv_load_kernel(const char *kernel_filename, hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, uint64_t kernel_entry, hwaddr *start); uint32_t riscv_load_fdt(hwaddr dram_start, uint64_t dram_size, void *fdt); -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState harts, +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts, hwaddr saddr, hwaddr rom_base, hwaddr rom_size, uint64_t kernel_entry, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 83586aef41..acf77675b2 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -33,14 +33,14 @@ #include -bool riscv_is_32bit(RISCVHartArrayState harts) +bool riscv_is_32bit(RISCVHartArrayState *harts) { -RISCVCPU hart = harts.harts[0]; +RISCVCPU hart = harts->harts[0]; return riscv_cpu_is_32bit(); } -target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState harts, +target_ulong riscv_calc_kernel_start_addr(RISCVHartArrayState *harts, target_ulong firmware_end_addr) { if (riscv_is_32bit(harts)) { return QEMU_ALIGN_UP(firmware_end_addr, 4 * MiB); @@ -247,7 +247,7 @@ void riscv_rom_copy_firmware_info(MachineState *machine, hwaddr rom_base, _space_memory); } -void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState harts, +void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts, hwaddr start_addr, hwaddr rom_base, hwaddr rom_size, uint64_t kernel_entry, diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index f5c400dd44..d23f349b4e 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -466,7 +466,7 @@ static void sifive_u_machine_init(MachineState *machine) /* create device tree */ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, - riscv_is_32bit(s->soc.u_cpus)); + riscv_is_32bit(>soc.u_cpus)); if (s->start_in_flash) { /* @@ -495,7 +495,7 @@ static void sifive_u_machine_init(MachineState *machine) break; } -if (riscv_is_32bit(s->soc.u_cpus)) { +if (riscv_is_32bit(>soc.u_cpus)) { firmware_end_addr = riscv_find_and_load_firmware(machine, "opensbi-riscv32-generic-fw_dynamic.bin", start_addr, NULL); @@ -506,7 +506,7 @@ static void sifive_u_machine_init(MachineState *machine) } if (machine->kernel_filename) { -kernel_start_addr = riscv_calc_kernel_start_addr(s->soc.u_cpus, +kernel_start_addr = riscv_calc_kernel_start_addr(>soc.u_cpus, firmware_end_addr); kernel_entry = riscv_load_kernel(machine->kernel_filename, @@ -533,7 +533,7 @@ static void sifive_u_machine_init(MachineState *machine) /* Compute the fdt load address in dram */ fdt_load_addr = riscv_load_fdt(memmap[SIFIVE_U_DEV_DRAM].base, machine->ram_size, s->fdt); -if (!riscv_is_32bit(s->soc.u_cpus)) { +if (!riscv_is_32bit(>soc.u_cpus)) { start_addr_hi32 = (uint64_t)start_addr >> 32; } @@ -552,7 +552,7 @@ static void sifive_u_machine_init(MachineState *machine) 0x, /* fw_dyn: */ }; -if (riscv_is_32bit(s->soc.u_cpus)) { +if (riscv_is_32bit(>soc.u_cpus)) { reset_vec[4] = 0x0202a583; /* lw a1, 32(t0) */