mirror of
https://gitlab.com/qemu-project/qemu.git
synced 2026-10-28 14:04:39 +08:00
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:
1 parent
220c67b0ec
commit
21efab616e
7 files changed
+94
-1
No files matched your search
@@ -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 ...
|
||||
@@ -35,3 +35,4 @@ Architectural features
|
||||
s390x/bootdevices
|
||||
s390x/protvirt
|
||||
s390x/cpu-topology
|
||||
s390x/secure-ipl
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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'] } }
|
||||
@@ -49,6 +49,7 @@
|
||||
'DisplayProtocol',
|
||||
'DriveBackupWrapper',
|
||||
'DummyBlockCoreForceArrays',
|
||||
'DummyBootCertificates',
|
||||
'DummyForceArrays',
|
||||
'DummyVirtioForceArrays',
|
||||
'HotKeyMod',
|
||||
|
||||
+5
-1
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user