Add boot-certs to s390-ccw-virtio machine type option

Introduce a new `boot-certs` machine type option for the s390-ccw-virtio
machine. This allows users to specify one or more certificate file paths
or directories to be used during secure boot.

Each entry is specified using the syntax:
	boot-certs.<index>.path=/path/to/cert.pem

Multiple paths can be specify using array properties:
	boot-certs.0.path=/path/to/cert.pem,
	boot-certs.1.path=/path/to/cert-dir,
	boot-certs.2.path=/path/to/another-dir...

Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Acked-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Link: https://lore.kernel.org/qemu-devel/20260730214624.2328883-2-zycai@linux.ibm.com
Signed-off-by: Eric Farman <farman@linux.ibm.com>
This commit is contained in:
Zhuoying Cai authored and Eric Farman committed 2026-08-26 06:52:20 -04:00
1 parent 220c67b0ec
commit 21efab616e
7 files changed
+94 -1

No files matched your search

+20
View File
@@ -0,0 +1,20 @@
.. SPDX-License-Identifier: GPL-2.0-or-later
Secure IPL Command Line Options
-------------------------------
The s390-ccw-virtio machine type supports secure IPL. These parameters allow
users to provide certificates and enable secure IPL directly via the command
line.
Providing Certificates
^^^^^^^^^^^^^^^^^^^^^^
The certificate store can be populated by supplying a list of X.509 certificate
file paths or directories containing certificate files on the command-line:
Note: certificate files must have a .pem extension.
.. code-block:: shell
qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=/.../qemu/certs,boot-certs.1.path=/another/path/cert.pem ...
+1
View File
@@ -35,3 +35,4 @@ Architectural features
s390x/bootdevices
s390x/protvirt
s390x/cpu-topology
s390x/secure-ipl
+41
View File
@@ -44,6 +44,7 @@
#include "target/s390x/kvm/pv.h"
#include "migration/blocker.h"
#include "qapi/visitor.h"
#include "qapi/qapi-visit-machine-s390x.h"
#include "hw/s390x/cpu-topology.h"
#include "kvm/kvm_s390x.h"
#include "hw/virtio/virtio-md-pci.h"
@@ -786,6 +787,36 @@ static void machine_set_loadparm(Object *obj, Visitor *v,
g_free(val);
}
static void machine_get_boot_certs(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
BootCertificatesList **certs = &ms->boot_certs;
visit_type_BootCertificatesList(v, name, certs, errp);
}
static void machine_set_boot_certs(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
S390CcwMachineClass *s390mc = S390_CCW_MACHINE_GET_CLASS(obj);
S390CcwMachineState *ms = S390_CCW_MACHINE(obj);
BootCertificatesList *cert_list = NULL;
if (!s390mc->use_certs) {
error_setg(errp, "boot-certs is not supported by this machine version");
return;
}
visit_type_BootCertificatesList(v, name, &cert_list, errp);
if (!cert_list) {
return;
}
ms->boot_certs = cert_list;
}
/*
* S390x-specific global compatibility properties.
*
@@ -811,6 +842,7 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
s390mc->max_threads = 1;
s390mc->use_cpi = true;
s390mc->use_certs = true;
mc->reset = s390_machine_reset;
mc->block_default_type = IF_VIRTIO;
mc->no_cdrom = 1;
@@ -854,6 +886,11 @@ static void ccw_machine_class_init(ObjectClass *oc, const void *data)
"Up to 8 chars in set of [A-Za-z0-9. ] (lower case chars converted"
" to upper case) to pass to machine loader, boot manager,"
" and guest kernel");
object_class_property_add(oc, "boot-certs", "BootCertificatesList",
machine_get_boot_certs, machine_set_boot_certs, NULL, NULL);
object_class_property_set_description(oc, "boot-certs",
"provide paths to a directory and/or a certificate file for secure boot");
}
static inline void s390_machine_initfn(Object *obj)
@@ -939,6 +976,10 @@ static void ccw_machine_11_1_instance_options(MachineState *machine)
static void ccw_machine_11_1_class_options(MachineClass *mc)
{
S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
s390mc->use_certs = false;
ccw_machine_11_2_class_options(mc);
compat_props_add(mc->compat_props, hw_compat_11_1, hw_compat_11_1_len);
}
+3
View File
@@ -14,6 +14,7 @@
#include "hw/core/boards.h"
#include "qom/object.h"
#include "hw/s390x/sclp.h"
#include "qapi/qapi-types-machine-s390x.h"
#define TYPE_S390_CCW_MACHINE "s390-ccw-machine"
@@ -31,6 +32,7 @@ struct S390CcwMachineState {
uint8_t loadparm[8];
uint64_t memory_limit;
uint64_t max_pagesize;
BootCertificatesList *boot_certs;
SCLPDevice *sclp;
};
@@ -55,6 +57,7 @@ struct S390CcwMachineClass {
/*< public >*/
int max_threads;
bool use_cpi;
bool use_certs;
};
#endif
+23
View File
@@ -140,3 +140,26 @@
{ 'event': 'SCLP_CPI_INFO_AVAILABLE',
'features': [ 'unstable' ]
}
##
# @BootCertificates:
#
# Boot certificates for secure IPL.
#
# @path: path to an X.509 certificate file or a directory containing
# certificate files.
#
# Since: 11.2
##
{ 'struct': 'BootCertificates',
'data': {'path': 'str'} }
##
# @DummyBootCertificates:
#
# Not used by QMP; hack to let us use BootCertificatesList internally.
#
# Since: 11.2
##
{ 'struct': 'DummyBootCertificates',
'data': {'unused-boot-certs': ['BootCertificates'] } }
+1
View File
@@ -49,6 +49,7 @@
'DisplayProtocol',
'DriveBackupWrapper',
'DummyBlockCoreForceArrays',
'DummyBootCertificates',
'DummyForceArrays',
'DummyVirtioForceArrays',
'HotKeyMod',
+5 -1
View File
@@ -46,7 +46,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
" memory-backend='backend-id' specifies explicitly provided backend for main RAM (default=none)\n"
" cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n"
" sgx-epc.0.memdev=memid,sgx-epc.0.node=numaid\n"
" smp-cache.0.cache=cachename,smp-cache.0.topology=topologylevel\n",
" smp-cache.0.cache=cachename,smp-cache.0.topology=topologylevel\n"
" boot-certs.0.path=/path/directory,boot-certs.1.path=/path/file provides paths to a directory and/or a certificate file\n",
QEMU_ARCH_ALL)
SRST
``-machine [type=]name[,prop=value[,...]]``
@@ -214,6 +215,9 @@ SRST
::
-machine smp-cache.0.cache=l1d,smp-cache.0.topology=core,smp-cache.1.cache=l1i,smp-cache.1.topology=core
``boot-certs.0.path=/path/directory,boot-certs.1.path=/path/file``
Provide paths to a directory and/or a certificate file on the host [s390x only].
ERST
DEF("M", HAS_ARG, QEMU_OPTION_M,