Misc fixes for 8.2

* buildsys: Invoke bash via 'env' (Samuel)
 
 * doc: Fix example in s390-cpu-topology.rst (Zhao)
 
 * HW: Fix AVR ATMega reset stack (Gihun) and VT82C686 IRQ routing (Zoltan)
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmVl7MUACgkQ4+MsLN6t
 wN4nsQ//U7/GGrMaNJF369pC0UfC0dfD39RoD9jmmrWUQB17baMvXo+BMBcELX0Q
 BtgRjIYwnywnVZlB11JL5Ql9ykSRqd7VeqnZfH//GqQO+ySF7jl6ekNT6YNjUbWu
 iF9bU3o0/LAVl/3pe9LQ4q/yOjzERA5o4JKYviHZYcWE811/5lBNgER4iPyCz6a8
 aGI3S5PGmq6a9x5266jkY2WWldDy7D1ujkuvxxc4tgnmbBjL21soJ/oRLOBjGTNl
 hCRfDTEiFZm7OxjV7oB03Nr3EGGStGdy0aPhhtFwzZxQ9yV7d2DLsbYGgwzZYkKQ
 9v4DtGqYyvDA7LBmfxOrnzL0WXgN4xO3qekLqHDtChDzFFEYwtHvH0duPUiQv1Yu
 qHyOsfB58rKzWHeo0ACEjMWGdD1opCXCeoJlEf/saiQ5EgyBwph/z2mWYN4yak5H
 Zu3xF15BcnyavC6sVeuE+rT574dhCzOtH8Vf3WVwqfL5D5cyCjHlmPSAXXMqBkmh
 BMOD8O210n6IdzuuOQ038t3yGvIc0YysOmQgfLjRYlZa884q3wExgrufH+NYbGMj
 bFthPjLKgHm+q4k2mH65G98xwXQFT6rdHanw2iEJcPJbhhk9SNWYgaQ0r0Oi2Pfd
 zCQ22F1j9UqGcqKh+8tzAfjayRyQUJtgizPXEWanADkpIDYxrRk=
 =323/
 -----END PGP SIGNATURE-----

Merge tag 'misc-next-20231128' of https://github.com/philmd/qemu into staging

Misc fixes for 8.2

* buildsys: Invoke bash via 'env' (Samuel)

* doc: Fix example in s390-cpu-topology.rst (Zhao)

* HW: Fix AVR ATMega reset stack (Gihun) and VT82C686 IRQ routing (Zoltan)

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmVl7MUACgkQ4+MsLN6t
# wN4nsQ//U7/GGrMaNJF369pC0UfC0dfD39RoD9jmmrWUQB17baMvXo+BMBcELX0Q
# BtgRjIYwnywnVZlB11JL5Ql9ykSRqd7VeqnZfH//GqQO+ySF7jl6ekNT6YNjUbWu
# iF9bU3o0/LAVl/3pe9LQ4q/yOjzERA5o4JKYviHZYcWE811/5lBNgER4iPyCz6a8
# aGI3S5PGmq6a9x5266jkY2WWldDy7D1ujkuvxxc4tgnmbBjL21soJ/oRLOBjGTNl
# hCRfDTEiFZm7OxjV7oB03Nr3EGGStGdy0aPhhtFwzZxQ9yV7d2DLsbYGgwzZYkKQ
# 9v4DtGqYyvDA7LBmfxOrnzL0WXgN4xO3qekLqHDtChDzFFEYwtHvH0duPUiQv1Yu
# qHyOsfB58rKzWHeo0ACEjMWGdD1opCXCeoJlEf/saiQ5EgyBwph/z2mWYN4yak5H
# Zu3xF15BcnyavC6sVeuE+rT574dhCzOtH8Vf3WVwqfL5D5cyCjHlmPSAXXMqBkmh
# BMOD8O210n6IdzuuOQ038t3yGvIc0YysOmQgfLjRYlZa884q3wExgrufH+NYbGMj
# bFthPjLKgHm+q4k2mH65G98xwXQFT6rdHanw2iEJcPJbhhk9SNWYgaQ0r0Oi2Pfd
# zCQ22F1j9UqGcqKh+8tzAfjayRyQUJtgizPXEWanADkpIDYxrRk=
# =323/
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 28 Nov 2023 08:36:05 EST
# 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 'misc-next-20231128' of https://github.com/philmd/qemu:
  docs/s390: Fix wrong command example in s390-cpu-topology.rst
  hw/avr/atmega: Fix wrong initial value of stack pointer
  hw/audio/via-ac97: Route interrupts using via_isa_set_irq()
  hw/isa/vt82c686: Route PIRQ inputs using via_isa_set_irq()
  hw/usb/vt82c686-uhci-pci: Use ISA instead of PCI interrupts
  hw/isa/vt82c686: Bring back via_isa_set_irq()
  target/hexagon/idef-parser/prepare: use env to invoke bash

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2023-11-28 15:36:42 -05:00
commit 745c2911cc
9 changed files with 87 additions and 36 deletions

View File

@ -15,7 +15,7 @@ have default values:
-smp 1,drawers=3,books=3,sockets=2,cores=2,maxcpus=36 \ -smp 1,drawers=3,books=3,sockets=2,cores=2,maxcpus=36 \
-device z14-s390x-cpu,core-id=19,entitlement=high \ -device z14-s390x-cpu,core-id=19,entitlement=high \
-device z14-s390x-cpu,core-id=11,entitlement=low \ -device z14-s390x-cpu,core-id=11,entitlement=low \
-device z14-s390x-cpu,core-id=112,entitlement=high \ -device z14-s390x-cpu,core-id=12,entitlement=high \
... ...
Additions to query-cpus-fast Additions to query-cpus-fast
@ -78,7 +78,7 @@ modifiers for all configured vCPUs.
"dedicated": true, "dedicated": true,
"thread-id": 537005, "thread-id": 537005,
"props": { "props": {
"core-id": 112, "core-id": 12,
"socket-id": 0, "socket-id": 0,
"drawer-id": 3, "drawer-id": 3,
"book-id": 2 "book-id": 2
@ -86,7 +86,7 @@ modifiers for all configured vCPUs.
"cpu-state": "operating", "cpu-state": "operating",
"entitlement": "high", "entitlement": "high",
"qom-path": "/machine/peripheral-anon/device[2]", "qom-path": "/machine/peripheral-anon/device[2]",
"cpu-index": 112, "cpu-index": 12,
"target": "s390x" "target": "s390x"
} }
] ]

View File

@ -211,14 +211,14 @@ static void out_cb(void *opaque, int avail)
AUD_set_active_out(s->vo, 0); AUD_set_active_out(s->vo, 0);
} }
if (c->type & STAT_EOL) { if (c->type & STAT_EOL) {
pci_set_irq(&s->dev, 1); via_isa_set_irq(&s->dev, 0, 1);
} }
} }
if (CLEN_IS_FLAG(c)) { if (CLEN_IS_FLAG(c)) {
c->stat |= STAT_FLAG; c->stat |= STAT_FLAG;
c->stat |= STAT_PAUSED; c->stat |= STAT_PAUSED;
if (c->type & STAT_FLAG) { if (c->type & STAT_FLAG) {
pci_set_irq(&s->dev, 1); via_isa_set_irq(&s->dev, 0, 1);
} }
} }
if (CLEN_IS_STOP(c)) { if (CLEN_IS_STOP(c)) {
@ -305,13 +305,13 @@ static void sgd_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
if (val & STAT_EOL) { if (val & STAT_EOL) {
s->aur.stat &= ~(STAT_EOL | STAT_PAUSED); s->aur.stat &= ~(STAT_EOL | STAT_PAUSED);
if (s->aur.type & STAT_EOL) { if (s->aur.type & STAT_EOL) {
pci_set_irq(&s->dev, 0); via_isa_set_irq(&s->dev, 0, 0);
} }
} }
if (val & STAT_FLAG) { if (val & STAT_FLAG) {
s->aur.stat &= ~(STAT_FLAG | STAT_PAUSED); s->aur.stat &= ~(STAT_FLAG | STAT_PAUSED);
if (s->aur.type & STAT_FLAG) { if (s->aur.type & STAT_FLAG) {
pci_set_irq(&s->dev, 0); via_isa_set_irq(&s->dev, 0, 0);
} }
} }
break; break;

View File

@ -233,6 +233,10 @@ static void atmega_realize(DeviceState *dev, Error **errp)
/* CPU */ /* CPU */
object_initialize_child(OBJECT(dev), "cpu", &s->cpu, mc->cpu_type); object_initialize_child(OBJECT(dev), "cpu", &s->cpu, mc->cpu_type);
object_property_set_uint(OBJECT(&s->cpu), "init-sp",
mc->io_size + mc->sram_size - 1, &error_abort);
qdev_realize(DEVICE(&s->cpu), NULL, &error_abort); qdev_realize(DEVICE(&s->cpu), NULL, &error_abort);
cpudev = DEVICE(&s->cpu); cpudev = DEVICE(&s->cpu);

View File

@ -549,6 +549,7 @@ struct ViaISAState {
PCIDevice dev; PCIDevice dev;
qemu_irq cpu_intr; qemu_irq cpu_intr;
qemu_irq *isa_irqs_in; qemu_irq *isa_irqs_in;
uint16_t irq_state[ISA_NUM_IRQS];
ViaSuperIOState via_sio; ViaSuperIOState via_sio;
MC146818RtcState rtc; MC146818RtcState rtc;
PCIIDEState ide; PCIIDEState ide;
@ -592,15 +593,9 @@ static const TypeInfo via_isa_info = {
}, },
}; };
static void via_isa_request_i8259_irq(void *opaque, int irq, int level) static int via_isa_get_pci_irq(const ViaISAState *s, int pin)
{ {
ViaISAState *s = opaque; switch (pin) {
qemu_set_irq(s->cpu_intr, level);
}
static int via_isa_get_pci_irq(const ViaISAState *s, int irq_num)
{
switch (irq_num) {
case 0: case 0:
return s->dev.config[0x55] >> 4; return s->dev.config[0x55] >> 4;
case 1: case 1:
@ -613,29 +608,60 @@ static int via_isa_get_pci_irq(const ViaISAState *s, int irq_num)
return 0; return 0;
} }
static void via_isa_set_pci_irq(void *opaque, int irq_num, int level) void via_isa_set_irq(PCIDevice *d, int pin, int level)
{ {
ViaISAState *s = opaque; ViaISAState *s = VIA_ISA(pci_get_function_0(d));
PCIBus *bus = pci_get_bus(&s->dev); uint8_t irq = d->config[PCI_INTERRUPT_LINE], max_irq = 15;
int i, pic_level, pic_irq = via_isa_get_pci_irq(s, irq_num); int f = PCI_FUNC(d->devfn);
uint16_t mask = BIT(f);
/* IRQ 0: disabled, IRQ 2,8,13: reserved */ switch (f) {
if (!pic_irq) { case 0: /* PIRQ/PINT inputs */
irq = via_isa_get_pci_irq(s, pin);
f = 8 + pin; /* Use function 8-11 for PCI interrupt inputs */
break;
case 2: /* USB ports 0-1 */
case 3: /* USB ports 2-3 */
case 5: /* AC97 audio */
max_irq = 14;
break;
}
/* Keep track of the state of all sources */
if (level) {
s->irq_state[0] |= mask;
} else {
s->irq_state[0] &= ~mask;
}
if (irq == 0 || irq == 0xff) {
return; /* disabled */
}
if (unlikely(irq > max_irq || irq == 2)) {
qemu_log_mask(LOG_GUEST_ERROR, "Invalid ISA IRQ routing %d for %d",
irq, f);
return; return;
} }
if (unlikely(pic_irq == 2 || pic_irq == 8 || pic_irq == 13)) { /* Record source state at mapped IRQ */
qemu_log_mask(LOG_GUEST_ERROR, "Invalid ISA IRQ routing"); if (level) {
s->irq_state[irq] |= mask;
} else {
s->irq_state[irq] &= ~mask;
} }
/* Make sure there are no stuck bits if mapping has changed */
s->irq_state[irq] &= s->irq_state[0];
/* ISA IRQ level is the OR of all sources routed to it */
qemu_set_irq(s->isa_irqs_in[irq], !!s->irq_state[irq]);
}
/* The pic level is the logical OR of all the PCI irqs mapped to it. */ static void via_isa_pirq(void *opaque, int pin, int level)
pic_level = 0; {
for (i = 0; i < PCI_NUM_PINS; i++) { via_isa_set_irq(opaque, pin, level);
if (pic_irq == via_isa_get_pci_irq(s, i)) { }
pic_level |= pci_bus_get_irq_level(bus, i);
} static void via_isa_request_i8259_irq(void *opaque, int irq, int level)
} {
/* Now we change the pic irq level according to the via irq mappings. */ ViaISAState *s = opaque;
qemu_set_irq(s->isa_irqs_in[pic_irq], pic_level); qemu_set_irq(s->cpu_intr, level);
} }
static void via_isa_realize(PCIDevice *d, Error **errp) static void via_isa_realize(PCIDevice *d, Error **errp)
@ -648,6 +674,7 @@ static void via_isa_realize(PCIDevice *d, Error **errp)
int i; int i;
qdev_init_gpio_out(dev, &s->cpu_intr, 1); qdev_init_gpio_out(dev, &s->cpu_intr, 1);
qdev_init_gpio_in_named(dev, via_isa_pirq, "pirq", PCI_NUM_PINS);
isa_irq = qemu_allocate_irqs(via_isa_request_i8259_irq, s, 1); isa_irq = qemu_allocate_irqs(via_isa_request_i8259_irq, s, 1);
isa_bus = isa_bus_new(dev, pci_address_space(d), pci_address_space_io(d), isa_bus = isa_bus_new(dev, pci_address_space(d), pci_address_space_io(d),
errp); errp);
@ -661,8 +688,6 @@ static void via_isa_realize(PCIDevice *d, Error **errp)
i8254_pit_init(isa_bus, 0x40, 0, NULL); i8254_pit_init(isa_bus, 0x40, 0, NULL);
i8257_dma_init(isa_bus, 0); i8257_dma_init(isa_bus, 0);
qdev_init_gpio_in_named(dev, via_isa_set_pci_irq, "pirq", PCI_NUM_PINS);
/* RTC */ /* RTC */
qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000); qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
if (!qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), errp)) { if (!qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), errp)) {

View File

@ -1,7 +1,14 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "hw/irq.h"
#include "hw/isa/vt82c686.h" #include "hw/isa/vt82c686.h"
#include "hcd-uhci.h" #include "hcd-uhci.h"
static void uhci_isa_set_irq(void *opaque, int irq_num, int level)
{
UHCIState *s = opaque;
via_isa_set_irq(&s->dev, 0, level);
}
static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp) static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp)
{ {
UHCIState *s = UHCI(dev); UHCIState *s = UHCI(dev);
@ -15,6 +22,8 @@ static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp)
pci_set_long(pci_conf + 0xc0, 0x00002000); pci_set_long(pci_conf + 0xc0, 0x00002000);
usb_uhci_common_realize(dev, errp); usb_uhci_common_realize(dev, errp);
object_unref(s->irq);
s->irq = qemu_allocate_irq(uhci_isa_set_irq, s, 0);
} }
static UHCIInfo uhci_info[] = { static UHCIInfo uhci_info[] = {

View File

@ -34,4 +34,6 @@ struct ViaAC97State {
uint32_t ac97_cmd; uint32_t ac97_cmd;
}; };
void via_isa_set_irq(PCIDevice *d, int n, int level);
#endif #endif

View File

@ -25,6 +25,7 @@
#include "cpu.h" #include "cpu.h"
#include "disas/dis-asm.h" #include "disas/dis-asm.h"
#include "tcg/debug-assert.h" #include "tcg/debug-assert.h"
#include "hw/qdev-properties.h"
static void avr_cpu_set_pc(CPUState *cs, vaddr value) static void avr_cpu_set_pc(CPUState *cs, vaddr value)
{ {
@ -95,7 +96,7 @@ static void avr_cpu_reset_hold(Object *obj)
env->rampY = 0; env->rampY = 0;
env->rampZ = 0; env->rampZ = 0;
env->eind = 0; env->eind = 0;
env->sp = 0; env->sp = cpu->init_sp;
env->skip = 0; env->skip = 0;
@ -152,6 +153,11 @@ static void avr_cpu_initfn(Object *obj)
sizeof(cpu->env.intsrc) * 8); sizeof(cpu->env.intsrc) * 8);
} }
static Property avr_cpu_properties[] = {
DEFINE_PROP_UINT32("init-sp", AVRCPU, init_sp, 0),
DEFINE_PROP_END_OF_LIST()
};
static ObjectClass *avr_cpu_class_by_name(const char *cpu_model) static ObjectClass *avr_cpu_class_by_name(const char *cpu_model)
{ {
ObjectClass *oc; ObjectClass *oc;
@ -228,6 +234,8 @@ static void avr_cpu_class_init(ObjectClass *oc, void *data)
device_class_set_parent_realize(dc, avr_cpu_realizefn, &mcc->parent_realize); device_class_set_parent_realize(dc, avr_cpu_realizefn, &mcc->parent_realize);
device_class_set_props(dc, avr_cpu_properties);
resettable_class_set_parent_phases(rc, NULL, avr_cpu_reset_hold, NULL, resettable_class_set_parent_phases(rc, NULL, avr_cpu_reset_hold, NULL,
&mcc->parent_phases); &mcc->parent_phases);

View File

@ -145,6 +145,9 @@ struct ArchCPU {
CPUState parent_obj; CPUState parent_obj;
CPUAVRState env; CPUAVRState env;
/* Initial value of stack pointer */
uint32_t init_sp;
}; };
/** /**

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
# #
# Copyright(c) 2019-2021 rev.ng Labs Srl. All Rights Reserved. # Copyright(c) 2019-2021 rev.ng Labs Srl. All Rights Reserved.