Skip to content

Commit 5e9d14f

Browse files
committed
Merge remote-tracking branch 'remotes/alistair/tags/pull-riscv-to-apply-20220121-1' into staging
Third RISC-V PR for QEMU 7.0 * Fixes for OpenTitan timer * Correction of OpenTitan PLIC stride length * RISC-V KVM support * Device tree code cleanup * Support for the Zve64f and Zve32f extensions * OpenSBI binary loading support for the Spike machine * Removal of OpenSBI ELFs * Support for the UXL field in xstatus # gpg: Signature made Fri 21 Jan 2022 05:57:09 GMT # gpg: using RSA key F6C4AC46D4934868D3B8CE8F21E10D29DF977054 # gpg: Good signature from "Alistair Francis <[email protected]>" [full] # Primary key fingerprint: F6C4 AC46 D493 4868 D3B8 CE8F 21E1 0D29 DF97 7054 * remotes/alistair/tags/pull-riscv-to-apply-20220121-1: (61 commits) target/riscv: Relax UXL field for debugging target/riscv: Enable uxl field write target/riscv: Set default XLEN for hypervisor target/riscv: Adjust scalar reg in vector with XLEN target/riscv: Adjust vector address with mask target/riscv: Fix check range for first fault only target/riscv: Remove VILL field in VTYPE target/riscv: Adjust vsetvl according to XLEN target/riscv: Split out the vill from vtype target/riscv: Split pm_enabled into mask and base target/riscv: Calculate address according to XLEN target/riscv: Alloc tcg global for cur_pm[mask|base] target/riscv: Create current pm fields in env target/riscv: Adjust csr write mask with XLEN target/riscv: Relax debug check for pm write target/riscv: Use gdb xml according to max mxlen target/riscv: Extend pc for runtime pc write target/riscv: Ignore the pc bits above XLEN target/riscv: Create xl field in env target/riscv: Sign extend pc for different XLEN ... Signed-off-by: Peter Maydell <[email protected]>
2 parents 2c89b5a + f297245 commit 5e9d14f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1608
-356
lines changed

.gitlab-ci.d/opensbi.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ build-opensbi:
4343
artifacts:
4444
paths: # 'artifacts.zip' will contains the following files:
4545
- pc-bios/opensbi-riscv32-generic-fw_dynamic.bin
46-
- pc-bios/opensbi-riscv32-generic-fw_dynamic.elf
4746
- pc-bios/opensbi-riscv64-generic-fw_dynamic.bin
48-
- pc-bios/opensbi-riscv64-generic-fw_dynamic.elf
4947
- opensbi32-generic-stdout.log
5048
- opensbi32-generic-stderr.log
5149
- opensbi64-generic-stdout.log

hw/char/riscv_htif.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,25 @@ static const MemoryRegionOps htif_mm_ops = {
228228
.write = htif_mm_write,
229229
};
230230

231+
bool htif_uses_elf_symbols(void)
232+
{
233+
return (address_symbol_set == 3) ? true : false;
234+
}
235+
231236
HTIFState *htif_mm_init(MemoryRegion *address_space, MemoryRegion *main_mem,
232-
CPURISCVState *env, Chardev *chr)
237+
CPURISCVState *env, Chardev *chr, uint64_t nonelf_base)
233238
{
234-
uint64_t base = MIN(tohost_addr, fromhost_addr);
235-
uint64_t size = MAX(tohost_addr + 8, fromhost_addr + 8) - base;
236-
uint64_t tohost_offset = tohost_addr - base;
237-
uint64_t fromhost_offset = fromhost_addr - base;
239+
uint64_t base, size, tohost_offset, fromhost_offset;
240+
241+
if (!htif_uses_elf_symbols()) {
242+
fromhost_addr = nonelf_base;
243+
tohost_addr = nonelf_base + 8;
244+
}
245+
246+
base = MIN(tohost_addr, fromhost_addr);
247+
size = MAX(tohost_addr + 8, fromhost_addr + 8) - base;
248+
tohost_offset = tohost_addr - base;
249+
fromhost_offset = fromhost_addr - base;
238250

239251
HTIFState *s = g_malloc0(sizeof(HTIFState));
240252
s->address_space = address_space;
@@ -249,12 +261,11 @@ HTIFState *htif_mm_init(MemoryRegion *address_space, MemoryRegion *main_mem,
249261
qemu_chr_fe_init(&s->chr, chr, &error_abort);
250262
qemu_chr_fe_set_handlers(&s->chr, htif_can_recv, htif_recv, htif_event,
251263
htif_be_change, s, NULL, true);
252-
if (address_symbol_set == 3) {
253-
memory_region_init_io(&s->mmio, NULL, &htif_mm_ops, s,
254-
TYPE_HTIF_UART, size);
255-
memory_region_add_subregion_overlap(address_space, base,
256-
&s->mmio, 1);
257-
}
264+
265+
memory_region_init_io(&s->mmio, NULL, &htif_mm_ops, s,
266+
TYPE_HTIF_UART, size);
267+
memory_region_add_subregion_overlap(address_space, base,
268+
&s->mmio, 1);
258269

259270
return s;
260271
}

hw/intc/sifive_plic.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "target/riscv/cpu.h"
3131
#include "migration/vmstate.h"
3232
#include "hw/irq.h"
33+
#include "sysemu/kvm.h"
3334

3435
static bool addr_between(uint32_t addr, uint32_t base, uint32_t num)
3536
{
@@ -430,7 +431,8 @@ DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
430431
uint32_t context_stride, uint32_t aperture_size)
431432
{
432433
DeviceState *dev = qdev_new(TYPE_SIFIVE_PLIC);
433-
int i;
434+
int i, j = 0;
435+
SiFivePLICState *plic;
434436

435437
assert(enable_stride == (enable_stride & -enable_stride));
436438
assert(context_stride == (context_stride & -context_stride));
@@ -448,13 +450,21 @@ DeviceState *sifive_plic_create(hwaddr addr, char *hart_config,
448450
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
449451
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
450452

453+
plic = SIFIVE_PLIC(dev);
451454
for (i = 0; i < num_harts; i++) {
452455
CPUState *cpu = qemu_get_cpu(hartid_base + i);
453456

454-
qdev_connect_gpio_out(dev, i,
455-
qdev_get_gpio_in(DEVICE(cpu), IRQ_S_EXT));
456-
qdev_connect_gpio_out(dev, num_harts + i,
457-
qdev_get_gpio_in(DEVICE(cpu), IRQ_M_EXT));
457+
if (plic->addr_config[j].mode == PLICMode_M) {
458+
j++;
459+
qdev_connect_gpio_out(dev, num_harts + i,
460+
qdev_get_gpio_in(DEVICE(cpu), IRQ_M_EXT));
461+
}
462+
463+
if (plic->addr_config[j].mode == PLICMode_S) {
464+
j++;
465+
qdev_connect_gpio_out(dev, i,
466+
qdev_get_gpio_in(DEVICE(cpu), IRQ_S_EXT));
467+
}
458468
}
459469

460470
return dev;

hw/riscv/boot.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "elf.h"
3131
#include "sysemu/device_tree.h"
3232
#include "sysemu/qtest.h"
33+
#include "sysemu/kvm.h"
3334

3435
#include <libfdt.h>
3536

@@ -51,7 +52,9 @@ char *riscv_plic_hart_config_string(int hart_count)
5152
CPUState *cs = qemu_get_cpu(i);
5253
CPURISCVState *env = &RISCV_CPU(cs)->env;
5354

54-
if (riscv_has_ext(env, RVS)) {
55+
if (kvm_enabled()) {
56+
vals[i] = "S";
57+
} else if (riscv_has_ext(env, RVS)) {
5558
vals[i] = "MS";
5659
} else {
5760
vals[i] = "M";
@@ -324,3 +327,14 @@ void riscv_setup_rom_reset_vec(MachineState *machine, RISCVHartArrayState *harts
324327

325328
return;
326329
}
330+
331+
void riscv_setup_direct_kernel(hwaddr kernel_addr, hwaddr fdt_addr)
332+
{
333+
CPUState *cs;
334+
335+
for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
336+
RISCVCPU *riscv_cpu = RISCV_CPU(cs);
337+
riscv_cpu->env.kernel_addr = kernel_addr;
338+
riscv_cpu->env.fdt_addr = fdt_addr;
339+
}
340+
}

hw/riscv/opentitan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
160160
qdev_prop_set_uint32(DEVICE(&s->plic), "priority-base", 0x00);
161161
qdev_prop_set_uint32(DEVICE(&s->plic), "pending-base", 0x1000);
162162
qdev_prop_set_uint32(DEVICE(&s->plic), "enable-base", 0x2000);
163-
qdev_prop_set_uint32(DEVICE(&s->plic), "enable-stride", 0x18);
163+
qdev_prop_set_uint32(DEVICE(&s->plic), "enable-stride", 32);
164164
qdev_prop_set_uint32(DEVICE(&s->plic), "context-base", 0x200000);
165165
qdev_prop_set_uint32(DEVICE(&s->plic), "context-stride", 8);
166166
qdev_prop_set_uint32(DEVICE(&s->plic), "aperture-size", memmap[IBEX_DEV_PLIC].size);

hw/riscv/spike.c

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
static const MemMapEntry spike_memmap[] = {
4444
[SPIKE_MROM] = { 0x1000, 0xf000 },
45+
[SPIKE_HTIF] = { 0x1000000, 0x1000 },
4546
[SPIKE_CLINT] = { 0x2000000, 0x10000 },
4647
[SPIKE_DRAM] = { 0x80000000, 0x0 },
4748
};
@@ -75,6 +76,10 @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
7576

7677
qemu_fdt_add_subnode(fdt, "/htif");
7778
qemu_fdt_setprop_string(fdt, "/htif", "compatible", "ucb,htif0");
79+
if (!htif_uses_elf_symbols()) {
80+
qemu_fdt_setprop_cells(fdt, "/htif", "reg",
81+
0x0, memmap[SPIKE_HTIF].base, 0x0, memmap[SPIKE_HTIF].size);
82+
}
7883

7984
qemu_fdt_add_subnode(fdt, "/soc");
8085
qemu_fdt_setprop(fdt, "/soc", "ranges", NULL, 0);
@@ -172,6 +177,7 @@ static void create_fdt(SpikeState *s, const MemMapEntry *memmap,
172177
if (cmdline) {
173178
qemu_fdt_add_subnode(fdt, "/chosen");
174179
qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", cmdline);
180+
qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", "/htif");
175181
}
176182
}
177183

@@ -241,10 +247,6 @@ static void spike_board_init(MachineState *machine)
241247
memory_region_add_subregion(system_memory, memmap[SPIKE_DRAM].base,
242248
machine->ram);
243249

244-
/* create device tree */
245-
create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
246-
riscv_is_32bit(&s->soc[0]));
247-
248250
/* boot rom */
249251
memory_region_init_rom(mask_rom, NULL, "riscv.spike.mrom",
250252
memmap[SPIKE_MROM].size, &error_fatal);
@@ -258,32 +260,22 @@ static void spike_board_init(MachineState *machine)
258260
*/
259261
if (riscv_is_32bit(&s->soc[0])) {
260262
firmware_end_addr = riscv_find_and_load_firmware(machine,
261-
RISCV32_BIOS_ELF, memmap[SPIKE_DRAM].base,
263+
RISCV32_BIOS_BIN, memmap[SPIKE_DRAM].base,
262264
htif_symbol_callback);
263265
} else {
264266
firmware_end_addr = riscv_find_and_load_firmware(machine,
265-
RISCV64_BIOS_ELF, memmap[SPIKE_DRAM].base,
267+
RISCV64_BIOS_BIN, memmap[SPIKE_DRAM].base,
266268
htif_symbol_callback);
267269
}
268270

271+
/* Load kernel */
269272
if (machine->kernel_filename) {
270273
kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0],
271274
firmware_end_addr);
272275

273276
kernel_entry = riscv_load_kernel(machine->kernel_filename,
274277
kernel_start_addr,
275278
htif_symbol_callback);
276-
277-
if (machine->initrd_filename) {
278-
hwaddr start;
279-
hwaddr end = riscv_load_initrd(machine->initrd_filename,
280-
machine->ram_size, kernel_entry,
281-
&start);
282-
qemu_fdt_setprop_cell(s->fdt, "/chosen",
283-
"linux,initrd-start", start);
284-
qemu_fdt_setprop_cell(s->fdt, "/chosen", "linux,initrd-end",
285-
end);
286-
}
287279
} else {
288280
/*
289281
* If dynamic firmware is used, it doesn't know where is the next mode
@@ -292,6 +284,22 @@ static void spike_board_init(MachineState *machine)
292284
kernel_entry = 0;
293285
}
294286

287+
/* Create device tree */
288+
create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline,
289+
riscv_is_32bit(&s->soc[0]));
290+
291+
/* Load initrd */
292+
if (machine->kernel_filename && machine->initrd_filename) {
293+
hwaddr start;
294+
hwaddr end = riscv_load_initrd(machine->initrd_filename,
295+
machine->ram_size, kernel_entry,
296+
&start);
297+
qemu_fdt_setprop_cell(s->fdt, "/chosen",
298+
"linux,initrd-start", start);
299+
qemu_fdt_setprop_cell(s->fdt, "/chosen", "linux,initrd-end",
300+
end);
301+
}
302+
295303
/* Compute the fdt load address in dram */
296304
fdt_load_addr = riscv_load_fdt(memmap[SPIKE_DRAM].base,
297305
machine->ram_size, s->fdt);
@@ -303,7 +311,8 @@ static void spike_board_init(MachineState *machine)
303311

304312
/* initialize HTIF using symbols found in load_kernel */
305313
htif_mm_init(system_memory, mask_rom,
306-
&s->soc[0].harts[0].env, serial_hd(0));
314+
&s->soc[0].harts[0].env, serial_hd(0),
315+
memmap[SPIKE_HTIF].base);
307316
}
308317

309318
static void spike_machine_instance_init(Object *obj)

hw/riscv/virt.c

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "chardev/char.h"
3939
#include "sysemu/device_tree.h"
4040
#include "sysemu/sysemu.h"
41+
#include "sysemu/kvm.h"
4142
#include "hw/pci/pci.h"
4243
#include "hw/pci-host/gpex.h"
4344
#include "hw/display/ramfb.h"
@@ -372,13 +373,22 @@ static void create_fdt_socket_plic(RISCVVirtState *s,
372373
"sifive,plic-1.0.0", "riscv,plic0"
373374
};
374375

375-
plic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 4);
376+
if (kvm_enabled()) {
377+
plic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 2);
378+
} else {
379+
plic_cells = g_new0(uint32_t, s->soc[socket].num_harts * 4);
380+
}
376381

377382
for (cpu = 0; cpu < s->soc[socket].num_harts; cpu++) {
378-
plic_cells[cpu * 4 + 0] = cpu_to_be32(intc_phandles[cpu]);
379-
plic_cells[cpu * 4 + 1] = cpu_to_be32(IRQ_M_EXT);
380-
plic_cells[cpu * 4 + 2] = cpu_to_be32(intc_phandles[cpu]);
381-
plic_cells[cpu * 4 + 3] = cpu_to_be32(IRQ_S_EXT);
383+
if (kvm_enabled()) {
384+
plic_cells[cpu * 2 + 0] = cpu_to_be32(intc_phandles[cpu]);
385+
plic_cells[cpu * 2 + 1] = cpu_to_be32(IRQ_S_EXT);
386+
} else {
387+
plic_cells[cpu * 4 + 0] = cpu_to_be32(intc_phandles[cpu]);
388+
plic_cells[cpu * 4 + 1] = cpu_to_be32(IRQ_M_EXT);
389+
plic_cells[cpu * 4 + 2] = cpu_to_be32(intc_phandles[cpu]);
390+
plic_cells[cpu * 4 + 3] = cpu_to_be32(IRQ_S_EXT);
391+
}
382392
}
383393

384394
plic_phandles[socket] = (*phandle)++;
@@ -436,10 +446,12 @@ static void create_fdt_sockets(RISCVVirtState *s, const MemMapEntry *memmap,
436446

437447
create_fdt_socket_memory(s, memmap, socket);
438448

439-
if (s->have_aclint) {
440-
create_fdt_socket_aclint(s, memmap, socket, intc_phandles);
441-
} else {
442-
create_fdt_socket_clint(s, memmap, socket, intc_phandles);
449+
if (!kvm_enabled()) {
450+
if (s->have_aclint) {
451+
create_fdt_socket_aclint(s, memmap, socket, intc_phandles);
452+
} else {
453+
create_fdt_socket_clint(s, memmap, socket, intc_phandles);
454+
}
443455
}
444456

445457
create_fdt_socket_plic(s, memmap, socket, phandle,
@@ -801,23 +813,25 @@ static void virt_machine_init(MachineState *machine)
801813
hart_count, &error_abort);
802814
sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_abort);
803815

804-
/* Per-socket CLINT */
805-
riscv_aclint_swi_create(
806-
memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size,
807-
base_hartid, hart_count, false);
808-
riscv_aclint_mtimer_create(
809-
memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size +
810-
RISCV_ACLINT_SWI_SIZE,
811-
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, hart_count,
812-
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
813-
RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
814-
815-
/* Per-socket ACLINT SSWI */
816-
if (s->have_aclint) {
816+
if (!kvm_enabled()) {
817+
/* Per-socket CLINT */
817818
riscv_aclint_swi_create(
818-
memmap[VIRT_ACLINT_SSWI].base +
819-
i * memmap[VIRT_ACLINT_SSWI].size,
820-
base_hartid, hart_count, true);
819+
memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size,
820+
base_hartid, hart_count, false);
821+
riscv_aclint_mtimer_create(
822+
memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size +
823+
RISCV_ACLINT_SWI_SIZE,
824+
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, hart_count,
825+
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
826+
RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true);
827+
828+
/* Per-socket ACLINT SSWI */
829+
if (s->have_aclint) {
830+
riscv_aclint_swi_create(
831+
memmap[VIRT_ACLINT_SSWI].base +
832+
i * memmap[VIRT_ACLINT_SSWI].size,
833+
base_hartid, hart_count, true);
834+
}
821835
}
822836

823837
/* Per-socket PLIC hart topology configuration string */
@@ -884,6 +898,16 @@ static void virt_machine_init(MachineState *machine)
884898
memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base,
885899
mask_rom);
886900

901+
/*
902+
* Only direct boot kernel is currently supported for KVM VM,
903+
* so the "-bios" parameter is ignored and treated like "-bios none"
904+
* when KVM is enabled.
905+
*/
906+
if (kvm_enabled()) {
907+
g_free(machine->firmware);
908+
machine->firmware = g_strdup("none");
909+
}
910+
887911
if (riscv_is_32bit(&s->soc[0])) {
888912
firmware_end_addr = riscv_find_and_load_firmware(machine,
889913
RISCV32_BIOS_BIN, start_addr, NULL);
@@ -941,6 +965,15 @@ static void virt_machine_init(MachineState *machine)
941965
virt_memmap[VIRT_MROM].size, kernel_entry,
942966
fdt_load_addr, machine->fdt);
943967

968+
/*
969+
* Only direct boot kernel is currently supported for KVM VM,
970+
* So here setup kernel start address and fdt address.
971+
* TODO:Support firmware loading and integrate to TCG start
972+
*/
973+
if (kvm_enabled()) {
974+
riscv_setup_direct_kernel(kernel_entry, fdt_load_addr);
975+
}
976+
944977
/* SiFive Test MMIO device */
945978
sifive_test_create(memmap[VIRT_TEST].base);
946979

0 commit comments

Comments
 (0)