Artyom Tarasenko <atar4q...@gmail.com> writes: > On Thu, Jan 26, 2017 at 8:35 AM, Markus Armbruster <arm...@redhat.com> wrote: >> niagara_init() does something naughty, which conflicts with Max's >> "[PATCH v6 0/9] block: Drop BDS.filename". Details inline. >> >> Artyom Tarasenko <atar4q...@gmail.com> writes: >> >>> Remove the Niagara stub implementation from sun4u.c and add a machine, >>> compatible with Legion simulator from the OpenSPARC T1 project. >>> >>> The machine uses the firmware supplied with the OpenSPARC T1 project, >>> http://download.oracle.com/technetwork/systems/opensparc/OpenSPARCT1_Arch.1.5.tar.bz2 >>> in the directory S10image/, and is able to boot the supplied Solaris 10 >>> image. >>> >>> Note that for compatibility with the naming conventions for SPARC machines >>> the new machine name is lowercase niagara. >>> >>> Signed-off-by: Artyom Tarasenko <atar4q...@gmail.com> >>> Reviewed-by: Richard Henderson <r...@twiddle.net> >>> --- >>> MAINTAINERS | 13 +-- >>> default-configs/sparc64-softmmu.mak | 2 + >>> hw/sparc64/Makefile.objs | 1 + >>> hw/sparc64/niagara.c | 177 >>> ++++++++++++++++++++++++++++++++++++ >>> hw/sparc64/sun4u.c | 31 ------- >>> qemu-doc.texi | 14 ++- >>> 6 files changed, 199 insertions(+), 39 deletions(-) >>> create mode 100644 hw/sparc64/niagara.c >>> >>> diff --git a/MAINTAINERS b/MAINTAINERS >>> index 54588e5..b5ebfab 100644 >>> --- a/MAINTAINERS >>> +++ b/MAINTAINERS >>> @@ -725,6 +725,13 @@ S: Maintained >>> F: hw/sparc64/sun4u.c >>> F: pc-bios/openbios-sparc64 >>> >>> +Sun4v >>> +M: Artyom Tarasenko <atar4q...@gmail.com> >>> +S: Maintained >>> +F: hw/sparc64/sun4v.c >>> +F: hw/timer/sun4v-rtc.c >>> +F: include/hw/timer/sun4v-rtc.h >>> + >>> Leon3 >>> M: Fabien Chouteau <chout...@adacore.com> >>> S: Maintained >>> @@ -1098,12 +1105,6 @@ F: hw/nvram/chrp_nvram.c >>> F: include/hw/nvram/chrp_nvram.h >>> F: tests/prom-env-test.c >>> >>> -sun4v RTC >>> -M: Artyom Tarasenko <atar4q...@gmail.com> >>> -S: Maintained >>> -F: hw/timer/sun4v-rtc.c >>> -F: include/hw/timer/sun4v-rtc.h >>> - >>> Subsystems >>> ---------- >>> Audio >>> diff --git a/default-configs/sparc64-softmmu.mak >>> b/default-configs/sparc64-softmmu.mak >>> index c0cdd64..c581e61 100644 >>> --- a/default-configs/sparc64-softmmu.mak >>> +++ b/default-configs/sparc64-softmmu.mak >>> @@ -13,3 +13,5 @@ CONFIG_IDE_CMD646=y >>> CONFIG_PCI_APB=y >>> CONFIG_MC146818RTC=y >>> CONFIG_ISA_TESTDEV=y >>> +CONFIG_EMPTY_SLOT=y >>> +CONFIG_SUN4V_RTC=y >>> diff --git a/hw/sparc64/Makefile.objs b/hw/sparc64/Makefile.objs >>> index a96b1f8..cf9de21 100644 >>> --- a/hw/sparc64/Makefile.objs >>> +++ b/hw/sparc64/Makefile.objs >>> @@ -1,2 +1,3 @@ >>> obj-y += sparc64.o >>> obj-y += sun4u.o >>> +obj-y += niagara.o >>> \ No newline at end of file >>> diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c >>> new file mode 100644 >>> index 0000000..b55d4bb >>> --- /dev/null >>> +++ b/hw/sparc64/niagara.c >>> @@ -0,0 +1,177 @@ >>> +/* >>> + * QEMU Sun4v/Niagara System Emulator >>> + * >>> + * Copyright (c) 2016 Artyom Tarasenko >>> + * >>> + * Permission is hereby granted, free of charge, to any person obtaining a >>> copy >>> + * of this software and associated documentation files (the "Software"), >>> to deal >>> + * in the Software without restriction, including without limitation the >>> rights >>> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or >>> sell >>> + * copies of the Software, and to permit persons to whom the Software is >>> + * furnished to do so, subject to the following conditions: >>> + * >>> + * The above copyright notice and this permission notice shall be included >>> in >>> + * all copies or substantial portions of the Software. >>> + * >>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS >>> OR >>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL >>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR >>> OTHER >>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING >>> FROM, >>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS >>> IN >>> + * THE SOFTWARE. >>> + */ >>> + >>> +#include "qemu/osdep.h" >>> +#include "qapi/error.h" >>> +#include "qemu-common.h" >>> +#include "cpu.h" >>> +#include "hw/hw.h" >>> +#include "hw/boards.h" >>> +#include "hw/char/serial.h" >>> +#include "hw/empty_slot.h" >>> +#include "hw/loader.h" >>> +#include "hw/sparc/sparc64.h" >>> +#include "hw/timer/sun4v-rtc.h" >>> +#include "exec/address-spaces.h" >>> +#include "sysemu/block-backend.h" >>> + >>> + >>> +typedef struct NiagaraBoardState { >>> + MemoryRegion hv_ram; >>> + MemoryRegion partition_ram; >>> + MemoryRegion nvram; >>> + MemoryRegion md_rom; >>> + MemoryRegion hv_rom; >>> + MemoryRegion vdisk_ram; >>> + MemoryRegion prom; >>> +} NiagaraBoardState; >>> + >>> +#define NIAGARA_HV_RAM_BASE 0x100000ULL >>> +#define NIAGARA_HV_RAM_SIZE 0x3f00000ULL /* 63 MiB */ >>> + >>> +#define NIAGARA_PARTITION_RAM_BASE 0x80000000ULL >>> + >>> +#define NIAGARA_UART_BASE 0x1f10000000ULL >>> + >>> +#define NIAGARA_NVRAM_BASE 0x1f11000000ULL >>> +#define NIAGARA_NVRAM_SIZE 0x2000 >>> + >>> +#define NIAGARA_MD_ROM_BASE 0x1f12000000ULL >>> +#define NIAGARA_MD_ROM_SIZE 0x2000 >>> + >>> +#define NIAGARA_HV_ROM_BASE 0x1f12080000ULL >>> +#define NIAGARA_HV_ROM_SIZE 0x2000 >>> + >>> +#define NIAGARA_IOBBASE 0x9800000000ULL >>> +#define NIAGARA_IOBSIZE 0x0100000000ULL >>> + >>> +#define NIAGARA_VDISK_BASE 0x1f40000000ULL >>> +#define NIAGARA_RTC_BASE 0xfff0c1fff8ULL >>> +#define NIAGARA_UART_BASE 0x1f10000000ULL >>> + >>> +/* Firmware layout >>> + * >>> + * |------------------| >>> + * | openboot.bin | >>> + * |------------------| PROM_ADDR + OBP_OFFSET >>> + * | q.bin | >>> + * |------------------| PROM_ADDR + Q_OFFSET >>> + * | reset.bin | >>> + * |------------------| PROM_ADDR >>> + */ >>> +#define NIAGARA_PROM_BASE 0xfff0000000ULL >>> +#define NIAGARA_Q_OFFSET 0x10000ULL >>> +#define NIAGARA_OBP_OFFSET 0x80000ULL >>> +#define PROM_SIZE_MAX (4 * 1024 * 1024) >>> + >>> +/* Niagara hardware initialisation */ >>> +static void niagara_init(MachineState *machine) >>> +{ >>> + NiagaraBoardState *s = g_new(NiagaraBoardState, 1); >>> + DriveInfo *dinfo = drive_get_next(IF_PFLASH); >> >> @dinfo is the first -drive if=pflash (or its sugared form -pflash). >> >>> + MemoryRegion *sysmem = get_system_memory(); >>> + >>> + /* init CPUs */ >>> + sparc64_cpu_devinit(machine->cpu_model, "Sun UltraSparc T1", >>> + NIAGARA_PROM_BASE); >>> + /* set up devices */ >>> + memory_region_allocate_system_memory(&s->hv_ram, NULL, "sun4v-hv.ram", >>> + NIAGARA_HV_RAM_SIZE); >>> + memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram); >>> + >>> + memory_region_allocate_system_memory(&s->partition_ram, NULL, >>> + "sun4v-partition.ram", >>> + machine->ram_size); >>> + memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE, >>> + &s->partition_ram); >>> + >>> + memory_region_allocate_system_memory(&s->nvram, NULL, >>> + "sun4v.nvram", >>> NIAGARA_NVRAM_SIZE); >>> + memory_region_add_subregion(sysmem, NIAGARA_NVRAM_BASE, &s->nvram); >>> + memory_region_allocate_system_memory(&s->md_rom, NULL, >>> + "sun4v-md.rom", >>> NIAGARA_MD_ROM_SIZE); >>> + memory_region_add_subregion(sysmem, NIAGARA_MD_ROM_BASE, &s->md_rom); >>> + memory_region_allocate_system_memory(&s->hv_rom, NULL, >>> + "sun4v-hv.rom", >>> NIAGARA_HV_ROM_SIZE); >>> + memory_region_add_subregion(sysmem, NIAGARA_HV_ROM_BASE, &s->hv_rom); >>> + memory_region_allocate_system_memory(&s->prom, NULL, >>> + "sun4v.prom", PROM_SIZE_MAX); >>> + memory_region_add_subregion(sysmem, NIAGARA_PROM_BASE, &s->prom); >>> + >>> + rom_add_file_fixed("nvram1", NIAGARA_NVRAM_BASE, -1); >>> + rom_add_file_fixed("1up-md.bin", NIAGARA_MD_ROM_BASE, -1); >>> + rom_add_file_fixed("1up-hv.bin", NIAGARA_HV_ROM_BASE, -1); >>> + >>> + rom_add_file_fixed("reset.bin", NIAGARA_PROM_BASE, -1); >>> + rom_add_file_fixed("q.bin", NIAGARA_PROM_BASE + NIAGARA_Q_OFFSET, -1); >>> + rom_add_file_fixed("openboot.bin", NIAGARA_PROM_BASE + >>> NIAGARA_OBP_OFFSET, >>> + -1); >>> + >>> + /* the virtual ramdisk is kind of initrd, but it resides >>> + outside of the partition RAM */ >>> + if (dinfo) { >>> + BlockBackend *blk = blk_by_legacy_dinfo(dinfo); >> >> This is the block backend created by the first -drive if=pflash. >> >>> + int size = blk_getlength(blk); >>> + if (size > 0) { >>> + memory_region_allocate_system_memory(&s->vdisk_ram, NULL, >>> + "sun4v_vdisk.ram", size); >>> + memory_region_add_subregion(get_system_memory(), >>> + NIAGARA_VDISK_BASE, &s->vdisk_ram); >>> + dinfo->is_default = 1; >>> + rom_add_file_fixed(blk_bs(blk)->filename, NIAGARA_VDISK_BASE, >>> -1); >> >> The block backend isn't actually used. It's merely a carrier for a >> filename. Naughty. Also conflicts with Max's work to kill ->filename. >> >> What you create for it isn't actually a pflash device. Naughty. >> >> Despite rom_add_file_fixed(), it's RAM, not ROM: >> >> (qemu) info mtree >> address-space: memory >> 0000000000000000-ffffffffffffffff (prio 0, RW): system >> 0000000000100000-0000000003ffffff (prio 0, RW): sun4v-hv.ram >> 0000000080000000-0000000087ffffff (prio 0, RW): sun4v-partition.ram >> 0000001f10000000-0000001f10000007 (prio 0, RW): serial >> 0000001f11000000-0000001f11001fff (prio 0, RW): sun4v.nvram >> 0000001f12000000-0000001f12001fff (prio 0, RW): sun4v-md.rom >> 0000001f12080000-0000001f12081fff (prio 0, RW): sun4v-hv.rom >> 0000001f40000000-0000001f413fffff (prio 0, RW): sun4v_vdisk.ram >> 0000009800000000-00000098ffffffff (prio 0, RW): empty-slot >> 000000fff0000000-000000fff03fffff (prio 0, RW): sun4v.prom >> 000000fff0c1fff8-000000fff0c1ffff (prio 0, RW): sun4v-rtc >> >> address-space: I/O >> 0000000000000000-000000000000ffff (prio 0, RW): io >> >> address-space: cpu-memory >> 0000000000000000-ffffffffffffffff (prio 0, RW): system >> 0000000000100000-0000000003ffffff (prio 0, RW): sun4v-hv.ram >> 0000000080000000-0000000087ffffff (prio 0, RW): sun4v-partition.ram >> 0000001f10000000-0000001f10000007 (prio 0, RW): serial >> 0000001f11000000-0000001f11001fff (prio 0, RW): sun4v.nvram >> 0000001f12000000-0000001f12001fff (prio 0, RW): sun4v-md.rom >> 0000001f12080000-0000001f12081fff (prio 0, RW): sun4v-hv.rom >> ---> 0000001f40000000-0000001f413fffff (prio 0, RW): sun4v_vdisk.ram >> 0000009800000000-00000098ffffffff (prio 0, RW): empty-slot >> 000000fff0000000-000000fff03fffff (prio 0, RW): sun4v.prom >> >> Note that sun4v-md.rom and sun4v-hv.rom aren't ROM, either. > > Is rom_add_file_fixed supposed to mark the memory region read-only? Or > should it be created read-only before calling rom_add_file_fixed?
I'm not familiar with the memory API, but the fact that you're getting RW suggests that you need to mark read-only yourself. Suggest to examine similar code elsewhere for additional clues. >> The monkey-patching of dinfo->is_default is to silence the "Orphaned >> drive without device" warning. Naughty. >> >> This use of -drive if=pflash is highly unorthodox. To suggest better >> ways, we need to understand the role of "the virtual ramdisk". Can you >> explain? How does it work on a physical system? > > AFAIK except for simulators it's only used on FPGA boards. It's what > the comment says: a kind of initrd, but it resides outside of the > partition RAM. So, it is a RAM region pre-filled with data in the way > not visible to the guest. > > I would have used an -initrd option instead of -pflash, but it > required a -kernel option, and there is no sensible way to use the > -kernel with Solaris. > If QEMU had something like a nvram-disk - it would have worked here the best. Have you considered pressing -bios into service? -option-rom? -object memory-backend-file? Paolo, any recommendations?