* microvm docs and fixes (Sergio, Liam)
* New processor features for Intel errata (myself, Pawan) * Kconfig fixes (myself, Thomas) * Revert mc146818rtc change (myself) * Deprecate scsi-disk (myself) * RTC fix (myself, Marcelo) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJd06/1AAoJEL/70l94x66DssgH/2nZ637XYeE7a7J/G9mXQ/wb nkRWzoCBlMyqPX1/Avj09Skm4gwFGn+QJmGKAE7lAWH6209WsNt7sCUfohyvLGlH i5ccXcnSRp2cTqK9aD73VnVlh9eY0fGU5TNxdBXdqE7MeLPHfb/iq/qo0l1SyhV6 Zx7zqknecLOG7DOWJsWnC4lyDXD2KHRng3gzAwzo2vByctBYga5hcMCFVDSvGxuR wuI3WX3IMaZtY5NtdhUhnjZUA4bZZW+1Ii5UR1zlVZeanUmyqhB64ABgVBl8G+jv HlfctgyQIqVMA0QHEulh3EU8GoTFFNwO2bQpFUNGV6iESISRtlj5sxgvhl7+ahg= =WHGB -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging * microvm docs and fixes (Sergio, Liam) * New processor features for Intel errata (myself, Pawan) * Kconfig fixes (myself, Thomas) * Revert mc146818rtc change (myself) * Deprecate scsi-disk (myself) * RTC fix (myself, Marcelo) # gpg: Signature made Tue 19 Nov 2019 09:03:49 GMT # gpg: using RSA key BFFBD25F78C7AE83 # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * remotes/bonzini/tags/for-upstream: mc146818rtc: fix timer interrupt reinjection again Revert "mc146818rtc: fix timer interrupt reinjection" scsi: deprecate scsi-disk hw/i386: Move save_tsc_khz from PCMachineClass to X86MachineClass docs/microvm.rst: add instructions for shutting down the guest docs/microvm.rst: fix alignment in "Limitations" vfio: vfio-pci requires EDID hw/i386: Fix compiler warning when CONFIG_IDE_ISA is disabled target/i386: Export TAA_NO bit to guests target/i386: add PSCHANGE_NO bit for the ARCH_CAPABILITIES MSR microvm: fix memory leak in microvm_fix_kernel_cmdline scripts: Detect git worktrees for get_maintainer.pl --git Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
06b43e082c
@ -33,9 +33,9 @@ Limitations
|
||||
|
||||
Currently, microvm does *not* support the following features:
|
||||
|
||||
- PCI-only devices.
|
||||
- Hotplug of any kind.
|
||||
- Live migration across QEMU versions.
|
||||
- PCI-only devices.
|
||||
- Hotplug of any kind.
|
||||
- Live migration across QEMU versions.
|
||||
|
||||
|
||||
Using the microvm machine type
|
||||
@ -106,3 +106,24 @@ disabled::
|
||||
-device virtio-blk-device,drive=test \
|
||||
-netdev tap,id=tap0,script=no,downscript=no \
|
||||
-device virtio-net-device,netdev=tap0
|
||||
|
||||
|
||||
Triggering a guest-initiated shut down
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As the microvm machine type includes just a small set of system
|
||||
devices, some x86 mechanisms for rebooting or shutting down the
|
||||
system, like sending a key sequence to the keyboard or writing to an
|
||||
ACPI register, doesn't have any effect in the VM.
|
||||
|
||||
The recommended way to trigger a guest-initiated shut down is by
|
||||
generating a ``triple-fault``, which will cause the VM to initiate a
|
||||
reboot. Additionally, if the ``-no-reboot`` argument is present in the
|
||||
command line, QEMU will detect this event and terminate its own
|
||||
execution gracefully.
|
||||
|
||||
Linux does support this mechanism, but by default will only be used
|
||||
after other options have been tried and failed, causing the reboot to
|
||||
be delayed by a small number of seconds. It's possible to instruct it
|
||||
to try the triple-fault mechanism first, by adding ``reboot=t`` to the
|
||||
kernel's command line.
|
||||
|
@ -331,6 +331,8 @@ static void microvm_fix_kernel_cmdline(MachineState *machine)
|
||||
|
||||
fw_cfg_modify_i32(x86ms->fw_cfg, FW_CFG_CMDLINE_SIZE, strlen(cmdline) + 1);
|
||||
fw_cfg_modify_string(x86ms->fw_cfg, FW_CFG_CMDLINE_DATA, cmdline);
|
||||
|
||||
g_free(cmdline);
|
||||
}
|
||||
|
||||
static void microvm_machine_state_init(MachineState *machine)
|
||||
|
@ -2195,7 +2195,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
/* BIOS ACPI tables: 128K. Other BIOS datastructures: less than 4K reported
|
||||
* to be used at the moment, 32K should be enough for a while. */
|
||||
pcmc->acpi_data_size = 0x20000 + 0x8000;
|
||||
pcmc->save_tsc_khz = true;
|
||||
pcmc->linuxboot_dma_enabled = true;
|
||||
pcmc->pvh_enabled = true;
|
||||
assert(!mc->get_hotplug_handler);
|
||||
|
@ -78,7 +78,6 @@ static void pc_init1(MachineState *machine,
|
||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||
MemoryRegion *system_memory = get_system_memory();
|
||||
MemoryRegion *system_io = get_system_io();
|
||||
int i;
|
||||
PCIBus *pci_bus;
|
||||
ISABus *isa_bus;
|
||||
PCII440FXState *i440fx_state;
|
||||
@ -253,7 +252,8 @@ static void pc_init1(MachineState *machine,
|
||||
}
|
||||
#ifdef CONFIG_IDE_ISA
|
||||
else {
|
||||
for(i = 0; i < MAX_IDE_BUS; i++) {
|
||||
int i;
|
||||
for (i = 0; i < MAX_IDE_BUS; i++) {
|
||||
ISADevice *dev;
|
||||
char busname[] = "ide.0";
|
||||
dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
|
||||
@ -567,10 +567,10 @@ DEFINE_I440FX_MACHINE(v2_6, "pc-i440fx-2.6", NULL,
|
||||
|
||||
static void pc_i440fx_2_5_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
|
||||
|
||||
pc_i440fx_2_6_machine_options(m);
|
||||
pcmc->save_tsc_khz = false;
|
||||
x86mc->save_tsc_khz = false;
|
||||
m->legacy_fw_cfg_order = 1;
|
||||
compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len);
|
||||
compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len);
|
||||
|
@ -508,10 +508,10 @@ DEFINE_Q35_MACHINE(v2_6, "pc-q35-2.6", NULL,
|
||||
|
||||
static void pc_q35_2_5_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
|
||||
|
||||
pc_q35_2_6_machine_options(m);
|
||||
pcmc->save_tsc_khz = false;
|
||||
x86mc->save_tsc_khz = false;
|
||||
m->legacy_fw_cfg_order = 1;
|
||||
compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len);
|
||||
compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len);
|
||||
|
@ -763,6 +763,7 @@ static void x86_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->get_default_cpu_node_id = x86_get_default_cpu_node_id;
|
||||
mc->possible_cpu_arch_ids = x86_possible_cpu_arch_ids;
|
||||
x86mc->compat_apic_id_mode = false;
|
||||
x86mc->save_tsc_khz = true;
|
||||
nc->nmi_monitor_handler = x86_nmi;
|
||||
|
||||
object_class_property_add(oc, X86_MACHINE_MAX_RAM_BELOW_4G, "size",
|
||||
|
@ -168,12 +168,13 @@ static uint32_t rtc_periodic_clock_ticks(RTCState *s)
|
||||
* is just due to period adjustment.
|
||||
*/
|
||||
static void
|
||||
periodic_timer_update(RTCState *s, int64_t current_time, uint32_t old_period)
|
||||
periodic_timer_update(RTCState *s, int64_t current_time, uint32_t old_period, bool period_change)
|
||||
{
|
||||
uint32_t period;
|
||||
int64_t cur_clock, next_irq_clock, lost_clock = 0;
|
||||
|
||||
period = rtc_periodic_clock_ticks(s);
|
||||
s->period = period;
|
||||
|
||||
if (!period) {
|
||||
s->irq_coalesced = 0;
|
||||
@ -189,7 +190,7 @@ periodic_timer_update(RTCState *s, int64_t current_time, uint32_t old_period)
|
||||
* if the periodic timer's update is due to period re-configuration,
|
||||
* we should count the clock since last interrupt.
|
||||
*/
|
||||
if (old_period) {
|
||||
if (old_period && period_change) {
|
||||
int64_t last_periodic_clock, next_periodic_clock;
|
||||
|
||||
next_periodic_clock = muldiv64(s->next_periodic_time,
|
||||
@ -197,42 +198,41 @@ periodic_timer_update(RTCState *s, int64_t current_time, uint32_t old_period)
|
||||
last_periodic_clock = next_periodic_clock - old_period;
|
||||
lost_clock = cur_clock - last_periodic_clock;
|
||||
assert(lost_clock >= 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* s->irq_coalesced can change for two reasons:
|
||||
*
|
||||
* a) if one or more periodic timer interrupts have been lost,
|
||||
* lost_clock will be more that a period.
|
||||
*
|
||||
* b) when the period may be reconfigured, we expect the OS to
|
||||
* treat delayed tick as the new period. So, when switching
|
||||
* from a shorter to a longer period, scale down the missing,
|
||||
* because the OS will treat past delayed ticks as longer
|
||||
* (leftovers are put back into lost_clock). When switching
|
||||
* to a shorter period, scale up the missing ticks since the
|
||||
* OS handler will treat past delayed ticks as shorter.
|
||||
*/
|
||||
if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW) {
|
||||
uint32_t old_irq_coalesced = s->irq_coalesced;
|
||||
/*
|
||||
* s->irq_coalesced can change for two reasons:
|
||||
*
|
||||
* a) if one or more periodic timer interrupts have been lost,
|
||||
* lost_clock will be more that a period.
|
||||
*
|
||||
* b) when the period may be reconfigured, we expect the OS to
|
||||
* treat delayed tick as the new period. So, when switching
|
||||
* from a shorter to a longer period, scale down the missing,
|
||||
* because the OS will treat past delayed ticks as longer
|
||||
* (leftovers are put back into lost_clock). When switching
|
||||
* to a shorter period, scale up the missing ticks since the
|
||||
* OS handler will treat past delayed ticks as shorter.
|
||||
*/
|
||||
if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW) {
|
||||
uint32_t old_irq_coalesced = s->irq_coalesced;
|
||||
|
||||
s->period = period;
|
||||
lost_clock += old_irq_coalesced * old_period;
|
||||
s->irq_coalesced = lost_clock / s->period;
|
||||
lost_clock %= s->period;
|
||||
if (old_irq_coalesced != s->irq_coalesced ||
|
||||
old_period != s->period) {
|
||||
DPRINTF_C("cmos: coalesced irqs scaled from %d to %d, "
|
||||
"period scaled from %d to %d\n", old_irq_coalesced,
|
||||
s->irq_coalesced, old_period, s->period);
|
||||
rtc_coalesced_timer_update(s);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* no way to compensate the interrupt if LOST_TICK_POLICY_SLEW
|
||||
* is not used, we should make the time progress anyway.
|
||||
*/
|
||||
lost_clock = MIN(lost_clock, period);
|
||||
lost_clock += old_irq_coalesced * old_period;
|
||||
s->irq_coalesced = lost_clock / s->period;
|
||||
lost_clock %= s->period;
|
||||
if (old_irq_coalesced != s->irq_coalesced ||
|
||||
old_period != s->period) {
|
||||
DPRINTF_C("cmos: coalesced irqs scaled from %d to %d, "
|
||||
"period scaled from %d to %d\n", old_irq_coalesced,
|
||||
s->irq_coalesced, old_period, s->period);
|
||||
rtc_coalesced_timer_update(s);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* no way to compensate the interrupt if LOST_TICK_POLICY_SLEW
|
||||
* is not used, we should make the time progress anyway.
|
||||
*/
|
||||
lost_clock = MIN(lost_clock, period);
|
||||
}
|
||||
|
||||
assert(lost_clock >= 0 && lost_clock <= period);
|
||||
@ -246,7 +246,7 @@ static void rtc_periodic_timer(void *opaque)
|
||||
{
|
||||
RTCState *s = opaque;
|
||||
|
||||
periodic_timer_update(s, s->next_periodic_time, 0);
|
||||
periodic_timer_update(s, s->next_periodic_time, s->period, false);
|
||||
s->cmos_data[RTC_REG_C] |= REG_C_PF;
|
||||
if (s->cmos_data[RTC_REG_B] & REG_B_PIE) {
|
||||
s->cmos_data[RTC_REG_C] |= REG_C_IRQF;
|
||||
@ -512,7 +512,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr,
|
||||
|
||||
if (update_periodic_timer) {
|
||||
periodic_timer_update(s, qemu_clock_get_ns(rtc_clock),
|
||||
old_period);
|
||||
old_period, true);
|
||||
}
|
||||
|
||||
check_update_timer(s);
|
||||
@ -551,7 +551,7 @@ static void cmos_ioport_write(void *opaque, hwaddr addr,
|
||||
|
||||
if (update_periodic_timer) {
|
||||
periodic_timer_update(s, qemu_clock_get_ns(rtc_clock),
|
||||
old_period);
|
||||
old_period, true);
|
||||
}
|
||||
|
||||
check_update_timer(s);
|
||||
@ -795,6 +795,7 @@ static int rtc_post_load(void *opaque, int version_id)
|
||||
s->offset = 0;
|
||||
check_update_timer(s);
|
||||
}
|
||||
s->period = rtc_periodic_clock_ticks(s);
|
||||
|
||||
/* The periodic timer is deterministic in record/replay mode,
|
||||
* so there is no need to update it after loading the vmstate.
|
||||
@ -804,7 +805,7 @@ static int rtc_post_load(void *opaque, int version_id)
|
||||
uint64_t now = qemu_clock_get_ns(rtc_clock);
|
||||
if (now < s->next_periodic_time ||
|
||||
now > (s->next_periodic_time + get_max_clock_jump())) {
|
||||
periodic_timer_update(s, qemu_clock_get_ns(rtc_clock), 0);
|
||||
periodic_timer_update(s, qemu_clock_get_ns(rtc_clock), s->period, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -254,8 +254,18 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
|
||||
char *name;
|
||||
DeviceState *dev;
|
||||
Error *err = NULL;
|
||||
DriveInfo *dinfo;
|
||||
|
||||
driver = blk_is_sg(blk) ? "scsi-generic" : "scsi-disk";
|
||||
if (blk_is_sg(blk)) {
|
||||
driver = "scsi-generic";
|
||||
} else {
|
||||
dinfo = blk_legacy_dinfo(blk);
|
||||
if (dinfo && dinfo->media_cd) {
|
||||
driver = "scsi-cd";
|
||||
} else {
|
||||
driver = "scsi-hd";
|
||||
}
|
||||
}
|
||||
dev = qdev_create(&bus->qbus, driver);
|
||||
name = g_strdup_printf("legacy[%d]", unit);
|
||||
object_property_add_child(OBJECT(bus), name, OBJECT(dev), NULL);
|
||||
|
@ -2481,6 +2481,9 @@ static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
|
||||
DriveInfo *dinfo;
|
||||
Error *local_err = NULL;
|
||||
|
||||
warn_report("'scsi-disk' is deprecated, "
|
||||
"please use 'scsi-hd' or 'scsi-cd' instead");
|
||||
|
||||
if (!dev->conf.blk) {
|
||||
scsi_realize(dev, &local_err);
|
||||
assert(local_err);
|
||||
|
@ -116,8 +116,6 @@ typedef struct PCMachineClass {
|
||||
bool enforce_aligned_dimm;
|
||||
bool broken_reserved_end;
|
||||
|
||||
/* TSC rate migration: */
|
||||
bool save_tsc_khz;
|
||||
/* generate legacy CPU hotplug AML */
|
||||
bool legacy_cpu_hotplug;
|
||||
|
||||
|
@ -30,6 +30,8 @@ typedef struct {
|
||||
|
||||
/*< public >*/
|
||||
|
||||
/* TSC rate migration: */
|
||||
bool save_tsc_khz;
|
||||
/* Enables contiguous-apic-ID mode */
|
||||
bool compat_apic_id_mode;
|
||||
} X86MachineClass;
|
||||
|
@ -259,6 +259,11 @@ their usecases.
|
||||
The 'ide-drive' device is deprecated. Users should use 'ide-hd' or
|
||||
'ide-cd' as appropriate to get an IDE hard disk or CD-ROM as needed.
|
||||
|
||||
@subsection scsi-disk (since 4.2)
|
||||
|
||||
The 'scsi-disk' device is deprecated. Users should use 'scsi-hd' or
|
||||
'scsi-cd' as appropriate to get a SCSI hard disk or CD-ROM as needed.
|
||||
|
||||
@section System emulator machines
|
||||
|
||||
@subsection pc-0.12, pc-0.13, pc-0.14 and pc-0.15 (since 4.0)
|
||||
|
@ -81,7 +81,7 @@ my %VCS_cmds;
|
||||
|
||||
my %VCS_cmds_git = (
|
||||
"execute_cmd" => \&git_execute_cmd,
|
||||
"available" => '(which("git") ne "") && (-d ".git")',
|
||||
"available" => '(which("git") ne "") && (-e ".git")',
|
||||
"find_signers_cmd" =>
|
||||
"git log --no-color --follow --since=\$email_git_since " .
|
||||
'--format="GitCommit: %H%n' .
|
||||
|
@ -1204,8 +1204,8 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
.type = MSR_FEATURE_WORD,
|
||||
.feat_names = {
|
||||
"rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
|
||||
"ssb-no", "mds-no", NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
"ssb-no", "mds-no", "pschange-mc-no", NULL,
|
||||
"taa-no", NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
|
@ -988,8 +988,8 @@ static bool tsc_khz_needed(void *opaque)
|
||||
X86CPU *cpu = opaque;
|
||||
CPUX86State *env = &cpu->env;
|
||||
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(mc);
|
||||
return env->tsc_khz && pcmc->save_tsc_khz;
|
||||
X86MachineClass *x86mc = X86_MACHINE_CLASS(mc);
|
||||
return env->tsc_khz && x86mc->save_tsc_khz;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_tsc_khz = {
|
||||
|
@ -167,7 +167,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||
|
||||
Testing: -drive if=none,id=disk -device lsi53c895a -device scsi-disk,drive=disk
|
||||
QEMU X.Y.Z monitor - type 'help' for more information
|
||||
(qemu) QEMU_PROG: -device scsi-disk,drive=disk: Device needs media, but drive is empty
|
||||
(qemu) QEMU_PROG: -device scsi-disk,drive=disk: warning: 'scsi-disk' is deprecated, please use 'scsi-hd' or 'scsi-cd' instead
|
||||
QEMU_PROG: -device scsi-disk,drive=disk: Device needs media, but drive is empty
|
||||
|
||||
Testing: -drive if=none,id=disk -device lsi53c895a -device scsi-hd,drive=disk
|
||||
QEMU X.Y.Z monitor - type 'help' for more information
|
||||
@ -238,7 +239,8 @@ QEMU X.Y.Z monitor - type 'help' for more information
|
||||
|
||||
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=disk,readonly=on -device lsi53c895a -device scsi-disk,drive=disk
|
||||
QEMU X.Y.Z monitor - type 'help' for more information
|
||||
(qemu) quit
|
||||
(qemu) QEMU_PROG: -device scsi-disk,drive=disk: warning: 'scsi-disk' is deprecated, please use 'scsi-hd' or 'scsi-cd' instead
|
||||
quit
|
||||
|
||||
Testing: -drive file=TEST_DIR/t.qcow2,if=none,id=disk,readonly=on -device lsi53c895a -device scsi-hd,drive=disk
|
||||
QEMU X.Y.Z monitor - type 'help' for more information
|
||||
|
Loading…
x
Reference in New Issue
Block a user