|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 10/16] xl/coco: Introduce confidential computing support
From: Vaishali Thakkar <vaishali.thakkar@xxxxxxxx>
Signed-off-by: Vaishali Thakkar <vaishali.thakkar@xxxxxxxx>
Signed-off-by: Teddy Astie <teddy.astie@xxxxxxxxxx>
---
tools/include/libxl.h | 5 ++++
tools/include/xenctrl.h | 4 ++++
tools/include/xenguest.h | 1 +
tools/libs/ctrl/xc_domain.c | 36 +++++++++++++++++++++++++++++
tools/libs/guest/Makefile.common | 2 ++
tools/libs/guest/xg_dom_boot.c | 33 +++++++++++++++++++++++++++
tools/libs/guest/xg_dom_coco.c | 35 ++++++++++++++++++++++++++++
tools/libs/guest/xg_dom_coco.h | 39 ++++++++++++++++++++++++++++++++
tools/libs/guest/xg_dom_x86.c | 1 +
tools/libs/light/libxl_cpuid.c | 1 +
tools/libs/light/libxl_create.c | 4 ++++
tools/libs/light/libxl_dom.c | 1 +
tools/libs/light/libxl_types.idl | 1 +
tools/libs/util/libxlu_disk_l.c | 13 ++++-------
tools/libs/util/libxlu_disk_l.h | 7 ++----
tools/misc/xen-cpuid.c | 1 +
tools/ocaml/libs/xc/xenctrl.ml | 1 +
tools/ocaml/libs/xc/xenctrl.mli | 1 +
tools/xl/xl_parse.c | 2 ++
19 files changed, 175 insertions(+), 13 deletions(-)
create mode 100644 tools/libs/guest/xg_dom_coco.c
create mode 100644 tools/libs/guest/xg_dom_coco.h
diff --git a/tools/include/libxl.h b/tools/include/libxl.h
index b7ad7735ca..e75179b604 100644
--- a/tools/include/libxl.h
+++ b/tools/include/libxl.h
@@ -178,6 +178,11 @@
*/
#define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1
+/*
+ * The libxl_domain_build_info has the coco field.
+*/
+#define LIBXL_HAVE_BUILDINFO_COCO 1
+
/*
* libxl_domain_build_info has the u.hvm.ms_vm_genid field.
*/
diff --git a/tools/include/xenctrl.h b/tools/include/xenctrl.h
index 4955981231..aae228da44 100644
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -46,6 +46,7 @@
#include <xen/xsm/flask_op.h>
#include <xen/kexec.h>
#include <xen/platform.h>
+#include <xen/hvm/coco.h>
#include "xentoollog.h"
#include "xen-barrier.h"
@@ -1682,6 +1683,9 @@ int xc_hvm_param_get(xc_interface *handle, uint32_t dom,
uint32_t param, uint64_
int xc_set_hvm_param(xc_interface *handle, uint32_t dom, int param, unsigned
long value);
int xc_get_hvm_param(xc_interface *handle, uint32_t dom, int param, unsigned
long *value);
+int xc_coco_platform_status(xc_interface *handle, coco_platform_status_t
*status);
+int xc_coco_prepare_initial_mem(xc_interface *handle,
coco_prepare_initial_mem_t *cmd);
+
/* HVM guest pass-through */
int xc_assign_device(xc_interface *xch,
uint32_t domid,
diff --git a/tools/include/xenguest.h b/tools/include/xenguest.h
index e01f494b77..9d36fa5665 100644
--- a/tools/include/xenguest.h
+++ b/tools/include/xenguest.h
@@ -219,6 +219,7 @@ struct xc_dom_image {
xen_paddr_t lowmem_end;
xen_paddr_t highmem_end;
xen_pfn_t vga_hole_size;
+ bool coco; /* 1 if this is a confidential computing guest, 0 otherwise */
/* If unset disables the setup of the IOREQ pages. */
bool device_model;
diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
index 2ddc3f4f42..66b6c146f4 100644
--- a/tools/libs/ctrl/xc_domain.c
+++ b/tools/libs/ctrl/xc_domain.c
@@ -20,8 +20,10 @@
*/
#include "xc_private.h"
+#include "xenctrl.h"
#include <xen/memory.h>
#include <xen/hvm/hvm_op.h>
+#include <xen/hvm/coco.h>
int xc_domain_create(xc_interface *xch, uint32_t *pdomid,
struct xen_domctl_createdomain *config)
@@ -1496,6 +1498,40 @@ int xc_get_hvm_param(xc_interface *handle, uint32_t dom,
int param, unsigned lon
return 0;
}
+int xc_coco_platform_status(xc_interface *handle, coco_platform_status_t
*status)
+{
+ DECLARE_HYPERCALL_BUFFER(coco_platform_status_t, arg);
+ int rc;
+
+ arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg));
+ if ( arg == NULL )
+ return -1;
+ memcpy(arg, status, sizeof(coco_platform_status_t));
+
+ rc = xencall2(handle->xcall, __HYPERVISOR_coco_op,
XEN_COCO_platform_status,
+ HYPERCALL_BUFFER_AS_ARG(arg));
+
+ xc_hypercall_buffer_free(handle, arg);
+ return rc;
+}
+
+int xc_coco_prepare_initial_mem(xc_interface *handle,
coco_prepare_initial_mem_t *cmd)
+{
+ DECLARE_HYPERCALL_BUFFER(coco_prepare_initial_mem_t, arg);
+ int rc;
+
+ arg = xc_hypercall_buffer_alloc(handle, arg, sizeof(*arg));
+ if ( arg == NULL )
+ return -1;
+ memcpy(arg, cmd, sizeof(coco_prepare_initial_mem_t));
+
+ rc = xencall2(handle->xcall, __HYPERVISOR_coco_op,
XEN_COCO_prepare_initial_mem,
+ HYPERCALL_BUFFER_AS_ARG(arg));
+
+ xc_hypercall_buffer_free(handle, arg);
+ return rc;
+}
+
int xc_domain_setdebugging(xc_interface *xch,
uint32_t domid,
unsigned int enable)
diff --git a/tools/libs/guest/Makefile.common b/tools/libs/guest/Makefile.common
index a026a2f662..64ede46a05 100644
--- a/tools/libs/guest/Makefile.common
+++ b/tools/libs/guest/Makefile.common
@@ -41,6 +41,8 @@ endif
# new domain builder
OBJS-y += xg_dom_core.o
OBJS-y += xg_dom_boot.o
+# TODO: add something like CONFIG_COCO ?
+OBJS-y += xg_dom_coco.o
OBJS-y += xg_dom_elfloader.o
OBJS-$(CONFIG_X86) += xg_dom_bzimageloader.o
OBJS-$(CONFIG_X86) += xg_dom_decompress_lz4.o
diff --git a/tools/libs/guest/xg_dom_boot.c b/tools/libs/guest/xg_dom_boot.c
index 5c7e12221d..6566784161 100644
--- a/tools/libs/guest/xg_dom_boot.c
+++ b/tools/libs/guest/xg_dom_boot.c
@@ -32,9 +32,13 @@
#include "xg_private.h"
#include "xg_core.h"
+#include "xg_dom_coco.h"
#include <xen/hvm/params.h>
#include <xen/grant_table.h>
+#define round_pgup(_p) (((_p)+(PAGE_SIZE_X86-1))&PAGE_MASK_X86)
+#define round_pgdown(_p) ((_p)&PAGE_MASK_X86)
+
/* ------------------------------------------------------------------------ */
static int setup_hypercall_page(struct xc_dom_image *dom)
@@ -201,6 +205,35 @@ int xc_dom_boot_image(struct xc_dom_image *dom)
if ( (rc = dom->arch_hooks->bootlate(dom)) != 0 )
return rc;
+ // Encrypt domain pages
+ if ( dom->coco )
+ {
+ struct xc_dom_seg initrd_seg = {
+ .pfn = dom->initrd_start >> XC_DOM_PAGE_SHIFT(dom),
+ .pages = dom->initrd_len >> XC_DOM_PAGE_SHIFT(dom)
+ };
+
+ if ( (rc = xg_dom_coco_encrypt_seg(dom->xch, dom, dom->kernel_seg,
"kernel") != 0) )
+ return rc;
+ if ( initrd_seg.pages && (rc = xg_dom_coco_encrypt_seg(dom->xch, dom,
initrd_seg, "ramdisk") != 0) )
+ return rc;
+ if ( (rc = xg_dom_coco_encrypt_seg(dom->xch, dom, dom->start_info_seg,
"start_info") != 0) )
+ return rc;
+
+ for ( int i = 0; i < MAX_ACPI_MODULES; i++ )
+ {
+ struct xc_dom_seg seg;
+ seg.pfn = dom->acpi_modules[i].guest_addr_out >>
XC_DOM_PAGE_SHIFT(dom);
+ seg.pages = round_pgup(dom->acpi_modules[i].length) >>
XC_DOM_PAGE_SHIFT(dom);
+
+ if ( !seg.pfn || !seg.pages )
+ continue;
+
+ if ( (rc = xg_dom_coco_encrypt_seg(dom->xch, dom, seg, "acpi
module")) != 0 )
+ return rc;
+ }
+ }
+
/* let the vm run */
if ( (rc = dom->arch_hooks->vcpu(dom)) != 0 )
return rc;
diff --git a/tools/libs/guest/xg_dom_coco.c b/tools/libs/guest/xg_dom_coco.c
new file mode 100644
index 0000000000..f47b59fa49
--- /dev/null
+++ b/tools/libs/guest/xg_dom_coco.c
@@ -0,0 +1,35 @@
+/*
+ * Confidential computing support.
+ * Copyright (c) 2024 Teddy Astie <teddy.astie@xxxxxxxxxx>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "xg_private.h"
+#include "xenctrl.h"
+#include "xg_dom_coco.h"
+
+int xg_dom_coco_encrypt_seg(xc_interface *xch, struct xc_dom_image *dom,
+ struct xc_dom_seg seg, const char *name)
+{
+ coco_prepare_initial_mem_t cmd;
+ DPRINTF("coco: Encrypting pfn:[%"PRI_xen_pfn"-%"PRI_xen_pfn"] (%s)\n",
+ seg.pfn, seg.pfn + seg.pages, name);
+
+ cmd.domid = dom->guest_domid;
+ cmd.gfn = seg.pfn;
+ cmd.count = seg.pages;
+
+ return xc_coco_prepare_initial_mem(xch, &cmd);
+}
\ No newline at end of file
diff --git a/tools/libs/guest/xg_dom_coco.h b/tools/libs/guest/xg_dom_coco.h
new file mode 100644
index 0000000000..eac0fa66e3
--- /dev/null
+++ b/tools/libs/guest/xg_dom_coco.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
+ * VA Linux Systems Japan K.K.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef XC_DOM_COCO_H
+#define XC_DOM_COCO_H
+
+#include "xg_private.h"
+#include "xenctrl.h"
+
+int xg_dom_coco_encrypt_seg(xc_interface *xch, struct xc_dom_image *dom,
+ struct xc_dom_seg seg, const char *name);
+
+#endif /* XC_DOM_COCO_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/tools/libs/guest/xg_dom_x86.c b/tools/libs/guest/xg_dom_x86.c
index cba01384ae..93407bf192 100644
--- a/tools/libs/guest/xg_dom_x86.c
+++ b/tools/libs/guest/xg_dom_x86.c
@@ -103,6 +103,7 @@ struct xc_dom_image_x86 {
#define MAPPING_MAX 2
struct xc_dom_x86_mapping maps[MAPPING_MAX];
const struct xc_dom_params *params;
+ bool coco;
/* PV: Pointer to the in-guest P2M. */
void *p2m_guest;
diff --git a/tools/libs/light/libxl_cpuid.c b/tools/libs/light/libxl_cpuid.c
index 063fe86eb7..9891c42a5b 100644
--- a/tools/libs/light/libxl_cpuid.c
+++ b/tools/libs/light/libxl_cpuid.c
@@ -342,6 +342,7 @@ int libxl_cpuid_parse_config(libxl_cpuid_policy_list
*policy, const char* str)
CPUID_ENTRY(0x00000007, 1, CPUID_REG_EDX),
MSR_ENTRY(0x10a, CPUID_REG_EAX),
MSR_ENTRY(0x10a, CPUID_REG_EDX),
+ CPUID_ENTRY(0x8000001f, NA, CPUID_REG_EAX),
#undef MSR_ENTRY
#undef CPUID_ENTRY
};
diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
index e03599ea99..185f7946f4 100644
--- a/tools/libs/light/libxl_create.c
+++ b/tools/libs/light/libxl_create.c
@@ -93,6 +93,7 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
libxl_defbool_setdefault(&b_info->device_model_stubdomain, false);
libxl_defbool_setdefault(&b_info->vpmu, false);
+ libxl_defbool_setdefault(&b_info->coco, false);
if (libxl_defbool_val(b_info->device_model_stubdomain) &&
!b_info->device_model_ssidref)
@@ -667,6 +668,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config
*d_config,
if (libxl_defbool_val(b_info->vpmu))
create.flags |= XEN_DOMCTL_CDF_vpmu;
+ if (libxl_defbool_val(b_info->coco))
+ create.flags |= XEN_DOMCTL_CDF_coco;
+
assert(info->passthrough != LIBXL_PASSTHROUGH_DEFAULT);
LOG(DETAIL, "passthrough: %s",
libxl_passthrough_to_string(info->passthrough));
diff --git a/tools/libs/light/libxl_dom.c b/tools/libs/light/libxl_dom.c
index 94fef37401..778dac2286 100644
--- a/tools/libs/light/libxl_dom.c
+++ b/tools/libs/light/libxl_dom.c
@@ -1081,6 +1081,7 @@ int libxl__build_hvm(libxl__gc *gc, uint32_t domid,
}
dom->container_type = XC_DOM_HVM_CONTAINER;
+ dom->coco = libxl_defbool_val(info->coco);
/* The params from the configuration file are in Mb, which are then
* multiplied by 1 Kb. This was then divided off when calling
diff --git a/tools/libs/light/libxl_types.idl b/tools/libs/light/libxl_types.idl
index 9bb2969931..bb27e27148 100644
--- a/tools/libs/light/libxl_types.idl
+++ b/tools/libs/light/libxl_types.idl
@@ -637,6 +637,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
("nested_hvm", libxl_defbool),
("apic", libxl_defbool),
("dm_restrict", libxl_defbool),
+ ("coco", libxl_defbool),
("tee", libxl_tee_type),
("u", KeyedUnion(None, libxl_domain_type, "type",
[("hvm", Struct(None, [("firmware", string),
diff --git a/tools/libs/util/libxlu_disk_l.c b/tools/libs/util/libxlu_disk_l.c
index 0c180fff52..4924162a51 100644
--- a/tools/libs/util/libxlu_disk_l.c
+++ b/tools/libs/util/libxlu_disk_l.c
@@ -1,10 +1,7 @@
#line 1 "libxlu_disk_l.c"
-#line 31 "libxlu_disk_l.l"
#define _GNU_SOURCE
-
-
-#line 7 "libxlu_disk_l.c"
+#line 4 "libxlu_disk_l.c"
#define YY_INT_ALIGNED short int
@@ -1257,9 +1254,9 @@ static int vdev_and_devtype(DiskParseContext *dpc, char
*str) {
#undef DPC /* needs to be defined differently the actual lexer */
#define DPC ((DiskParseContext*)yyextra)
-#line 1260 "libxlu_disk_l.c"
+#line 1257 "libxlu_disk_l.c"
-#line 1262 "libxlu_disk_l.c"
+#line 1259 "libxlu_disk_l.c"
#define INITIAL 0
#define LEXERR 1
@@ -1541,7 +1538,7 @@ YY_DECL
#line 188 "libxlu_disk_l.l"
/*----- the scanner rules which do the parsing -----*/
-#line 1544 "libxlu_disk_l.c"
+#line 1541 "libxlu_disk_l.c"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is
reached */
{
@@ -1920,7 +1917,7 @@ YY_RULE_SETUP
#line 306 "libxlu_disk_l.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
-#line 1923 "libxlu_disk_l.c"
+#line 1920 "libxlu_disk_l.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(LEXERR):
yyterminate();
diff --git a/tools/libs/util/libxlu_disk_l.h b/tools/libs/util/libxlu_disk_l.h
index c868422568..027fd96c49 100644
--- a/tools/libs/util/libxlu_disk_l.h
+++ b/tools/libs/util/libxlu_disk_l.h
@@ -3,12 +3,9 @@
#define xlu__disk_yyIN_HEADER 1
#line 5 "libxlu_disk_l.h"
-#line 31 "libxlu_disk_l.l"
#define _GNU_SOURCE
-
-
-#line 11 "libxlu_disk_l.h"
+#line 8 "libxlu_disk_l.h"
#define YY_INT_ALIGNED short int
@@ -699,6 +696,6 @@ extern int yylex (yyscan_t yyscanner);
#line 306 "libxlu_disk_l.l"
-#line 702 "libxlu_disk_l.h"
+#line 699 "libxlu_disk_l.h"
#undef xlu__disk_yyIN_HEADER
#endif /* xlu__disk_yyHEADER_H */
diff --git a/tools/misc/xen-cpuid.c b/tools/misc/xen-cpuid.c
index 4c4593528d..10a2e603e9 100644
--- a/tools/misc/xen-cpuid.c
+++ b/tools/misc/xen-cpuid.c
@@ -37,6 +37,7 @@ static const struct {
{ "CPUID 0x00000007:1.edx", "7d1" },
{ "MSR_ARCH_CAPS.lo", "m10Al" },
{ "MSR_ARCH_CAPS.hi", "m10Ah" },
+ { "CPUID 0x8000001f.eax", "e1fa" },
};
#define COL_ALIGN "24"
diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml
index 2690f9a923..256adf0054 100644
--- a/tools/ocaml/libs/xc/xenctrl.ml
+++ b/tools/ocaml/libs/xc/xenctrl.ml
@@ -70,6 +70,7 @@ type domain_create_flag =
| CDF_IOMMU
| CDF_NESTED_VIRT
| CDF_VPMU
+ | CDF_COCO
type domain_create_iommu_opts =
| IOMMU_NO_SHAREPT
diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli
index febbe1f6ae..9ca55af05a 100644
--- a/tools/ocaml/libs/xc/xenctrl.mli
+++ b/tools/ocaml/libs/xc/xenctrl.mli
@@ -63,6 +63,7 @@ type domain_create_flag =
| CDF_IOMMU
| CDF_NESTED_VIRT
| CDF_VPMU
+ | CDF_COCO
type domain_create_iommu_opts =
| IOMMU_NO_SHAREPT
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 089a88935a..0ddec0815b 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -2993,6 +2993,8 @@ skip_usbdev:
xlu_cfg_get_defbool(config, "vpmu", &b_info->vpmu, 0);
+ xlu_cfg_get_defbool(config, "coco", &b_info->coco, 0);
+
xlu_cfg_destroy(config);
}
--
2.49.0
Teddy Astie | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |