* Attach s390x sclpconsole to a proper parent in the QOM tree

* SCLP related clean-ups
 * Report deprecated-props in cpu-model-expansion reply on s390x
 * Deprecate "-runas" and introduce "-run-with user=..." instead
 * Add some more qtest cases on LoongArch
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmY9wHwRHHRodXRoQHJl
 ZGhhdC5jb20ACgkQLtnXdP5wLbUF+A/+JsraF7XOWv1eqW5/O+F5Id1a15CI15bQ
 +rUxW0H0wYxdg1i7jj4cB1dIBXgp59lTkpKUN7ftmnP54oxYQkdcJVCvclzAcwzh
 ZoMiIw3u88JEBZYpF4HcEaKawXxbTMU/ZGOAil1DSkdv+bwhISCS+aIo6ra2Nclg
 2Zwzvb6DsHqcaYIqvrhbxr5VNhZ+o9AU0PEO67AbN6NKXAFCYlRf6Y9OlEveizZi
 4bNnpa/YpA71dL418argAI0Wq78UPENjLeTVGap0DWGbufiiZ4M/Qov6czT0eYuG
 Us2CGJcimV9W+mR45g4xGIgaPmp7PFiobrOoTrAhbixxRA9FQWjamTsElcifktqE
 XiE8kYnTx052bY24ttgLOKYRV+whkw+luxtIZo5JPwNkM5S6rZiwY8EsAmd6fIxR
 aBlWPWQVO5JBc1Ol6MOWqZ/odpr6nQRe4gnL6tcCTFnpZwpyzaQiooNFES0a8KWJ
 MIsywMbIheMNI6m85rngdbKZ4lI1HTUnqLpfoDym3nlHtdx00ctq0O8RjJArfzt6
 aRltpbIAvbGgDyRMzJjezCiMbBSwIHyv4eheJVMi/SAuSevGtnfVNZjCw208Qir6
 sWEAWjavom/XnOFOtLwzkBdjBDiWHiPbLLLgRKcwZ7wbBgH4vhITwSz71fyKpo8n
 aTjjveXlUr0=
 =y1dS
 -----END PGP SIGNATURE-----

Merge tag 'pull-request-2024-05-10' of https://gitlab.com/thuth/qemu into staging

* Attach s390x sclpconsole to a proper parent in the QOM tree
* SCLP related clean-ups
* Report deprecated-props in cpu-model-expansion reply on s390x
* Deprecate "-runas" and introduce "-run-with user=..." instead
* Add some more qtest cases on LoongArch

# -----BEGIN PGP SIGNATURE-----
#
# iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmY9wHwRHHRodXRoQHJl
# ZGhhdC5jb20ACgkQLtnXdP5wLbUF+A/+JsraF7XOWv1eqW5/O+F5Id1a15CI15bQ
# +rUxW0H0wYxdg1i7jj4cB1dIBXgp59lTkpKUN7ftmnP54oxYQkdcJVCvclzAcwzh
# ZoMiIw3u88JEBZYpF4HcEaKawXxbTMU/ZGOAil1DSkdv+bwhISCS+aIo6ra2Nclg
# 2Zwzvb6DsHqcaYIqvrhbxr5VNhZ+o9AU0PEO67AbN6NKXAFCYlRf6Y9OlEveizZi
# 4bNnpa/YpA71dL418argAI0Wq78UPENjLeTVGap0DWGbufiiZ4M/Qov6czT0eYuG
# Us2CGJcimV9W+mR45g4xGIgaPmp7PFiobrOoTrAhbixxRA9FQWjamTsElcifktqE
# XiE8kYnTx052bY24ttgLOKYRV+whkw+luxtIZo5JPwNkM5S6rZiwY8EsAmd6fIxR
# aBlWPWQVO5JBc1Ol6MOWqZ/odpr6nQRe4gnL6tcCTFnpZwpyzaQiooNFES0a8KWJ
# MIsywMbIheMNI6m85rngdbKZ4lI1HTUnqLpfoDym3nlHtdx00ctq0O8RjJArfzt6
# aRltpbIAvbGgDyRMzJjezCiMbBSwIHyv4eheJVMi/SAuSevGtnfVNZjCw208Qir6
# sWEAWjavom/XnOFOtLwzkBdjBDiWHiPbLLLgRKcwZ7wbBgH4vhITwSz71fyKpo8n
# aTjjveXlUr0=
# =y1dS
# -----END PGP SIGNATURE-----
# gpg: Signature made Fri 10 May 2024 08:36:44 AM CEST
# gpg:                using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5
# gpg:                issuer "thuth@redhat.com"
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full]
# gpg:                 aka "Thomas Huth <thuth@redhat.com>" [full]
# gpg:                 aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# gpg:                 aka "Thomas Huth <huth@tuxfamily.org>" [full]

* tag 'pull-request-2024-05-10' of https://gitlab.com/thuth/qemu:
  tests/qtest: Add some test cases support on LoongArch
  qemu-options: Deprecate "-runas" and introduce "-run-with user=..." instead
  target/s390x: flag te and cte as deprecated
  target/s390x: report deprecated-props in cpu-model-expansion reply
  s390x/sclp: Simplify get_sclp_device()
  s390x/event-facility: Simplify sclp_get_event_facility_bus()
  s390x: Introduce a SCLPDevice pointer under the machine
  hw/s390x: Attach the sclpconsole to /machine/sclp/s390-sclp-event-facility

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-05-10 09:41:35 +02:00
commit dafec285bd
15 changed files with 99 additions and 36 deletions

View File

@ -61,6 +61,12 @@ 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 marked deprecated since 9.0, users have to ensure that all the topology members
described with -smp are supported by the target machine. described with -smp are supported by the target machine.
``-runas`` (since 9.1)
----------------------
Use ``-run-with user=..`` instead.
User-mode emulator command line arguments User-mode emulator command line arguments
----------------------------------------- -----------------------------------------

View File

@ -523,16 +523,7 @@ static void register_types(void)
type_init(register_types) type_init(register_types)
BusState *sclp_get_event_facility_bus(void) BusState *sclp_get_event_facility_bus(SCLPEventFacility *ef)
{ {
Object *busobj; return BUS(&ef->sbus);
SCLPEventsBus *sbus;
busobj = object_resolve_path_type("", TYPE_SCLP_EVENTS_BUS, NULL);
sbus = OBJECT_CHECK(SCLPEventsBus, busobj, TYPE_SCLP_EVENTS_BUS);
if (!sbus) {
return NULL;
}
return &sbus->qbus;
} }

View File

@ -237,23 +237,31 @@ static void s390_create_virtio_net(BusState *bus, const char *name)
} }
} }
static void s390_create_sclpconsole(const char *type, Chardev *chardev) static void s390_create_sclpconsole(SCLPDevice *sclp,
const char *type, Chardev *chardev)
{ {
SCLPEventFacility *ef = sclp->event_facility;
BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
DeviceState *dev; DeviceState *dev;
dev = qdev_new(type); dev = qdev_new(type);
object_property_add_child(OBJECT(ef), type, OBJECT(dev));
qdev_prop_set_chr(dev, "chardev", chardev); qdev_prop_set_chr(dev, "chardev", chardev);
qdev_realize_and_unref(dev, sclp_get_event_facility_bus(), &error_fatal); qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
} }
static void ccw_init(MachineState *machine) static void ccw_init(MachineState *machine)
{ {
MachineClass *mc = MACHINE_GET_CLASS(machine); MachineClass *mc = MACHINE_GET_CLASS(machine);
S390CcwMachineState *ms = S390_CCW_MACHINE(machine);
int ret; int ret;
VirtualCssBus *css_bus; VirtualCssBus *css_bus;
DeviceState *dev; DeviceState *dev;
s390_sclp_init(); ms->sclp = SCLP(object_new(TYPE_SCLP));
object_property_add_child(OBJECT(machine), TYPE_SCLP, OBJECT(ms->sclp));
qdev_realize_and_unref(DEVICE(ms->sclp), NULL, &error_fatal);
/* init memory + setup max page size. Required for the CPU model */ /* init memory + setup max page size. Required for the CPU model */
s390_memory_init(machine->ram); s390_memory_init(machine->ram);
@ -302,10 +310,10 @@ static void ccw_init(MachineState *machine)
/* init consoles */ /* init consoles */
if (serial_hd(0)) { if (serial_hd(0)) {
s390_create_sclpconsole("sclpconsole", serial_hd(0)); s390_create_sclpconsole(ms->sclp, "sclpconsole", serial_hd(0));
} }
if (serial_hd(1)) { if (serial_hd(1)) {
s390_create_sclpconsole("sclplmconsole", serial_hd(1)); s390_create_sclpconsole(ms->sclp, "sclplmconsole", serial_hd(1));
} }
/* init the TOD clock */ /* init the TOD clock */

View File

@ -21,13 +21,14 @@
#include "hw/s390x/s390-pci-bus.h" #include "hw/s390x/s390-pci-bus.h"
#include "hw/s390x/ipl.h" #include "hw/s390x/ipl.h"
#include "hw/s390x/cpu-topology.h" #include "hw/s390x/cpu-topology.h"
#include "hw/s390x/s390-virtio-ccw.h"
static inline SCLPDevice *get_sclp_device(void) static SCLPDevice *get_sclp_device(void)
{ {
static SCLPDevice *sclp; static SCLPDevice *sclp;
if (!sclp) { if (!sclp) {
sclp = SCLP(object_resolve_path_type("", TYPE_SCLP, NULL)); sclp = S390_CCW_MACHINE(qdev_get_machine())->sclp;
} }
return sclp; return sclp;
} }
@ -378,16 +379,6 @@ void sclp_service_interrupt(uint32_t sccb)
} }
/* qemu object creation and initialization functions */ /* qemu object creation and initialization functions */
void s390_sclp_init(void)
{
Object *new = object_new(TYPE_SCLP);
object_property_add_child(qdev_get_machine(), TYPE_SCLP, new);
object_unref(new);
qdev_realize(DEVICE(new), NULL, &error_fatal);
}
static void sclp_realize(DeviceState *dev, Error **errp) static void sclp_realize(DeviceState *dev, Error **errp)
{ {
MachineState *machine = MACHINE(qdev_get_machine()); MachineState *machine = MACHINE(qdev_get_machine());

View File

@ -203,6 +203,6 @@ struct SCLPEventFacilityClass {
bool (*event_pending)(SCLPEventFacility *ef); bool (*event_pending)(SCLPEventFacility *ef);
}; };
BusState *sclp_get_event_facility_bus(void); BusState *sclp_get_event_facility_bus(SCLPEventFacility *ef);
#endif #endif

View File

@ -13,6 +13,7 @@
#include "hw/boards.h" #include "hw/boards.h"
#include "qom/object.h" #include "qom/object.h"
#include "hw/s390x/sclp.h"
#define TYPE_S390_CCW_MACHINE "s390-ccw-machine" #define TYPE_S390_CCW_MACHINE "s390-ccw-machine"
@ -28,6 +29,8 @@ struct S390CcwMachineState {
bool dea_key_wrap; bool dea_key_wrap;
bool pv; bool pv;
uint8_t loadparm[8]; uint8_t loadparm[8];
SCLPDevice *sclp;
}; };
#define S390_PTF_REASON_NONE (0x00 << 8) #define S390_PTF_REASON_NONE (0x00 << 8)

View File

@ -221,8 +221,6 @@ static inline int sccb_data_len(SCCB *sccb)
return be16_to_cpu(sccb->h.length) - sizeof(sccb->h); return be16_to_cpu(sccb->h.length) - sizeof(sccb->h);
} }
void s390_sclp_init(void);
void sclp_service_interrupt(uint32_t sccb); void sclp_service_interrupt(uint32_t sccb);
void raise_irq_cpu_hotplug(void); void raise_irq_cpu_hotplug(void);
int sclp_service_call(S390CPU *cpu, uint64_t sccb, uint32_t code); int sclp_service_call(S390CPU *cpu, uint64_t sccb, uint32_t code);

View File

@ -20,11 +20,16 @@
# #
# @props: a dictionary of QOM properties to be applied # @props: a dictionary of QOM properties to be applied
# #
# @deprecated-props: a list of properties that are flagged as deprecated
# by the CPU vendor. These props are a subset of the full model's
# definition list of properties. (since 9.1)
#
# Since: 2.8 # Since: 2.8
## ##
{ 'struct': 'CpuModelInfo', { 'struct': 'CpuModelInfo',
'data': { 'name': 'str', 'data': { 'name': 'str',
'*props': 'any' } } '*props': 'any',
'*deprecated-props': ['str'] } }
## ##
# @CpuModelExpansionType: # @CpuModelExpansionType:

View File

@ -4824,7 +4824,8 @@ DEF("runas", HAS_ARG, QEMU_OPTION_runas, \
SRST SRST
``-runas user`` ``-runas user``
Immediately before starting guest execution, drop root privileges, Immediately before starting guest execution, drop root privileges,
switching to the specified user. switching to the specified user. This option is deprecated, use
``-run-with user=...`` instead.
ERST ERST
DEF("prom-env", HAS_ARG, QEMU_OPTION_prom_env, DEF("prom-env", HAS_ARG, QEMU_OPTION_prom_env,
@ -4990,13 +4991,15 @@ DEF("qtest-log", HAS_ARG, QEMU_OPTION_qtest_log, "", QEMU_ARCH_ALL)
#ifdef CONFIG_POSIX #ifdef CONFIG_POSIX
DEF("run-with", HAS_ARG, QEMU_OPTION_run_with, DEF("run-with", HAS_ARG, QEMU_OPTION_run_with,
"-run-with [async-teardown=on|off][,chroot=dir]\n" "-run-with [async-teardown=on|off][,chroot=dir][user=username|uid:gid]\n"
" Set miscellaneous QEMU process lifecycle options:\n" " Set miscellaneous QEMU process lifecycle options:\n"
" async-teardown=on enables asynchronous teardown (Linux only)\n" " async-teardown=on enables asynchronous teardown (Linux only)\n"
" chroot=dir chroot to dir just before starting the VM\n", " chroot=dir chroot to dir just before starting the VM\n"
" user=username switch to the specified user before starting the VM\n"
" user=uid:gid ditto, but use specified user-ID and group-ID instead\n",
QEMU_ARCH_ALL) QEMU_ARCH_ALL)
SRST SRST
``-run-with [async-teardown=on|off][,chroot=dir]`` ``-run-with [async-teardown=on|off][,chroot=dir][user=username|uid:gid]``
Set QEMU process lifecycle options. Set QEMU process lifecycle options.
``async-teardown=on`` enables asynchronous teardown. A new process called ``async-teardown=on`` enables asynchronous teardown. A new process called
@ -5013,6 +5016,10 @@ SRST
``chroot=dir`` can be used for doing a chroot to the specified directory ``chroot=dir`` can be used for doing a chroot to the specified directory
immediately before starting the guest execution. This is especially useful immediately before starting the guest execution. This is especially useful
in combination with -runas. in combination with -runas.
``user=username`` or ``user=uid:gid`` can be used to drop root privileges
by switching to the specified user (via username) or user and group
(via uid:gid) immediately before starting guest execution.
ERST ERST
#endif #endif

View File

@ -773,6 +773,10 @@ static QemuOptsList qemu_run_with_opts = {
.name = "chroot", .name = "chroot",
.type = QEMU_OPT_STRING, .type = QEMU_OPT_STRING,
}, },
{
.name = "user",
.type = QEMU_OPT_STRING,
},
{ /* end of list */ } { /* end of list */ }
}, },
}; };
@ -3587,6 +3591,7 @@ void qemu_init(int argc, char **argv)
break; break;
#if defined(CONFIG_POSIX) #if defined(CONFIG_POSIX)
case QEMU_OPTION_runas: case QEMU_OPTION_runas:
warn_report("-runas is deprecated, use '-run-with user=...' instead");
if (!os_set_runas(optarg)) { if (!os_set_runas(optarg)) {
error_report("User \"%s\" doesn't exist" error_report("User \"%s\" doesn't exist"
" (and is not <uid>:<gid>)", " (and is not <uid>:<gid>)",
@ -3613,6 +3618,16 @@ void qemu_init(int argc, char **argv)
if (str) { if (str) {
os_set_chroot(str); os_set_chroot(str);
} }
str = qemu_opt_get(opts, "user");
if (str) {
if (!os_set_runas(str)) {
error_report("User \"%s\" doesn't exist"
" (and is not <uid>:<gid>)",
optarg);
exit(1);
}
}
break; break;
} }
#endif /* CONFIG_POSIX */ #endif /* CONFIG_POSIX */

View File

@ -212,6 +212,23 @@ void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque,
}; };
} }
void s390_get_deprecated_features(S390FeatBitmap features)
{
static const int feats[] = {
/* CSSKE is deprecated on newer generations */
S390_FEAT_CONDITIONAL_SSKE,
S390_FEAT_BPB,
/* Deprecated on z16 */
S390_FEAT_CONSTRAINT_TRANSACTIONAL_EXE,
S390_FEAT_TRANSACTIONAL_EXE
};
int i;
for (i = 0; i < ARRAY_SIZE(feats); i++) {
set_bit(feats[i], features);
}
}
#define FEAT_GROUP_INIT(_name, _group, _desc) \ #define FEAT_GROUP_INIT(_name, _group, _desc) \
{ \ { \
.name = _name, \ .name = _name, \

View File

@ -69,6 +69,7 @@ void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type,
uint8_t *data); uint8_t *data);
void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque, void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque,
void (*fn)(const char *name, void *opaque)); void (*fn)(const char *name, void *opaque));
void s390_get_deprecated_features(S390FeatBitmap features);
/* Definition of a CPU feature group */ /* Definition of a CPU feature group */
typedef struct { typedef struct {

View File

@ -206,6 +206,14 @@ static void cpu_info_from_model(CpuModelInfo *info, const S390CPUModel *model,
} else { } else {
info->props = QOBJECT(qdict); info->props = QOBJECT(qdict);
} }
/* features flagged as deprecated */
bitmap_zero(bitmap, S390_FEAT_MAX);
s390_get_deprecated_features(bitmap);
bitmap_and(bitmap, bitmap, model->def->full_feat, S390_FEAT_MAX);
s390_feat_bitmap_to_ascii(bitmap, &info->deprecated_props, list_add_feat);
info->has_deprecated_props = !!info->deprecated_props;
} }
CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type, CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,

View File

@ -26,6 +26,14 @@ static const uint8_t bios_avr[] = {
0x80, 0x93, 0xc6, 0x00, /* sts 0x00C6, r24 ; Output 'T' */ 0x80, 0x93, 0xc6, 0x00, /* sts 0x00C6, r24 ; Output 'T' */
}; };
static const uint8_t bios_loongarch64[] = {
0x0c, 0xc0, 0x3f, 0x14, /* lu12i.w $t0, 0x1fe00 */
0x8c, 0x81, 0x87, 0x03, /* ori $t0, $t0, 0x1e0 */
0x0d, 0x50, 0x81, 0x03, /* li.w $t1, 'T' */
0x8d, 0x01, 0x00, 0x29, /* st.b $t1, $t0, 0 */
0xff, 0xf3, 0xff, 0x53, /* b -16 # loop */
};
static const uint8_t kernel_mcf5208[] = { static const uint8_t kernel_mcf5208[] = {
0x41, 0xf9, 0xfc, 0x06, 0x00, 0x00, /* lea 0xfc060000,%a0 */ 0x41, 0xf9, 0xfc, 0x06, 0x00, 0x00, /* lea 0xfc060000,%a0 */
0x10, 0x3c, 0x00, 0x54, /* move.b #'T',%d0 */ 0x10, 0x3c, 0x00, 0x54, /* move.b #'T',%d0 */
@ -167,6 +175,8 @@ static const testdef_t tests[] = {
{ "sparc", "SS-600MP", "", "TMS390Z55" }, { "sparc", "SS-600MP", "", "TMS390Z55" },
{ "sparc64", "sun4u", "", "UltraSPARC" }, { "sparc64", "sun4u", "", "UltraSPARC" },
{ "s390x", "s390-ccw-virtio", "", "device" }, { "s390x", "s390-ccw-virtio", "", "device" },
{ "loongarch64", "virt", "-cpu max", "TT", sizeof(bios_loongarch64),
NULL, bios_loongarch64 },
{ "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf5208 }, { "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf5208 },
{ "m68k", "next-cube", "", "TT", sizeof(bios_nextcube), 0, bios_nextcube }, { "m68k", "next-cube", "", "TT", sizeof(bios_nextcube), 0, bios_nextcube },
{ "microblaze", "petalogix-s3adsp1800", "", "TT", { "microblaze", "petalogix-s3adsp1800", "", "TT",

View File

@ -139,6 +139,9 @@ qtests_hppa = ['boot-serial-test'] + \
qtests_filter + \ qtests_filter + \
(config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : []) (config_all_devices.has_key('CONFIG_VGA') ? ['display-vga-test'] : [])
qtests_loongarch64 = qtests_filter + \
['boot-serial-test']
qtests_m68k = ['boot-serial-test'] + \ qtests_m68k = ['boot-serial-test'] + \
qtests_filter qtests_filter