diff --git a/.gitignore b/.gitignore index 5700f720..a76a21fa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ target test_data resources/cloud-hypervisor resources/images +resources/coreboot/coreboot diff --git a/Cargo.toml b/Cargo.toml index 6091cfc8..17ebd07d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ log-serial = [] # gets you most of the code size reduction, without losing _all_ debugging. log-panic = ["log-serial"] integration_tests = [] +coreboot = [] [dependencies] bitflags = "1.2" diff --git a/Jenkinsfile b/Jenkinsfile index 37a8ec2f..b2e0edd1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -28,6 +28,11 @@ pipeline { sh "./run_integration_tests.sh" } } + stage ('Run coreboot integration tests') { + steps { + sh "./run_coreboot_integration_tests.sh" + } + } } } } diff --git a/fetch_disk_images.sh b/fetch_disk_images.sh new file mode 100755 index 00000000..5969e4b8 --- /dev/null +++ b/fetch_disk_images.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -xeuf + +IMAGES_DIR="./resources/images" +mkdir -p "$IMAGES_DIR" + +CLEAR_OS_IMAGE_NAME="clear-31311-cloudguest.img" +CLEAR_OS_IMAGE_URL="https://cloudhypervisorstorage.blob.core.windows.net/images/$CLEAR_OS_IMAGE_NAME" +CLEAR_OS_IMAGE="$IMAGES_DIR/$CLEAR_OS_IMAGE_NAME" +if [ ! -f "$CLEAR_OS_IMAGE" ]; then + pushd $IMAGES_DIR + wget --quiet $CLEAR_OS_IMAGE_URL + popd +fi + +BIONIC_OS_IMAGE_NAME="bionic-server-cloudimg-amd64.img" +BIONIC_OS_IMAGE_URL="https://cloudhypervisorstorage.blob.core.windows.net/images/$BIONIC_OS_IMAGE_NAME" +BIONIC_OS_IMAGE="$IMAGES_DIR/$BIONIC_OS_IMAGE_NAME" +if [ ! -f "$BIONIC_OS_IMAGE" ]; then + pushd $IMAGES_DIR + wget --quiet $BIONIC_OS_IMAGE_URL + popd +fi + +BIONIC_OS_RAW_IMAGE_NAME="bionic-server-cloudimg-amd64-raw.img" +BIONIC_OS_RAW_IMAGE="$IMAGES_DIR/$BIONIC_OS_RAW_IMAGE_NAME" +if [ ! -f "$BIONIC_OS_RAW_IMAGE" ]; then + pushd $IMAGES_DIR + qemu-img convert -p -f qcow2 -O raw $BIONIC_OS_IMAGE_NAME $BIONIC_OS_RAW_IMAGE_NAME + popd +fi + +FOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64.img" +FOCAL_OS_IMAGE_URL="https://cloudhypervisorstorage.blob.core.windows.net/images/$FOCAL_OS_IMAGE_NAME" +FOCAL_OS_IMAGE="$IMAGES_DIR/$FOCAL_OS_IMAGE_NAME" +if [ ! -f "$FOCAL_OS_IMAGE" ]; then + pushd $IMAGES_DIR + wget --quiet $FOCAL_OS_IMAGE_URL + popd +fi + +FOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-raw.img" +FOCAL_OS_RAW_IMAGE="$IMAGES_DIR/$FOCAL_OS_RAW_IMAGE_NAME" +if [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then + pushd $IMAGES_DIR + qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME + popd +fi diff --git a/layout.ld b/layout.ld index 7ab6066f..cb935195 100644 --- a/layout.ld +++ b/layout.ld @@ -1,4 +1,4 @@ -ENTRY(rust64_start) /* This firmware doesn't use the ELF entrypoint */ +ENTRY(ram32_start) /* coreboot uses the ELF entrypoint */ PHDRS { diff --git a/resources/coreboot/qemu-q35-config.in b/resources/coreboot/qemu-q35-config.in new file mode 100644 index 00000000..7b5a1231 --- /dev/null +++ b/resources/coreboot/qemu-q35-config.in @@ -0,0 +1,653 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +# CONFIG_ANY_TOOLCHAIN is not set +# CONFIG_CCACHE is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +# CONFIG_USE_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +# CONFIG_HAVE_ASAN_IN_ROMSTAGE is not set +# CONFIG_ASAN_IN_ROMSTAGE is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN_IN_RAMSTAGE is not set +# CONFIG_ASAN is not set +CONFIG_NO_STAGE_CACHE=y +# CONFIG_CBMEM_STAGE_CACHE is not set +# CONFIG_UPDATE_IMAGE is not set +# CONFIG_BOOTSPLASH_IMAGE is not set +# CONFIG_FW_CONFIG is not set + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_ADLINK is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BAP is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +# CONFIG_VENDOR_ELMEX is not set +CONFIG_VENDOR_EMULATION=y +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GIZMOSPHERE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_JETWAY is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_LIPPERT is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SCALEWAY is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_SUPERMICRO is not set +# CONFIG_VENDOR_SYSTEM76 is not set +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_UP is not set +CONFIG_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_PART_NUMBER="QEMU x86 q35/ich9" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="emulation/qemu-q35" +CONFIG_MAX_CPUS=1 +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Emulation" +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +# CONFIG_VGA_BIOS is not set +CONFIG_CBFS_SIZE=0x00200000 +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x4000 +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_POST_IO=y +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_UART_FOR_CONSOLE=0 +# CONFIG_CONSOLE_POST is not set +CONFIG_TPM_PIRQ=0x0 +CONFIG_POST_DEVICE=y +# CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set +# CONFIG_BOARD_EMULATION_QEMU_ARMV7 is not set +# CONFIG_BOARD_EMULATION_QEMU_X86_I440FX is not set +# CONFIG_BOARD_EMULATION_QEMU_POWER8 is not set +CONFIG_BOARD_EMULATION_QEMU_X86_Q35=y +# CONFIG_BOARD_EMULATION_QEMU_RISCV_RV64 is not set +# CONFIG_BOARD_EMULATION_QEMU_RISCV_RV32 is not set +# CONFIG_BOARD_EMULATION_SPIKE_RISCV is not set +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +# CONFIG_VBOOT is not set +CONFIG_VBOOT_VBNV_OFFSET=0x2c +CONFIG_DCACHE_RAM_BASE=0x10000 +CONFIG_DCACHE_RAM_SIZE=0x90000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x4000 +CONFIG_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 +# CONFIG_HAVE_INTEL_FIRMWARE is not set +CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_CHROMEOS is not set +CONFIG_CONSOLE_SERIAL=y +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_HEAP_SIZE=0x4000 +CONFIG_BOARD_ROMSIZE_KB_2048=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +CONFIG_COREBOOT_ROMSIZE_KB_2048=y +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_16384 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=2048 +CONFIG_ROM_SIZE=0x00200000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_OFF_AFTER_FAILURE=y +# CONFIG_POWER_STATE_ON_AFTER_FAILURE is not set +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 +# CONFIG_SYSTEM_TYPE_LAPTOP is not set +# CONFIG_SYSTEM_TYPE_TABLET is not set +# CONFIG_SYSTEM_TYPE_DETACHABLE is not set +# CONFIG_SYSTEM_TYPE_CONVERTIBLE is not set +# CONFIG_CBFS_AUTOGEN_ATTRIBUTES is not set + +# +# Chipset +# + +# +# SoC +# +CONFIG_X86_RESET_VECTOR=0xfffffff0 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_RAMBASE=0xe00000 +CONFIG_CPU_ADDR_BITS=36 +# CONFIG_CHECK_REV_IN_OPROM_NAME is not set +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_ACPI_CPU_STRING="\\_SB.CP%02d" +# CONFIG_SOC_CAVIUM_CN81XX is not set +CONFIG_ARCH_ARMV8_EXTENSION=0 +CONFIG_STACK_SIZE=0x1000 +# CONFIG_SOC_CAVIUM_COMMON is not set +# CONFIG_SOC_INTEL_GEMINILAKE is not set +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +# CONFIG_PCIEXP_ASPM is not set +# CONFIG_PCIEXP_COMMON_CLOCK is not set +CONFIG_TTYS0_BASE=0x3f8 +CONFIG_TTYS0_LCS=3 +CONFIG_UART_PCI_ADDR=0x0 +# CONFIG_SOC_MEDIATEK_MT8173 is not set +# CONFIG_SOC_MEDIATEK_MT8183 is not set +# CONFIG_SOC_MEDIATEK_MT8192 is not set +# CONFIG_SOC_NVIDIA_TEGRA124 is not set +# CONFIG_SOC_NVIDIA_TEGRA210 is not set +# CONFIG_SOC_QUALCOMM_COMMON is not set +# CONFIG_SOC_QC_IPQ40XX is not set +# CONFIG_SOC_QC_IPQ806X is not set +# CONFIG_SOC_QUALCOMM_QCS405 is not set +# CONFIG_SOC_QUALCOMM_SC7180 is not set +# CONFIG_SOC_QUALCOMM_SDM845 is not set +# CONFIG_SOC_ROCKCHIP_RK3288 is not set +# CONFIG_SOC_ROCKCHIP_RK3399 is not set +# CONFIG_CPU_SAMSUNG_EXYNOS5250 is not set +# CONFIG_CPU_SAMSUNG_EXYNOS5420 is not set +# CONFIG_SOC_TI_AM335X is not set +# CONFIG_SOC_UCB_RISCV is not set + +# +# CPU +# +# CONFIG_CPU_AMD_AGESA is not set +# CONFIG_CPU_AMD_PI is not set +# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set +# CONFIG_SSE2 is not set +# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set +# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set +CONFIG_CPU_QEMU_X86=y +# CONFIG_CPU_QEMU_X86_64 is not set +CONFIG_CPU_QEMU_X86_32=y +# CONFIG_PARALLEL_CPU_INIT is not set +# CONFIG_PARALLEL_MP is not set +# CONFIG_UDELAY_LAPIC is not set +CONFIG_UDELAY_TSC=y +CONFIG_UNKNOWN_TSC_RATE=y +CONFIG_TSC_MONOTONIC_TIMER=y +# CONFIG_TSC_SYNC_LFENCE is not set +# CONFIG_TSC_SYNC_MFENCE is not set +CONFIG_LOGICAL_CPUS=y +CONFIG_HAVE_SMI_HANDLER=y +# CONFIG_NO_SMM is not set +CONFIG_SMM_ASEG=y +# CONFIG_X86_SMM_LOADER_VERSION2 is not set +# CONFIG_SMM_LAPIC_REMAP_MITIGATION is not set +# CONFIG_SERIALIZED_SMM_INITIALIZATION is not set +# CONFIG_X86_AMD_FIXED_MTRRS is not set +# CONFIG_X86_AMD_INIT_SIPI is not set +# CONFIG_SOC_SETS_MSRS is not set +# CONFIG_SMP is not set +# CONFIG_SUPPORT_CPU_UCODE_IN_CBFS is not set +# CONFIG_USES_MICROCODE_HEADER_FILES is not set + +# +# Northbridge +# +# CONFIG_NORTHBRIDGE_AMD_AGESA is not set +# CONFIG_NORTHBRIDGE_AMD_PI is not set +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 + +# +# Southbridge +# +# CONFIG_AMD_SB_CIMX is not set +# CONFIG_SOUTHBRIDGE_AMD_CIMX_SB800 is not set +CONFIG_HPET_MIN_TICKS=0x80 +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMCLIB=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PMBASE=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_GPIO=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_EARLY_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_ICH7 is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9 is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_SPI_SILVERMONT is not set +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_RCBA_PIRQ=y +# CONFIG_HAVE_INTEL_CHIPSET_LOCKDOWN is not set +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMM=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_USB_DEBUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_SOUTHBRIDGE_INTEL_COMMON_WATCHDOG=y +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_SOUTHBRIDGE_INTEL_I82801IX=y + +# +# Super I/O +# +# CONFIG_SUPERIO_ASPEED_AST2400 is not set +# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set +# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set +# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set + +# +# Embedded Controllers +# +# CONFIG_EC_51NB_NPCE985LA0DX is not set +# CONFIG_EC_GOOGLE_CHROMEEC_SKUID is not set +# CONFIG_EC_GOOGLE_WILCO is not set +# CONFIG_CAVIUM_BDK is not set +CONFIG_MAINBOARD_HAS_CHROMEOS=y + +# +# ChromeOS +# +# CONFIG_GOOGLE_SMBIOS_MAINBOARD_VERSION is not set +# CONFIG_UEFI_2_4_BINDING is not set +# CONFIG_UDK_2015_BINDING is not set +# CONFIG_UDK_2017_BINDING is not set +# CONFIG_UDK_202005_BINDING is not set +# CONFIG_USE_SIEMENS_HWILIB is not set +# CONFIG_ARM_LPAE is not set +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +# CONFIG_ARCH_POSTCAR_X86_64 is not set +# CONFIG_USE_MARCH_586 is not set +# CONFIG_SIPI_VECTOR_IN_ROM is not set +CONFIG_RAMTOP=0x1000000 +CONFIG_NUM_IPI_STARTS=2 +CONFIG_PC80_SYSTEM=y +# CONFIG_BOOTBLOCK_DEBUG_SPINLOOP is not set +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_IOAPIC_INTERRUPTS_ON_APIC_SERIAL_BUS=y +# CONFIG_HPET_ADDRESS_OVERRIDE is not set +CONFIG_HPET_ADDRESS=0xfed00000 +CONFIG_ID_SECTION_OFFSET=0x80 +CONFIG_POSTCAR_STAGE=y +# CONFIG_VERSTAGE_DEBUG_SPINLOOP is not set +# CONFIG_ROMSTAGE_DEBUG_SPINLOOP is not set +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +# CONFIG_COLLECT_TIMESTAMPS_NO_TSC is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +# CONFIG_PAGING_IN_CACHE_AS_RAM is not set +# CONFIG_IDT_IN_EVERY_STAGE is not set +CONFIG_HAVE_CF9_RESET=y +# CONFIG_PIRQ_ROUTE is not set + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +# CONFIG_MULTIPLE_VGA_ADAPTERS is not set + +# +# Display +# +CONFIG_VGA_TEXT_FRAMEBUFFER=y +# CONFIG_GENERIC_LINEAR_FRAMEBUFFER is not set +CONFIG_PCI=y +# CONFIG_NO_MMCONF_SUPPORT is not set +CONFIG_MMCONF_SUPPORT=y +# CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT is not set +CONFIG_HT_CHAIN_UNITID_BASE=0 +CONFIG_HT_CHAIN_END_UNITID_BASE=0 +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_AZALIA_PLUGIN_SUPPORT is not set +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_PCI_ALLOW_BUS_MASTER=y +# CONFIG_PCIEXP_HOTPLUG is not set +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +# CONFIG_SOFTWARE_I2C is not set +# CONFIG_RESOURCE_ALLOCATOR_V3 is not set +CONFIG_RESOURCE_ALLOCATOR_V4=y +# CONFIG_XHCI_UTILS is not set + +# +# Generic Drivers +# +# CONFIG_DRIVERS_AS3722_RTC is not set +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_MAINBOARD_HAS_CRB_TPM is not set +# CONFIG_GIC is not set +# CONFIG_IPMI_KCS is not set +# CONFIG_DRIVERS_LENOVO_WACOM is not set +# CONFIG_RT8168_GET_MAC_FROM_VPD is not set +# CONFIG_RT8168_SUPPORT_LEGACY_VPD_MAC is not set +# CONFIG_RT8168_SET_LED_MODE is not set +# CONFIG_SMMSTORE_IN_CBFS is not set +# CONFIG_SPI_FLASH is not set +# CONFIG_SPI_SDCARD is not set +# CONFIG_HAVE_SPI_CONSOLE_SUPPORT is not set +CONFIG_DRIVERS_UART=y +# CONFIG_DRIVERS_UART_8250IO_SKIP_INIT is not set +# CONFIG_NO_UART_ON_SUPERIO is not set +# CONFIG_UART_OVERRIDE_INPUT_CLOCK_DIVIDER is not set +# CONFIG_UART_OVERRIDE_REFCLK is not set +# CONFIG_DRIVERS_UART_8250MEM is not set +# CONFIG_DRIVERS_UART_8250MEM_32 is not set +# CONFIG_HAVE_UART_SPECIAL is not set +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_DRIVERS_UART_PL011 is not set +# CONFIG_UART_USE_REFCLK_AS_INPUT_CLOCK is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +# CONFIG_USBDEBUG is not set +# CONFIG_VPD is not set +# CONFIG_DRIVERS_AMD_PI is not set +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GFX_GENERIC is not set +# CONFIG_DRIVERS_I2C_MAX98373 is not set +# CONFIG_DRIVERS_I2C_MAX98390 is not set +# CONFIG_DRIVERS_I2C_MAX98927 is not set +# CONFIG_DRIVERS_I2C_PCA9538 is not set +# CONFIG_DRIVERS_I2C_PCF8523 is not set +# CONFIG_DRIVERS_I2C_PTN3460 is not set +# CONFIG_DRIVERS_I2C_RT1011 is not set +# CONFIG_DRIVERS_I2C_RT5663 is not set +# CONFIG_DRIVERS_I2C_RTD2132 is not set +# CONFIG_DRIVERS_I2C_RX6110SA is not set +# CONFIG_DRIVERS_I2C_SX9310 is not set +# CONFIG_MAINBOARD_HAS_I2C_TPM_ATMEL is not set +# CONFIG_MAINBOARD_HAS_I2C_TPM_CR50 is not set +# CONFIG_MAINBOARD_HAS_I2C_TPM_GENERIC is not set +# CONFIG_DRIVERS_INTEL_DPTF is not set +# CONFIG_PLATFORM_USES_FSP2_0 is not set +# CONFIG_PLATFORM_USES_FSP2_1 is not set +# CONFIG_PLATFORM_USES_FSP2_2 is not set +# CONFIG_INTEL_DDI is not set +# CONFIG_INTEL_EDID is not set +# CONFIG_INTEL_INT15 is not set +# CONFIG_INTEL_GMA_ACPI is not set +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +# CONFIG_INTEL_GMA_SSC_ALTERNATE_REF is not set +# CONFIG_INTEL_GMA_SWSMISCI is not set +# CONFIG_DRIVER_INTEL_I210 is not set +# CONFIG_DRIVERS_INTEL_ISH is not set +# CONFIG_DRIVERS_INTEL_MIPI_CAMERA is not set +# CONFIG_DRIVERS_INTEL_PMC is not set +# CONFIG_HAVE_INTEL_PTT is not set +# CONFIG_IPMI_OCP is not set +# CONFIG_DRIVERS_LENOVO_HYBRID_GRAPHICS is not set +# CONFIG_DRIVER_MAXIM_MAX77686 is not set +CONFIG_FRU_DEVICE_ID=0 +# CONFIG_DRIVER_PARADE_PS8625 is not set +# CONFIG_DRIVER_PARADE_PS8640 is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +CONFIG_MAINBOARD_HAS_LPC_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +CONFIG_VGA=y +# CONFIG_DRIVERS_RICOH_RCE822 is not set +# CONFIG_DRIVER_SIEMENS_NC_FPGA is not set +# CONFIG_NC_FPGA_NOTIFY_CB_READY is not set +# CONFIG_DRIVERS_SIL_3114 is not set +# CONFIG_MAINBOARD_HAS_SPI_TPM_CR50 is not set +# CONFIG_MAINBOARD_HAS_SPI_TPM is not set +# CONFIG_DRIVERS_TI_SN65DSI86BRIDGE is not set +# CONFIG_DRIVER_TI_TPS65090 is not set +# CONFIG_DRIVERS_TI_TPS65913_RTC is not set +# CONFIG_DRIVERS_USB_ACPI is not set +# CONFIG_DRIVERS_USB_PCI_XHCI is not set +CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_USE_SAR is not set +# CONFIG_COMMONLIB_STORAGE is not set + +# +# Security +# + +# +# Verified Boot (vboot) +# + +# +# Trusted Platform Module +# +CONFIG_USER_NO_TPM=y +# CONFIG_USER_TPM1 is not set +# CONFIG_USER_TPM2 is not set +# CONFIG_TPM_RDRESP_NEED_DELAY is not set + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +CONFIG_BOOTMEDIA_LOCK_NONE=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +# CONFIG_ACPI_AMD_HARDWARE_SLEEP_VALUES is not set +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_HAVE_ACPI_TABLES=y +# CONFIG_BOOT_DEVICE_NOT_SPI_FLASH is not set +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +# CONFIG_BOOT_DEVICE_SUPPORTS_WRITES is not set +# CONFIG_RTC is not set + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y + +# +# I/O mapped, 8250-compatible +# + +# +# Serial port base address = 0x3f8 +# +# CONFIG_CONSOLE_SERIAL_921600 is not set +# CONFIG_CONSOLE_SERIAL_460800 is not set +# CONFIG_CONSOLE_SERIAL_230400 is not set +CONFIG_CONSOLE_SERIAL_115200=y +# CONFIG_CONSOLE_SERIAL_57600 is not set +# CONFIG_CONSOLE_SERIAL_38400 is not set +# CONFIG_CONSOLE_SERIAL_19200 is not set +# CONFIG_CONSOLE_SERIAL_9600 is not set +CONFIG_TTYS0_BAUD=115200 +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +# CONFIG_CONSOLE_SPI_FLASH is not set +CONFIG_CONSOLE_QEMU_DEBUGCON=y +CONFIG_CONSOLE_QEMU_DEBUGCON_PORT=0x402 +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +# CONFIG_CMOS_POST is not set +CONFIG_POST_DEVICE_NONE=y +# CONFIG_POST_DEVICE_LPC is not set +# CONFIG_POST_DEVICE_PCI_PCIE is not set +# CONFIG_DEFAULT_POST_ON_LPC is not set +CONFIG_POST_IO_PORT=0x80 +# CONFIG_NO_EARLY_BOOTBLOCK_POSTCODES is not set +CONFIG_HWBASE_DEBUG_CB=y +# CONFIG_HAVE_ACPI_RESUME is not set +# CONFIG_DISABLE_ACPI_HIBERNATE is not set +# CONFIG_NO_MONOTONIC_TIMER is not set +CONFIG_HAVE_MONOTONIC_TIMER=y +# CONFIG_TIMER_QUEUE is not set +CONFIG_HAVE_OPTION_TABLE=y +# CONFIG_PCI_IO_CFG_EXT is not set +CONFIG_IOAPIC=y +CONFIG_USE_WATCHDOG_ON_BOOT=y +# CONFIG_GFXUMA is not set +# CONFIG_ACPI_NHLT is not set + +# +# System tables +# +# CONFIG_GENERATE_MP_TABLE is not set +# CONFIG_GENERATE_PIRQ_TABLE is not set +CONFIG_GENERATE_SMBIOS_TABLES=y +# CONFIG_SMBIOS_PROVIDED_BY_MOBO is not set +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +CONFIG_PAYLOAD_ELF=y +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_YABITS is not set +# CONFIG_PAYLOAD_LINUX is not set +# CONFIG_PAYLOAD_TIANOCORE is not set +CONFIG_PAYLOAD_FILE="@CONFIG_PAYLOAD_FILE@" +CONFIG_PAYLOAD_OPTIONS="" +# CONFIG_PXE is not set +# CONFIG_COMPRESSED_PAYLOAD_NONE is not set +CONFIG_COMPRESSED_PAYLOAD_LZMA=y +# CONFIG_COMPRESSED_PAYLOAD_LZ4 is not set +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DEBUG_SMM_RELOCATION is not set + +# +# BLOB Debug Settings +# + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_FATAL_ASSERTS is not set +# CONFIG_DEBUG_CBFS is not set +# CONFIG_HAVE_DEBUG_RAM_SETUP is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_SMI is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_TRACE is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_HAVE_EM100_SUPPORT is not set +CONFIG_WARNINGS_ARE_ERRORS=y +# CONFIG_POWER_BUTTON_DEFAULT_ENABLE is not set +# CONFIG_POWER_BUTTON_DEFAULT_DISABLE is not set +# CONFIG_POWER_BUTTON_FORCE_ENABLE is not set +# CONFIG_POWER_BUTTON_FORCE_DISABLE is not set +# CONFIG_POWER_BUTTON_IS_OPTIONAL is not set +# CONFIG_REG_SCRIPT is not set +CONFIG_MAX_REBOOT_CNT=3 +# CONFIG_NO_XIP_EARLY_STAGES is not set +# CONFIG_EARLY_CBMEM_LIST is not set +CONFIG_RELOCATABLE_MODULES=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/run_coreboot_integration_tests.sh b/run_coreboot_integration_tests.sh new file mode 100755 index 00000000..6d36d90c --- /dev/null +++ b/run_coreboot_integration_tests.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -xeuf + +source "${CARGO_HOME:-$HOME/.cargo}/env" + +rustup component add rust-src +cargo build --release --target target.json -Zbuild-std=core -Zbuild-std-features=compiler-builtins-mem --features "coreboot" + +FW_BIN="$(pwd)/target/target/release/hypervisor-fw" + +CB_DIR="./resources/coreboot" + +CB_VERSION="4.13" +CB_URL="https://github.com/coreboot/coreboot.git" +CB_PATH="$CB_DIR/coreboot" +CB_CONFIG="$CB_DIR/qemu-q35-config.in" +if [ ! -d "$CB_PATH" ]; then + git clone --quiet --branch $CB_VERSION --depth 1 $CB_URL $CB_PATH +fi + +cat $CB_CONFIG | sed -e "s#@CONFIG_PAYLOAD_FILE@#$FW_BIN#g" > "$CB_PATH/.config" +make -C $CB_PATH crossgcc-i386 CPUS="$(nproc)" +make -C $CB_PATH olddefconfig +make -C $CB_PATH -j"$(nproc)" + +bash ./fetch_disk_images.sh + +# Add the user to the kvm group (if not already in it), so they can run VMs +id -nGz "$USER" | grep -qzxF kvm || sudo adduser "$USER" kvm + +newgrp kvm << EOF +export RUST_BACKTRACE=1 +cargo test --features "coreboot integration_tests" -- --test-threads=1 test_boot +EOF diff --git a/run_integration_tests.sh b/run_integration_tests.sh index 3a2482f3..0049ccaf 100755 --- a/run_integration_tests.sh +++ b/run_integration_tests.sh @@ -14,52 +14,7 @@ if [ ! -f "$CH_PATH" ]; then chmod +x $CH_PATH fi -IMAGES_DIR="./resources/images" -mkdir -p "$IMAGES_DIR" - -CLEAR_OS_IMAGE_NAME="clear-31311-cloudguest.img" -CLEAR_OS_IMAGE_URL="https://cloudhypervisorstorage.blob.core.windows.net/images/$CLEAR_OS_IMAGE_NAME" -CLEAR_OS_IMAGE="$IMAGES_DIR/$CLEAR_OS_IMAGE_NAME" -if [ ! -f "$CLEAR_OS_IMAGE" ]; then - pushd $IMAGES_DIR - wget --quiet $CLEAR_OS_IMAGE_URL - popd -fi - -BIONIC_OS_IMAGE_NAME="bionic-server-cloudimg-amd64.img" -BIONIC_OS_IMAGE_URL="https://cloudhypervisorstorage.blob.core.windows.net/images/$BIONIC_OS_IMAGE_NAME" -BIONIC_OS_IMAGE="$IMAGES_DIR/$BIONIC_OS_IMAGE_NAME" -if [ ! -f "$BIONIC_OS_IMAGE" ]; then - pushd $IMAGES_DIR - wget --quiet $BIONIC_OS_IMAGE_URL - popd -fi - -BIONIC_OS_RAW_IMAGE_NAME="bionic-server-cloudimg-amd64-raw.img" -BIONIC_OS_RAW_IMAGE="$IMAGES_DIR/$BIONIC_OS_RAW_IMAGE_NAME" -if [ ! -f "$BIONIC_OS_RAW_IMAGE" ]; then - pushd $IMAGES_DIR - qemu-img convert -p -f qcow2 -O raw $BIONIC_OS_IMAGE_NAME $BIONIC_OS_RAW_IMAGE_NAME - popd -fi - - -FOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64.img" -FOCAL_OS_IMAGE_URL="https://cloudhypervisorstorage.blob.core.windows.net/images/$FOCAL_OS_IMAGE_NAME" -FOCAL_OS_IMAGE="$IMAGES_DIR/$FOCAL_OS_IMAGE_NAME" -if [ ! -f "$FOCAL_OS_IMAGE" ]; then - pushd $IMAGES_DIR - wget --quiet $FOCAL_OS_IMAGE_URL - popd -fi - -FOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-raw.img" -FOCAL_OS_RAW_IMAGE="$IMAGES_DIR/$FOCAL_OS_RAW_IMAGE_NAME" -if [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then - pushd $IMAGES_DIR - qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME - popd -fi +bash ./fetch_disk_images.sh # Add the user to the kvm group (if not already in it), so they can run VMs id -nGz "$USER" | grep -qzxF kvm || sudo adduser "$USER" kvm diff --git a/src/coreboot.rs b/src/coreboot.rs new file mode 100644 index 00000000..6fc285fa --- /dev/null +++ b/src/coreboot.rs @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (C) 2020 Akira Moroo +// Copyright (C) 2009 coresystems GmbH +// Copyright (C) 2008 Advanced Micro Devices, Inc. + +use core::mem::size_of; + +use crate::boot::{E820Entry, Info}; + +#[derive(Debug)] +#[repr(C)] +struct Header { + signature: [u8; 4], + header_bytes: u32, + header_checksum: u32, + table_bytes: u32, + table_checksum: u32, + table_entries: u32, +} + +#[derive(Debug)] +#[repr(C)] +struct Record { + tag: u32, + size: u32, +} + +impl Record { + pub const TAG_FORWARD: u32 = 0x11; + pub const TAG_MEMORY: u32 = 0x01; +} + +#[derive(Debug)] +#[repr(C)] +struct Forward { + tag: u32, + size: u32, + forward: u64, +} + +#[repr(packed, C)] +struct MemMapEntry { + addr: u64, + size: u64, + entry_type: u32, +} + +#[derive(Debug)] +#[repr(C)] +pub struct StartInfo { + rsdp_addr: u64, + memmap_addr: u64, + memmap_entries: usize, +} + +impl Default for StartInfo { + fn default() -> Self { + let (memmap_addr, memmap_entries) = match parse_info(0x0, 0x1000) { + Some((addr, n_entries)) => (addr, n_entries), + None => match parse_info(0xf0000, 0x1000) { + Some((addr, n_entries)) => (addr, n_entries), + None => panic!("coreboot table not found"), + }, + }; + let ebda_addr = unsafe { *(0x40e as *const u16) }; + let rsdp_addr = match find_rsdp(ebda_addr as u64, 0x400) { + Some(addr) => addr, + None => match find_rsdp(0xe0000, 0x20000) { + Some(addr) => addr, + None => panic!("RSDP table not found"), + }, + }; + Self { + rsdp_addr, + memmap_addr, + memmap_entries, + } + } +} + +impl Info for StartInfo { + fn name(&self) -> &str { + "coreboot" + } + fn rsdp_addr(&self) -> u64 { + self.rsdp_addr + } + fn cmdline(&self) -> &[u8] { + b"" + } + fn num_entries(&self) -> u8 { + if self.memmap_addr == 0 { + return 0; + } + self.memmap_entries as u8 + } + fn entry(&self, idx: u8) -> E820Entry { + assert!(idx < self.num_entries()); + let ptr = self.memmap_addr as *const MemMapEntry; + let entry = unsafe { &*ptr.offset(idx as isize) }; + E820Entry { + addr: entry.addr, + size: entry.size, + entry_type: entry.entry_type, + } + } +} + +fn find_header(start: u64, len: usize) -> Option { + const CB_SIGNATURE: u32 = 0x4f49424c; + for addr in (start..(start + len as u64)).step_by(16) { + let val = unsafe { *(addr as *const u32) }; + if val == CB_SIGNATURE { + return Some(addr); + } + } + None +} + +fn find_rsdp(start: u64, len: usize) -> Option { + const RSDP_SIGNATURE: u64 = 0x2052_5450_2044_5352; + for addr in (start..(start + len as u64)).step_by(16) { + let val = unsafe { *(addr as *const u64) }; + if val == RSDP_SIGNATURE { + return Some(addr); + } + } + None +} + +fn parse_info(start: u64, len: usize) -> Option<(u64, usize)> { + let header_addr = match find_header(start, len) { + Some(addr) => addr, + None => { + return None; + } + }; + let header = unsafe { &*(header_addr as *const Header) }; + let ptr = unsafe { (header_addr as *const Header).offset(1) }; + let mut offset = 0; + for _ in 0..header.table_entries { + let rec_ptr = unsafe { (ptr as *const u8).offset(offset as isize) }; + let record = unsafe { &(*(rec_ptr as *const Record)) }; + match record.tag { + Record::TAG_FORWARD => { + let forward = unsafe { &*(rec_ptr as *const Forward) }; + return parse_info(forward.forward, len); + } + Record::TAG_MEMORY => { + return Some(parse_memmap(record)); + } + _ => {} + } + offset += record.size; + } + None +} + +fn parse_memmap(record: &Record) -> (u64, usize) { + assert_eq!(record.tag, Record::TAG_MEMORY); + let n_entries = record.size as usize / size_of::(); + let rec_size = size_of::() as isize; + let rec_ptr = (record as *const Record) as *const u8; + let mem_ptr = unsafe { rec_ptr.offset(rec_size) as *const MemMapEntry }; + (mem_ptr as u64, n_entries) +} diff --git a/src/integration.rs b/src/integration.rs index 5ece2788..8724606f 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -302,15 +302,25 @@ mod tests { .expect("Expect launching Cloud Hypervisor to succeed") } - fn spawn_qemu(os: &str, ci: &str, net: &GuestNetworkConfig) -> Child { + struct Firmware<'a> { + fw_type: &'a str, + path: &'a str, + } + + fn spawn_qemu_common<'a>( + fw: &'a Firmware, + os: &str, + ci: &str, + net: &GuestNetworkConfig, + ) -> Child { let mut c = Command::new("qemu-system-x86_64"); c.args(&[ "-machine", "q35,accel=kvm", "-cpu", "host,-vmx", - "-kernel", - "target/target/release/hypervisor-fw", + fw.fw_type, + fw.path, "-display", "none", "-nodefaults", @@ -339,6 +349,24 @@ mod tests { c.spawn().expect("Expect launching QEMU to succeed") } + #[cfg(not(feature = "coreboot"))] + fn spawn_qemu(os: &str, ci: &str, net: &GuestNetworkConfig) -> Child { + let fw = Firmware { + fw_type: "-kernel", + path: "target/target/release/hypervisor-fw", + }; + spawn_qemu_common(&fw, os, ci, net) + } + + #[cfg(feature = "coreboot")] + fn spawn_qemu(os: &str, ci: &str, net: &GuestNetworkConfig) -> Child { + let fw = Firmware { + fw_type: "-bios", + path: "resources/coreboot/coreboot/build/coreboot.rom", + }; + spawn_qemu_common(&fw, os, ci, net) + } + type HypervisorSpawn = fn(os: &str, ci: &str, net: &GuestNetworkConfig) -> Child; fn test_boot(image_name: &str, cloud_init: &dyn CloudInit, spawn: HypervisorSpawn) { @@ -381,16 +409,19 @@ mod tests { } #[test] + #[cfg(not(feature = "coreboot"))] fn test_boot_ch_bionic() { test_boot(BIONIC_IMAGE_NAME, &UbuntuCloudInit {}, spawn_ch) } #[test] + #[cfg(not(feature = "coreboot"))] fn test_boot_ch_focal() { test_boot(FOCAL_IMAGE_NAME, &UbuntuCloudInit {}, spawn_ch) } #[test] + #[cfg(not(feature = "coreboot"))] fn test_boot_ch_clear() { test_boot(CLEAR_IMAGE_NAME, &ClearCloudInit {}, spawn_ch) } diff --git a/src/main.rs b/src/main.rs index 4b0f4417..c084ec2a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,6 +36,7 @@ mod asm; mod block; mod boot; mod bzimage; +mod coreboot; mod efi; mod fat; mod gdt; @@ -141,17 +142,32 @@ fn boot_from_device(device: &mut block::VirtioBlockDevice, info: &dyn boot::Info } #[no_mangle] +#[cfg(not(feature = "coreboot"))] pub extern "C" fn rust64_start(rdi: &pvh::StartInfo) -> ! { + serial::PORT.borrow_mut().init(); + + enable_sse(); + paging::setup(); + main(rdi) } -fn main(info: &dyn boot::Info) -> ! { +#[no_mangle] +#[cfg(feature = "coreboot")] +pub extern "C" fn rust64_start() -> ! { serial::PORT.borrow_mut().init(); - log!("\nBooting with {}", info.name()); enable_sse(); paging::setup(); + let info = coreboot::StartInfo::default(); + + main(&info) +} + +fn main(info: &dyn boot::Info) -> ! { + log!("\nBooting with {}", info.name()); + pci::print_bus(); pci::with_devices(