mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'hw-misc-20240309' of https://github.com/philmd/qemu into staging
Misc HW patch queue - hmp: Shorter 'info qtree' output (Zoltan) - qdev: Add a granule_mode property (Eric) - Some ERRP_GUARD() fixes (Zhao) - Doc & style fixes in docs/interop/firmware.json (Thomas) - hw/xen: Housekeeping (Phil) - hw/ppc/mac99: Change timebase frequency 25 -> 100 MHz (Mark) - hw/intc/apic: Memory leak fix (Paolo) - hw/intc/grlib_irqmp: Ensure ncpus value is in range (Clément) - hw/m68k/mcf5208: Add support for reset (Angelo) - hw/i386/pc: Housekeeping (Phil) - hw/core/smp: Remove/deprecate parameter=0,1 adapting test-smp-parse (Zhao) # -----BEGIN PGP SIGNATURE----- # # iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmXstpMACgkQ4+MsLN6t # wN6XBw//dNItFhf1YX+Au4cNoQVDgHE9RtzEIGOnwcL1CgrA9rAQQfLRE5KWM6sN # 1qiPh+T6SPxtiQ2rw4AIpsI7TXjO72b/RDWpUUSwnfH39eC77pijkxIK+i9mYI9r # p0sPjuP6OfolUFYeSbYX+DmNZh1ONPf27JATJQEf0st8dyswn7lTQvJEaQ97kwxv # UKA0JD5l9LZV8Zr92cgCzlrfLcbVblJGux9GYIL09yN78yqBuvTm77GBC/rvC+5Q # fQC5PQswJZ0+v32AXIfSysMp2R6veo4By7VH9Lp51E/u9jpc4ZbcDzxzaJWE6zOR # fZ01nFzou1qtUfZi+MxNiDR96LP6YoT9xFdGYfNS6AowZn8kymCs3eo7M9uvb+rN # A2Sgis9rXcjsR4e+w1YPBXwpalJnLwB0QYhEOStR8wo1ceg7GBG6zHUJV89OGzsA # KS8X0aV1Ulkdm/2H6goEhzrcC6FWLg8pBJpfKK8JFWxXNrj661xM0AAFVL9we356 # +ymthS2x/RTABSI+1Lfsoo6/SyXoimFXJJWA82q9Yzoaoq2gGMWnfwqxfix6JrrA # PuMnNP5WNvh04iWcNz380P0psLVteHWcVfTRN3JvcJ9iJ2bpjcU1mQMJtvSF9wBn # Y8kiJTUmZCu3br2e5EfxmypM/h8y29VD/1mxPk8Dtcq3gjx9AU4= # =juZH # -----END PGP SIGNATURE----- # gpg: Signature made Sat 09 Mar 2024 19:20:51 GMT # gpg: using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE # gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [full] # Primary key fingerprint: FAAB E75E 1291 7221 DCFD 6BB2 E3E3 2C2C DEAD C0DE * tag 'hw-misc-20240309' of https://github.com/philmd/qemu: (43 commits) hw/m68k/mcf5208: add support for reset tests/unit/test-smp-parse: Test "parameter=0" SMP configurations tests/unit/test-smp-parse: Test smp_props.has_clusters tests/unit/test-smp-parse: Test the full 7-levels topology hierarchy tests/unit/test-smp-parse: Test "drawers" and "books" combination case tests/unit/test-smp-parse: Test "drawers" parameter in -smp tests/unit/test-smp-parse: Test "books" parameter in -smp tests/unit/test-smp-parse: Make test cases aware of the book/drawer tests/unit/test-smp-parse: Bump max_cpus to 4096 tests/unit/test-smp-parse: Use CPU number macros in invalid topology case tests/unit/test-smp-parse: Drop the unsupported "dies=1" case hw/core/machine-smp: Calculate total CPUs once in machine_parse_smp_config() hw/core/machine-smp: Deprecate unsupported "parameter=1" SMP configurations hw/core/machine-smp: Remove deprecated "parameter=0" SMP configurations docs/interop/firmware.json: Fix doc for FirmwareFlashMode docs/interop/firmware.json: Align examples hw/intc/grlib_irqmp: abort realize when ncpus value is out of range mac_newworld: change timebase frequency from 100MHz to 25MHz for mac99 machine hmp: Add option to info qtree to omit details qdev: Add a granule_mode property ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "hw/xen/xen_native.h"
|
||||
#include "hw/xen/xen-legacy-backend.h"
|
||||
#include "hw/xen/xen_pt.h"
|
||||
#include "hw/xen/xen_igd.h"
|
||||
#include "chardev/char.h"
|
||||
#include "qemu/accel.h"
|
||||
#include "sysemu/cpus.h"
|
||||
|
||||
+14
-16
@@ -36,22 +36,6 @@ and will cause a warning.
|
||||
The replacement for the ``nodelay`` short-form boolean option is ``nodelay=on``
|
||||
rather than ``delay=off``.
|
||||
|
||||
``-smp`` ("parameter=0" SMP configurations) (since 6.2)
|
||||
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
Specified CPU topology parameters must be greater than zero.
|
||||
|
||||
In the SMP configuration, users should either provide a CPU topology
|
||||
parameter with a reasonable value (greater than zero) or just omit it
|
||||
and QEMU will compute the missing value.
|
||||
|
||||
However, historically it was implicitly allowed for users to provide
|
||||
a parameter with zero value, which is meaningless and could also possibly
|
||||
cause unexpected results in the -smp parsing. So support for this kind of
|
||||
configurations (e.g. -smp 8,sockets=0) is deprecated since 6.2 and will
|
||||
be removed in the near future, users have to ensure that all the topology
|
||||
members described with -smp are greater than zero.
|
||||
|
||||
Plugin argument passing through ``arg=<string>`` (since 6.1)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
@@ -73,6 +57,20 @@ The ``-p`` option pretends to control the host page size. However,
|
||||
it is not possible to change the host page size, and using the
|
||||
option only causes failures.
|
||||
|
||||
``-smp`` (Unsupported "parameter=1" SMP configurations) (since 9.0)
|
||||
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
Specified CPU topology parameters must be supported by the machine.
|
||||
|
||||
In the SMP configuration, users should provide the CPU topology parameters that
|
||||
are supported by the target machine.
|
||||
|
||||
However, historically it was allowed for users to specify the unsupported
|
||||
topology parameter as "1", which is meaningless. So support for this kind of
|
||||
configurations (e.g. -smp drawers=1,books=1,clusters=1 for x86 PC machine) is
|
||||
marked deprecated since 9.0, users have to ensure that all the topology members
|
||||
described with -smp are supported by the target machine.
|
||||
|
||||
QEMU Machine Protocol (QMP) commands
|
||||
------------------------------------
|
||||
|
||||
|
||||
@@ -489,6 +489,21 @@ The ``-singlestep`` option has been turned into an accelerator property,
|
||||
and given a name that better reflects what it actually does.
|
||||
Use ``-accel tcg,one-insn-per-tb=on`` instead.
|
||||
|
||||
``-smp`` ("parameter=0" SMP configurations) (removed in 9.0)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
Specified CPU topology parameters must be greater than zero.
|
||||
|
||||
In the SMP configuration, users should either provide a CPU topology
|
||||
parameter with a reasonable value (greater than zero) or just omit it
|
||||
and QEMU will compute the missing value.
|
||||
|
||||
However, historically it was implicitly allowed for users to provide
|
||||
a parameter with zero value, which is meaningless and could also possibly
|
||||
cause unexpected results in the -smp parsing. So support for this kind of
|
||||
configurations (e.g. -smp 8,sockets=0) is removed since 9.0, users have
|
||||
to ensure that all the topology members described with -smp are greater
|
||||
than zero.
|
||||
|
||||
User-mode emulator command line arguments
|
||||
-----------------------------------------
|
||||
|
||||
+188
-188
@@ -223,7 +223,7 @@
|
||||
|
||||
|
||||
##
|
||||
# @FirmwareFlashType:
|
||||
# @FirmwareFlashMode:
|
||||
#
|
||||
# Describes how the firmware build handles code versus variable
|
||||
# persistence.
|
||||
@@ -435,203 +435,203 @@
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# {
|
||||
# "description": "SeaBIOS",
|
||||
# "interface-types": [
|
||||
# "bios"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "memory",
|
||||
# "filename": "/usr/share/seabios/bios-256k.bin"
|
||||
# },
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "i386",
|
||||
# "machines": [
|
||||
# "pc-i440fx-*",
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# {
|
||||
# "description": "SeaBIOS",
|
||||
# "interface-types": [
|
||||
# "bios"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "memory",
|
||||
# "filename": "/usr/share/seabios/bios-256k.bin"
|
||||
# },
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-i440fx-*",
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "acpi-s4"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "CONFIG_BOOTSPLASH=n",
|
||||
# "CONFIG_ROM_SIZE=256",
|
||||
# "CONFIG_USE_SMM=n"
|
||||
# ]
|
||||
# }
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "i386",
|
||||
# "machines": [
|
||||
# "pc-i440fx-*",
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# },
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-i440fx-*",
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "acpi-s4"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "CONFIG_BOOTSPLASH=n",
|
||||
# "CONFIG_ROM_SIZE=256",
|
||||
# "CONFIG_USE_SMM=n"
|
||||
# ]
|
||||
# }
|
||||
#
|
||||
# {
|
||||
# "description": "OVMF with SB+SMM, empty varstore",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
|
||||
# "format": "raw"
|
||||
# {
|
||||
# "description": "OVMF with SB+SMM, empty varstore",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
|
||||
# "format": "raw"
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_VARS.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_VARS.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "amd-sev",
|
||||
# "requires-smm",
|
||||
# "secure-boot",
|
||||
# "verbose-dynamic"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a IA32",
|
||||
# "-a X64",
|
||||
# "-p OvmfPkg/OvmfPkgIa32X64.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D SMM_REQUIRE",
|
||||
# "-D SECURE_BOOT_ENABLE",
|
||||
# "-D FD_SIZE_4MB"
|
||||
# ]
|
||||
# }
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "amd-sev",
|
||||
# "requires-smm",
|
||||
# "secure-boot",
|
||||
# "verbose-dynamic"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a IA32",
|
||||
# "-a X64",
|
||||
# "-p OvmfPkg/OvmfPkgIa32X64.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D SMM_REQUIRE",
|
||||
# "-D SECURE_BOOT_ENABLE",
|
||||
# "-D FD_SIZE_4MB"
|
||||
# ]
|
||||
# }
|
||||
#
|
||||
# {
|
||||
# "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
|
||||
# "format": "raw"
|
||||
# {
|
||||
# "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
|
||||
# "format": "raw"
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_VARS.secboot.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_VARS.secboot.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "amd-sev",
|
||||
# "enrolled-keys",
|
||||
# "requires-smm",
|
||||
# "secure-boot",
|
||||
# "verbose-dynamic"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a IA32",
|
||||
# "-a X64",
|
||||
# "-p OvmfPkg/OvmfPkgIa32X64.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D SMM_REQUIRE",
|
||||
# "-D SECURE_BOOT_ENABLE",
|
||||
# "-D FD_SIZE_4MB"
|
||||
# ]
|
||||
# }
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "amd-sev",
|
||||
# "enrolled-keys",
|
||||
# "requires-smm",
|
||||
# "secure-boot",
|
||||
# "verbose-dynamic"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a IA32",
|
||||
# "-a X64",
|
||||
# "-p OvmfPkg/OvmfPkgIa32X64.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D SMM_REQUIRE",
|
||||
# "-D SECURE_BOOT_ENABLE",
|
||||
# "-D FD_SIZE_4MB"
|
||||
# ]
|
||||
# }
|
||||
#
|
||||
# {
|
||||
# "description": "OVMF with SEV-ES support",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_CODE.fd",
|
||||
# "format": "raw"
|
||||
# {
|
||||
# "description": "OVMF with SEV-ES support",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_CODE.fd",
|
||||
# "format": "raw"
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_VARS.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/OVMF/OVMF_VARS.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "amd-sev",
|
||||
# "amd-sev-es",
|
||||
# "verbose-dynamic"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a X64",
|
||||
# "-p OvmfPkg/OvmfPkgX64.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D FD_SIZE_4MB"
|
||||
# ]
|
||||
# }
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "x86_64",
|
||||
# "machines": [
|
||||
# "pc-q35-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "acpi-s3",
|
||||
# "amd-sev",
|
||||
# "amd-sev-es",
|
||||
# "verbose-dynamic"
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a X64",
|
||||
# "-p OvmfPkg/OvmfPkgX64.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D FD_SIZE_4MB"
|
||||
# ]
|
||||
# }
|
||||
#
|
||||
# {
|
||||
# "description": "UEFI firmware for ARM64 virtual machines",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/AAVMF/AAVMF_CODE.fd",
|
||||
# "format": "raw"
|
||||
# {
|
||||
# "description": "UEFI firmware for ARM64 virtual machines",
|
||||
# "interface-types": [
|
||||
# "uefi"
|
||||
# ],
|
||||
# "mapping": {
|
||||
# "device": "flash",
|
||||
# "executable": {
|
||||
# "filename": "/usr/share/AAVMF/AAVMF_CODE.fd",
|
||||
# "format": "raw"
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/AAVMF/AAVMF_VARS.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "nvram-template": {
|
||||
# "filename": "/usr/share/AAVMF/AAVMF_VARS.fd",
|
||||
# "format": "raw"
|
||||
# }
|
||||
# },
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "aarch64",
|
||||
# "machines": [
|
||||
# "virt-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
# "targets": [
|
||||
# {
|
||||
# "architecture": "aarch64",
|
||||
# "machines": [
|
||||
# "virt-*"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "features": [
|
||||
#
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a AARCH64",
|
||||
# "-p ArmVirtPkg/ArmVirtQemu.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D DEBUG_PRINT_ERROR_LEVEL=0x80000000"
|
||||
# ]
|
||||
# }
|
||||
# ],
|
||||
# "tags": [
|
||||
# "-a AARCH64",
|
||||
# "-p ArmVirtPkg/ArmVirtQemu.dsc",
|
||||
# "-t GCC48",
|
||||
# "-b DEBUG",
|
||||
# "-D DEBUG_PRINT_ERROR_LEVEL=0x80000000"
|
||||
# ]
|
||||
# }
|
||||
##
|
||||
{ 'struct' : 'Firmware',
|
||||
'data' : { 'description' : 'str',
|
||||
|
||||
@@ -540,9 +540,9 @@ ERST
|
||||
|
||||
{
|
||||
.name = "qtree",
|
||||
.args_type = "",
|
||||
.params = "",
|
||||
.help = "show device tree",
|
||||
.args_type = "brief:-b",
|
||||
.params = "[-b]",
|
||||
.help = "show device tree (-b: brief, omit properties)",
|
||||
.cmd = hmp_info_qtree,
|
||||
},
|
||||
|
||||
|
||||
+3
-3
@@ -114,14 +114,14 @@ static void xen_init_ram(MachineState *machine)
|
||||
block_len = GUEST_RAM1_BASE + ram_size[1];
|
||||
}
|
||||
|
||||
memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
|
||||
memory_region_init_ram(&xen_memory, NULL, "xen.ram", block_len,
|
||||
&error_fatal);
|
||||
|
||||
memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo", &ram_memory,
|
||||
memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo", &xen_memory,
|
||||
GUEST_RAM0_BASE, ram_size[0]);
|
||||
memory_region_add_subregion(sysmem, GUEST_RAM0_BASE, &ram_lo);
|
||||
if (ram_size[1] > 0) {
|
||||
memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi", &ram_memory,
|
||||
memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi", &xen_memory,
|
||||
GUEST_RAM1_BASE, ram_size[1]);
|
||||
memory_region_add_subregion(sysmem, GUEST_RAM1_BASE, &ram_hi);
|
||||
}
|
||||
|
||||
@@ -206,6 +206,7 @@ static bool con_event(void *_xendev)
|
||||
|
||||
static bool xen_console_connect(XenDevice *xendev, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
XenConsole *con = XEN_CONSOLE_DEVICE(xendev);
|
||||
unsigned int port, limit;
|
||||
|
||||
|
||||
+55
-23
@@ -91,6 +91,7 @@ void machine_parse_smp_config(MachineState *ms,
|
||||
unsigned cores = config->has_cores ? config->cores : 0;
|
||||
unsigned threads = config->has_threads ? config->threads : 0;
|
||||
unsigned maxcpus = config->has_maxcpus ? config->maxcpus : 0;
|
||||
unsigned total_cpus;
|
||||
|
||||
/*
|
||||
* Specified CPU topology parameters must be greater than zero,
|
||||
@@ -105,36 +106,68 @@ void machine_parse_smp_config(MachineState *ms,
|
||||
(config->has_cores && config->cores == 0) ||
|
||||
(config->has_threads && config->threads == 0) ||
|
||||
(config->has_maxcpus && config->maxcpus == 0)) {
|
||||
warn_report("Deprecated CPU topology (considered invalid): "
|
||||
"CPU topology parameters must be greater than zero");
|
||||
error_setg(errp, "Invalid CPU topology: "
|
||||
"CPU topology parameters must be greater than zero");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If not supported by the machine, a topology parameter must be
|
||||
* omitted or specified equal to 1.
|
||||
* omitted.
|
||||
*/
|
||||
if (!mc->smp_props.dies_supported && dies > 1) {
|
||||
error_setg(errp, "dies not supported by this machine's CPU topology");
|
||||
return;
|
||||
if (!mc->smp_props.clusters_supported && config->has_clusters) {
|
||||
if (config->clusters > 1) {
|
||||
error_setg(errp, "clusters not supported by this "
|
||||
"machine's CPU topology");
|
||||
return;
|
||||
} else {
|
||||
/* Here clusters only equals 1 since we've checked zero case. */
|
||||
warn_report("Deprecated CPU topology (considered invalid): "
|
||||
"Unsupported clusters parameter mustn't be "
|
||||
"specified as 1");
|
||||
}
|
||||
}
|
||||
if (!mc->smp_props.clusters_supported && clusters > 1) {
|
||||
error_setg(errp, "clusters not supported by this machine's CPU topology");
|
||||
return;
|
||||
}
|
||||
|
||||
dies = dies > 0 ? dies : 1;
|
||||
clusters = clusters > 0 ? clusters : 1;
|
||||
|
||||
if (!mc->smp_props.books_supported && books > 1) {
|
||||
error_setg(errp, "books not supported by this machine's CPU topology");
|
||||
return;
|
||||
if (!mc->smp_props.dies_supported && config->has_dies) {
|
||||
if (config->dies > 1) {
|
||||
error_setg(errp, "dies not supported by this "
|
||||
"machine's CPU topology");
|
||||
return;
|
||||
} else {
|
||||
/* Here dies only equals 1 since we've checked zero case. */
|
||||
warn_report("Deprecated CPU topology (considered invalid): "
|
||||
"Unsupported dies parameter mustn't be "
|
||||
"specified as 1");
|
||||
}
|
||||
}
|
||||
dies = dies > 0 ? dies : 1;
|
||||
|
||||
if (!mc->smp_props.books_supported && config->has_books) {
|
||||
if (config->books > 1) {
|
||||
error_setg(errp, "books not supported by this "
|
||||
"machine's CPU topology");
|
||||
return;
|
||||
} else {
|
||||
/* Here books only equals 1 since we've checked zero case. */
|
||||
warn_report("Deprecated CPU topology (considered invalid): "
|
||||
"Unsupported books parameter mustn't be "
|
||||
"specified as 1");
|
||||
}
|
||||
}
|
||||
books = books > 0 ? books : 1;
|
||||
|
||||
if (!mc->smp_props.drawers_supported && drawers > 1) {
|
||||
error_setg(errp,
|
||||
"drawers not supported by this machine's CPU topology");
|
||||
return;
|
||||
if (!mc->smp_props.drawers_supported && config->has_drawers) {
|
||||
if (config->drawers > 1) {
|
||||
error_setg(errp, "drawers not supported by this "
|
||||
"machine's CPU topology");
|
||||
return;
|
||||
} else {
|
||||
/* Here drawers only equals 1 since we've checked zero case. */
|
||||
warn_report("Deprecated CPU topology (considered invalid): "
|
||||
"Unsupported drawers parameter mustn't be "
|
||||
"specified as 1");
|
||||
}
|
||||
}
|
||||
drawers = drawers > 0 ? drawers : 1;
|
||||
|
||||
@@ -179,8 +212,8 @@ void machine_parse_smp_config(MachineState *ms,
|
||||
}
|
||||
}
|
||||
|
||||
maxcpus = maxcpus > 0 ? maxcpus : drawers * books * sockets * dies *
|
||||
clusters * cores * threads;
|
||||
total_cpus = drawers * books * sockets * dies * clusters * cores * threads;
|
||||
maxcpus = maxcpus > 0 ? maxcpus : total_cpus;
|
||||
cpus = cpus > 0 ? cpus : maxcpus;
|
||||
|
||||
ms->smp.cpus = cpus;
|
||||
@@ -196,8 +229,7 @@ void machine_parse_smp_config(MachineState *ms,
|
||||
mc->smp_props.has_clusters = config->has_clusters;
|
||||
|
||||
/* sanity-check of the computed topology */
|
||||
if (drawers * books * sockets * dies * clusters * cores * threads !=
|
||||
maxcpus) {
|
||||
if (total_cpus != maxcpus) {
|
||||
g_autofree char *topo_msg = cpu_hierarchy_to_string(ms);
|
||||
error_setg(errp, "Invalid CPU topology: "
|
||||
"product of the hierarchy must match maxcpus: "
|
||||
|
||||
@@ -679,6 +679,20 @@ const PropertyInfo qdev_prop_mig_mode = {
|
||||
.set_default_value = qdev_propinfo_set_default_value_enum,
|
||||
};
|
||||
|
||||
/* --- GranuleMode --- */
|
||||
|
||||
QEMU_BUILD_BUG_ON(sizeof(GranuleMode) != sizeof(int));
|
||||
|
||||
const PropertyInfo qdev_prop_granule_mode = {
|
||||
.name = "GranuleMode",
|
||||
.description = "granule_mode values, "
|
||||
"4k, 8k, 16k, 64k, host",
|
||||
.enum_table = &GranuleMode_lookup,
|
||||
.get = qdev_propinfo_get_enum,
|
||||
.set = qdev_propinfo_set_enum,
|
||||
.set_default_value = qdev_propinfo_set_default_value_enum,
|
||||
};
|
||||
|
||||
/* --- Reserved Region --- */
|
||||
|
||||
/*
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
i386_ss = ss.source_set()
|
||||
i386_ss.add(files(
|
||||
'fw_cfg.c',
|
||||
'kvmvapic.c',
|
||||
'vapic.c',
|
||||
'e820_memory_layout.c',
|
||||
'multiboot.c',
|
||||
'x86.c',
|
||||
|
||||
+7
-12
@@ -55,11 +55,13 @@
|
||||
#ifdef CONFIG_XEN
|
||||
#include <xen/hvm/hvm_info_table.h>
|
||||
#include "hw/xen/xen_pt.h"
|
||||
#include "hw/xen/xen_igd.h"
|
||||
#endif
|
||||
#include "hw/xen/xen-x86.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "migration/global_state.h"
|
||||
#include "migration/misc.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "sysemu/numa.h"
|
||||
#include "hw/hyperv/vmbus-bridge.h"
|
||||
#include "hw/mem/nvdimm.h"
|
||||
@@ -99,8 +101,7 @@ static void piix_intx_routing_notifier_xen(PCIDevice *dev)
|
||||
}
|
||||
|
||||
/* PC hardware initialisation */
|
||||
static void pc_init1(MachineState *machine,
|
||||
const char *host_type, const char *pci_type)
|
||||
static void pc_init1(MachineState *machine, const char *pci_type)
|
||||
{
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
|
||||
@@ -192,7 +193,7 @@ static void pc_init1(MachineState *machine,
|
||||
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
|
||||
rom_memory = pci_memory;
|
||||
|
||||
phb = OBJECT(qdev_new(host_type));
|
||||
phb = OBJECT(qdev_new(TYPE_I440FX_PCI_HOST_BRIDGE));
|
||||
object_property_add_child(OBJECT(machine), "i440fx", phb);
|
||||
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
|
||||
OBJECT(ram_memory), &error_fatal);
|
||||
@@ -382,9 +383,6 @@ static const QEnumLookup PCSouthBridgeOption_lookup = {
|
||||
.size = PC_SOUTH_BRIDGE_OPTION_MAX
|
||||
};
|
||||
|
||||
#define NotifyVmexitOption_str(val) \
|
||||
qapi_enum_lookup(&NotifyVmexitOption_lookup, (val))
|
||||
|
||||
static int pc_get_south_bridge(Object *obj, Error **errp)
|
||||
{
|
||||
PCMachineState *pcms = PC_MACHINE(obj);
|
||||
@@ -452,7 +450,7 @@ static void pc_compat_2_0_fn(MachineState *machine)
|
||||
#ifdef CONFIG_ISAPC
|
||||
static void pc_init_isa(MachineState *machine)
|
||||
{
|
||||
pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
|
||||
pc_init1(machine, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -462,9 +460,7 @@ static void pc_xen_hvm_init_pci(MachineState *machine)
|
||||
const char *pci_type = xen_igd_gfx_pt_enabled() ?
|
||||
TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE : TYPE_I440FX_PCI_DEVICE;
|
||||
|
||||
pc_init1(machine,
|
||||
TYPE_I440FX_PCI_HOST_BRIDGE,
|
||||
pci_type);
|
||||
pc_init1(machine, pci_type);
|
||||
}
|
||||
|
||||
static void pc_xen_hvm_init(MachineState *machine)
|
||||
@@ -489,8 +485,7 @@ static void pc_xen_hvm_init(MachineState *machine)
|
||||
if (compat) { \
|
||||
compat(machine); \
|
||||
} \
|
||||
pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
|
||||
TYPE_I440FX_PCI_DEVICE); \
|
||||
pc_init1(machine, TYPE_I440FX_PCI_DEVICE); \
|
||||
} \
|
||||
DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
|
||||
|
||||
|
||||
@@ -747,8 +747,7 @@ static void do_vapic_enable(CPUState *cs, run_on_cpu_data data)
|
||||
s->state = VAPIC_ACTIVE;
|
||||
}
|
||||
|
||||
static void kvmvapic_vm_state_change(void *opaque, bool running,
|
||||
RunState state)
|
||||
static void vapic_vm_state_change(void *opaque, bool running, RunState state)
|
||||
{
|
||||
MachineState *ms = MACHINE(qdev_get_machine());
|
||||
VAPICROMState *s = opaque;
|
||||
@@ -793,7 +792,7 @@ static int vapic_post_load(void *opaque, int version_id)
|
||||
|
||||
if (!s->vmsentry) {
|
||||
s->vmsentry =
|
||||
qemu_add_vm_change_state_handler(kvmvapic_vm_state_change, s);
|
||||
qemu_add_vm_change_state_handler(vapic_vm_state_change, s);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
i386_ss.add(when: 'CONFIG_XEN', if_true: files(
|
||||
'xen-hvm.c',
|
||||
'xen_apic.c',
|
||||
'xen_pvdevice.c',
|
||||
))
|
||||
i386_ss.add(when: ['CONFIG_XEN', xen], if_true: files(
|
||||
'xen-hvm.c',
|
||||
))
|
||||
|
||||
i386_ss.add(when: 'CONFIG_XEN_BUS', if_true: files(
|
||||
'xen_platform.c',
|
||||
|
||||
+50
-32
@@ -23,6 +23,7 @@
|
||||
#include "hw/xen/xen-hvm-common.h"
|
||||
#include "hw/xen/arch_hvm.h"
|
||||
#include <xen/hvm/e820.h>
|
||||
#include "exec/target_page.h"
|
||||
|
||||
static MemoryRegion ram_640k, ram_lo, ram_hi;
|
||||
static MemoryRegion *framebuffer;
|
||||
@@ -149,12 +150,12 @@ static void xen_ram_init(PCMachineState *pcms,
|
||||
*/
|
||||
block_len = (4 * GiB) + x86ms->above_4g_mem_size;
|
||||
}
|
||||
memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
|
||||
memory_region_init_ram(&xen_memory, NULL, "xen.ram", block_len,
|
||||
&error_fatal);
|
||||
*ram_memory_p = &ram_memory;
|
||||
*ram_memory_p = &xen_memory;
|
||||
|
||||
memory_region_init_alias(&ram_640k, NULL, "xen.ram.640k",
|
||||
&ram_memory, 0, 0xa0000);
|
||||
&xen_memory, 0, 0xa0000);
|
||||
memory_region_add_subregion(sysmem, 0, &ram_640k);
|
||||
/* Skip of the VGA IO memory space, it will be registered later by the VGA
|
||||
* emulated device.
|
||||
@@ -163,22 +164,23 @@ static void xen_ram_init(PCMachineState *pcms,
|
||||
* the Options ROM, so it is registered here as RAM.
|
||||
*/
|
||||
memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo",
|
||||
&ram_memory, 0xc0000,
|
||||
&xen_memory, 0xc0000,
|
||||
x86ms->below_4g_mem_size - 0xc0000);
|
||||
memory_region_add_subregion(sysmem, 0xc0000, &ram_lo);
|
||||
if (x86ms->above_4g_mem_size > 0) {
|
||||
memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi",
|
||||
&ram_memory, 0x100000000ULL,
|
||||
&xen_memory, 0x100000000ULL,
|
||||
x86ms->above_4g_mem_size);
|
||||
memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi);
|
||||
}
|
||||
}
|
||||
|
||||
static XenPhysmap *get_physmapping(hwaddr start_addr, ram_addr_t size)
|
||||
static XenPhysmap *get_physmapping(hwaddr start_addr, ram_addr_t size,
|
||||
int page_mask)
|
||||
{
|
||||
XenPhysmap *physmap = NULL;
|
||||
|
||||
start_addr &= TARGET_PAGE_MASK;
|
||||
start_addr &= page_mask;
|
||||
|
||||
QLIST_FOREACH(physmap, &xen_physmap, list) {
|
||||
if (range_covers_byte(physmap->start_addr, physmap->size, start_addr)) {
|
||||
@@ -188,9 +190,10 @@ static XenPhysmap *get_physmapping(hwaddr start_addr, ram_addr_t size)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static hwaddr xen_phys_offset_to_gaddr(hwaddr phys_offset, ram_addr_t size)
|
||||
static hwaddr xen_phys_offset_to_gaddr(hwaddr phys_offset, ram_addr_t size,
|
||||
int page_mask)
|
||||
{
|
||||
hwaddr addr = phys_offset & TARGET_PAGE_MASK;
|
||||
hwaddr addr = phys_offset & page_mask;
|
||||
XenPhysmap *physmap = NULL;
|
||||
|
||||
QLIST_FOREACH(physmap, &xen_physmap, list) {
|
||||
@@ -245,6 +248,9 @@ static int xen_add_to_physmap(XenIOState *state,
|
||||
MemoryRegion *mr,
|
||||
hwaddr offset_within_region)
|
||||
{
|
||||
unsigned target_page_bits = qemu_target_page_bits();
|
||||
int page_size = qemu_target_page_size();
|
||||
int page_mask = -page_size;
|
||||
unsigned long nr_pages;
|
||||
int rc = 0;
|
||||
XenPhysmap *physmap = NULL;
|
||||
@@ -252,7 +258,7 @@ static int xen_add_to_physmap(XenIOState *state,
|
||||
hwaddr phys_offset = memory_region_get_ram_addr(mr);
|
||||
const char *mr_name;
|
||||
|
||||
if (get_physmapping(start_addr, size)) {
|
||||
if (get_physmapping(start_addr, size, page_mask)) {
|
||||
return 0;
|
||||
}
|
||||
if (size <= 0) {
|
||||
@@ -292,9 +298,9 @@ go_physmap:
|
||||
return 0;
|
||||
}
|
||||
|
||||
pfn = phys_offset >> TARGET_PAGE_BITS;
|
||||
start_gpfn = start_addr >> TARGET_PAGE_BITS;
|
||||
nr_pages = size >> TARGET_PAGE_BITS;
|
||||
pfn = phys_offset >> target_page_bits;
|
||||
start_gpfn = start_addr >> target_page_bits;
|
||||
nr_pages = size >> target_page_bits;
|
||||
rc = xendevicemodel_relocate_memory(xen_dmod, xen_domid, nr_pages, pfn,
|
||||
start_gpfn);
|
||||
if (rc) {
|
||||
@@ -308,8 +314,8 @@ go_physmap:
|
||||
}
|
||||
|
||||
rc = xendevicemodel_pin_memory_cacheattr(xen_dmod, xen_domid,
|
||||
start_addr >> TARGET_PAGE_BITS,
|
||||
(start_addr + size - 1) >> TARGET_PAGE_BITS,
|
||||
start_addr >> target_page_bits,
|
||||
(start_addr + size - 1) >> target_page_bits,
|
||||
XEN_DOMCTL_MEM_CACHEATTR_WB);
|
||||
if (rc) {
|
||||
error_report("pin_memory_cacheattr failed: %s", strerror(errno));
|
||||
@@ -321,11 +327,14 @@ static int xen_remove_from_physmap(XenIOState *state,
|
||||
hwaddr start_addr,
|
||||
ram_addr_t size)
|
||||
{
|
||||
unsigned target_page_bits = qemu_target_page_bits();
|
||||
int page_size = qemu_target_page_size();
|
||||
int page_mask = -page_size;
|
||||
int rc = 0;
|
||||
XenPhysmap *physmap = NULL;
|
||||
hwaddr phys_offset = 0;
|
||||
|
||||
physmap = get_physmapping(start_addr, size);
|
||||
physmap = get_physmapping(start_addr, size, page_mask);
|
||||
if (physmap == NULL) {
|
||||
return -1;
|
||||
}
|
||||
@@ -336,9 +345,9 @@ static int xen_remove_from_physmap(XenIOState *state,
|
||||
DPRINTF("unmapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx", at "
|
||||
"%"HWADDR_PRIx"\n", start_addr, start_addr + size, phys_offset);
|
||||
|
||||
size >>= TARGET_PAGE_BITS;
|
||||
start_addr >>= TARGET_PAGE_BITS;
|
||||
phys_offset >>= TARGET_PAGE_BITS;
|
||||
size >>= target_page_bits;
|
||||
start_addr >>= target_page_bits;
|
||||
phys_offset >>= target_page_bits;
|
||||
rc = xendevicemodel_relocate_memory(xen_dmod, xen_domid, size, start_addr,
|
||||
phys_offset);
|
||||
if (rc) {
|
||||
@@ -367,13 +376,16 @@ static void xen_sync_dirty_bitmap(XenIOState *state,
|
||||
hwaddr start_addr,
|
||||
ram_addr_t size)
|
||||
{
|
||||
hwaddr npages = size >> TARGET_PAGE_BITS;
|
||||
unsigned target_page_bits = qemu_target_page_bits();
|
||||
int page_size = qemu_target_page_size();
|
||||
int page_mask = -page_size;
|
||||
hwaddr npages = size >> target_page_bits;
|
||||
const int width = sizeof(unsigned long) * 8;
|
||||
size_t bitmap_size = DIV_ROUND_UP(npages, width);
|
||||
int rc, i, j;
|
||||
const XenPhysmap *physmap = NULL;
|
||||
|
||||
physmap = get_physmapping(start_addr, size);
|
||||
physmap = get_physmapping(start_addr, size, page_mask);
|
||||
if (physmap == NULL) {
|
||||
/* not handled */
|
||||
return;
|
||||
@@ -387,7 +399,7 @@ static void xen_sync_dirty_bitmap(XenIOState *state,
|
||||
return;
|
||||
}
|
||||
|
||||
rc = xen_track_dirty_vram(xen_domid, start_addr >> TARGET_PAGE_BITS,
|
||||
rc = xen_track_dirty_vram(xen_domid, start_addr >> target_page_bits,
|
||||
npages, dirty_bitmap);
|
||||
if (rc < 0) {
|
||||
#ifndef ENODATA
|
||||
@@ -408,8 +420,7 @@ static void xen_sync_dirty_bitmap(XenIOState *state,
|
||||
j = ctzl(map);
|
||||
map &= ~(1ul << j);
|
||||
memory_region_set_dirty(framebuffer,
|
||||
(i * width + j) * TARGET_PAGE_SIZE,
|
||||
TARGET_PAGE_SIZE);
|
||||
(i * width + j) * page_size, page_size);
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -629,17 +640,21 @@ void xen_register_framebuffer(MemoryRegion *mr)
|
||||
|
||||
void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length)
|
||||
{
|
||||
unsigned target_page_bits = qemu_target_page_bits();
|
||||
int page_size = qemu_target_page_size();
|
||||
int page_mask = -page_size;
|
||||
|
||||
if (unlikely(xen_in_migration)) {
|
||||
int rc;
|
||||
ram_addr_t start_pfn, nb_pages;
|
||||
|
||||
start = xen_phys_offset_to_gaddr(start, length);
|
||||
start = xen_phys_offset_to_gaddr(start, length, page_mask);
|
||||
|
||||
if (length == 0) {
|
||||
length = TARGET_PAGE_SIZE;
|
||||
length = page_size;
|
||||
}
|
||||
start_pfn = start >> TARGET_PAGE_BITS;
|
||||
nb_pages = ((start + length + TARGET_PAGE_SIZE - 1) >> TARGET_PAGE_BITS)
|
||||
start_pfn = start >> target_page_bits;
|
||||
nb_pages = ((start + length + page_size - 1) >> target_page_bits)
|
||||
- start_pfn;
|
||||
rc = xen_modified_memory(xen_domid, start_pfn, nb_pages);
|
||||
if (rc) {
|
||||
@@ -662,6 +677,9 @@ void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
|
||||
void arch_xen_set_memory(XenIOState *state, MemoryRegionSection *section,
|
||||
bool add)
|
||||
{
|
||||
unsigned target_page_bits = qemu_target_page_bits();
|
||||
int page_size = qemu_target_page_size();
|
||||
int page_mask = -page_size;
|
||||
hwaddr start_addr = section->offset_within_address_space;
|
||||
ram_addr_t size = int128_get64(section->size);
|
||||
bool log_dirty = memory_region_is_logging(section->mr, DIRTY_MEMORY_VGA);
|
||||
@@ -677,8 +695,8 @@ void arch_xen_set_memory(XenIOState *state, MemoryRegionSection *section,
|
||||
|
||||
trace_xen_client_set_memory(start_addr, size, log_dirty);
|
||||
|
||||
start_addr &= TARGET_PAGE_MASK;
|
||||
size = TARGET_PAGE_ALIGN(size);
|
||||
start_addr &= page_mask;
|
||||
size = ROUND_UP(size, page_size);
|
||||
|
||||
if (add) {
|
||||
if (!memory_region_is_rom(section->mr)) {
|
||||
@@ -687,8 +705,8 @@ void arch_xen_set_memory(XenIOState *state, MemoryRegionSection *section,
|
||||
} else {
|
||||
mem_type = HVMMEM_ram_ro;
|
||||
if (xen_set_mem_type(xen_domid, mem_type,
|
||||
start_addr >> TARGET_PAGE_BITS,
|
||||
size >> TARGET_PAGE_BITS)) {
|
||||
start_addr >> target_page_bits,
|
||||
size >> target_page_bits)) {
|
||||
DPRINTF("xen_set_mem_type error, addr: "HWADDR_FMT_plx"\n",
|
||||
start_addr);
|
||||
}
|
||||
|
||||
@@ -356,6 +356,7 @@ static void grlib_irqmp_realize(DeviceState *dev, Error **errp)
|
||||
error_setg(errp, "Invalid ncpus properties: "
|
||||
"%u, must be 0 < ncpus =< %u.", irqmp->ncpus,
|
||||
IRQMP_MAX_CPU);
|
||||
return;
|
||||
}
|
||||
|
||||
qdev_init_gpio_in(dev, grlib_irqmp_set_irq, MAX_PILS);
|
||||
|
||||
+42
-2
@@ -40,6 +40,8 @@
|
||||
#define PCSR_PRE_SHIFT 8
|
||||
#define PCSR_PRE_MASK 0x0f00
|
||||
|
||||
#define RCR_SOFTRST 0x80
|
||||
|
||||
typedef struct {
|
||||
MemoryRegion iomem;
|
||||
qemu_irq irq;
|
||||
@@ -185,12 +187,50 @@ static const MemoryRegionOps m5208_sys_ops = {
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
};
|
||||
|
||||
static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
|
||||
static uint64_t m5208_rcm_read(void *opaque, hwaddr addr,
|
||||
unsigned size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void m5208_rcm_write(void *opaque, hwaddr addr,
|
||||
uint64_t value, unsigned size)
|
||||
{
|
||||
M68kCPU *cpu = opaque;
|
||||
CPUState *cs = CPU(cpu);
|
||||
switch (addr) {
|
||||
case 0x0: /* RCR */
|
||||
if (value & RCR_SOFTRST) {
|
||||
cpu_reset(cs);
|
||||
cpu->env.aregs[7] = ldl_phys(cs->as, 0);
|
||||
cpu->env.pc = ldl_phys(cs->as, 4);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
|
||||
__func__, addr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const MemoryRegionOps m5208_rcm_ops = {
|
||||
.read = m5208_rcm_read,
|
||||
.write = m5208_rcm_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
};
|
||||
|
||||
static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic,
|
||||
M68kCPU *cpu)
|
||||
{
|
||||
MemoryRegion *iomem = g_new(MemoryRegion, 1);
|
||||
MemoryRegion *iomem_rcm = g_new(MemoryRegion, 1);
|
||||
m5208_timer_state *s;
|
||||
int i;
|
||||
|
||||
/* RCM */
|
||||
memory_region_init_io(iomem_rcm, NULL, &m5208_rcm_ops, cpu,
|
||||
"m5208-rcm", 0x00000080);
|
||||
memory_region_add_subregion(address_space, 0xfc0a0000, iomem_rcm);
|
||||
/* SDRAMC. */
|
||||
memory_region_init_io(iomem, NULL, &m5208_sys_ops, NULL, "m5208-sys", 0x00004000);
|
||||
memory_region_add_subregion(address_space, 0xfc0a8000, iomem);
|
||||
@@ -265,7 +305,7 @@ static void mcf5208evb_init(MachineState *machine)
|
||||
mcf_uart_create_mmap(0xfc064000, pic[27], serial_hd(1));
|
||||
mcf_uart_create_mmap(0xfc068000, pic[28], serial_hd(2));
|
||||
|
||||
mcf5208_sys_init(address_space_mem, pic);
|
||||
mcf5208_sys_init(address_space_mem, pic, cpu);
|
||||
|
||||
mcf_fec_init(address_space_mem, 0xfc030000, pic + 36);
|
||||
|
||||
|
||||
@@ -351,6 +351,7 @@ static bool net_event(void *_xendev)
|
||||
|
||||
static bool xen_netdev_connect(XenDevice *xendev, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
XenNetDev *netdev = XEN_NET_DEVICE(xendev);
|
||||
unsigned int port, rx_copy;
|
||||
|
||||
|
||||
+2
-1
@@ -23,6 +23,7 @@
|
||||
#include "hw/xen/xen.h"
|
||||
#include "qemu/range.h"
|
||||
#include "qapi/error.h"
|
||||
#include "sysemu/xen.h"
|
||||
|
||||
#include "hw/i386/kvm/xen_evtchn.h"
|
||||
|
||||
@@ -308,7 +309,7 @@ bool msi_is_masked(const PCIDevice *dev, unsigned int vector)
|
||||
}
|
||||
|
||||
data = pci_get_word(dev->config + msi_data_off(dev, msi64bit));
|
||||
if (xen_is_pirq_msi(data)) {
|
||||
if (xen_enabled() && xen_is_pirq_msi(data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
#define MAX_IDE_BUS 2
|
||||
#define CFG_ADDR 0xf0000510
|
||||
#define TBFREQ (100UL * 1000UL * 1000UL)
|
||||
#define TBFREQ (25UL * 1000UL * 1000UL)
|
||||
#define CLOCKFREQ (900UL * 1000UL * 1000UL)
|
||||
#define BUSFREQ (100UL * 1000UL * 1000UL)
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ struct RemoteObject {
|
||||
|
||||
static void remote_object_set_fd(Object *obj, const char *str, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
RemoteObject *o = REMOTE_OBJECT(obj);
|
||||
int fd = -1;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user