By adding a new input panel with an AMD SEV technology selection combo
box and checkboxes for the optional parameters in an advanced section,
the user can configure the amd_sev option via the WebUI's Options tab.

Signed-off-by: Markus Frank <m.fr...@proxmox.com>
---
changes v12:
* nothing changed

 www/manager6/Makefile        |   1 +
 www/manager6/qemu/Options.js |  11 ++++
 www/manager6/qemu/SevEdit.js | 121 +++++++++++++++++++++++++++++++++++
 3 files changed, 133 insertions(+)
 create mode 100644 www/manager6/qemu/SevEdit.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 2c3a822b..801683a3 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -264,6 +264,7 @@ JSSRC=                                                      
\
        qemu/SSHKey.js                                  \
        qemu/ScsiHwEdit.js                              \
        qemu/SerialEdit.js                              \
+       qemu/SevEdit.js                                 \
        qemu/Smbios1Edit.js                             \
        qemu/SystemEdit.js                              \
        qemu/USBEdit.js                                 \
diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
index 7b112400..6907699c 100644
--- a/www/manager6/qemu/Options.js
+++ b/www/manager6/qemu/Options.js
@@ -338,6 +338,17 @@ Ext.define('PVE.qemu.Options', {
                    },
                } : undefined,
            },
+           amd_sev: {
+               header: gettext('AMD SEV'),
+               editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.SevEdit' : 
undefined,
+               defaultValue: Proxmox.Utils.defaultText + ' (' + 
Proxmox.Utils.disabledText + ')',
+               renderer: function(value, metaData, record, ri, ci, store, 
pending) {
+                   let amd_sev = PVE.Parser.parsePropertyString(value, "type");
+                   if (amd_sev.type === 'std') return 'AMD SEV (' + value + 
')';
+                   if (amd_sev.type === 'es') return 'AMD SEV-ES (' + value + 
')';
+                   return value;
+               },
+           },
            hookscript: {
                header: gettext('Hookscript'),
            },
diff --git a/www/manager6/qemu/SevEdit.js b/www/manager6/qemu/SevEdit.js
new file mode 100644
index 00000000..db7ff3a8
--- /dev/null
+++ b/www/manager6/qemu/SevEdit.js
@@ -0,0 +1,121 @@
+Ext.define('PVE.qemu.SevInputPanel', {
+    extend: 'Proxmox.panel.InputPanel',
+    xtype: 'pveSevInputPanel',
+    onlineHelp: 'qm_memory_encryption',
+
+    viewModel: {
+       data: {
+           type: '__default__',
+       },
+       formulas: {
+           sevEnabled: get => get('type') !== '__default__',
+       },
+    },
+
+    onGetValues: function(values) {
+       if (values.delete === 'type') {
+           values.delete = 'amd_sev';
+           return values;
+       }
+       if (!values.debug) {
+           values["no-debug"] = 1;
+       }
+       if (!values["key-sharing"]) {
+           values["no-key-sharing"] = 1;
+       }
+       delete values.debug;
+       delete values["key-sharing"];
+       let ret = {};
+       ret.amd_sev = PVE.Parser.printPropertyString(values, 'type');
+       return ret;
+    },
+
+
+    setValues: function(values) {
+       if (PVE.Parser.parseBoolean(values["no-debug"])) {
+           values.debug = 0;
+       }
+       if (PVE.Parser.parseBoolean(values["no-key-sharing"])) {
+           values["key-sharing"] = 0;
+       }
+       this.callParent(arguments);
+    },
+
+    items: {
+       xtype: 'proxmoxKVComboBox',
+       fieldLabel: gettext('AMD Secure Encrypted Virtualization (SEV)'),
+       labelWidth: 150,
+       name: 'type',
+       value: '__default__',
+       comboItems: [
+           ['__default__', Proxmox.Utils.defaultText + ' (' + 
Proxmox.Utils.disabledText + ')'],
+           ['std', 'AMD SEV'],
+           ['es', 'AMD SEV-ES (highly experimental)'],
+       ],
+       bind: {
+           value: '{type}',
+       },
+    },
+
+    advancedItems: [
+       {
+           xtype: 'proxmoxcheckbox',
+           fieldLabel: gettext('Allow Debugging'),
+           labelWidth: 150,
+           name: 'debug',
+           value: 1,
+           bind: {
+               hidden: '{!sevEnabled}',
+               disabled: '{!sevEnabled}',
+           },
+       },
+       {
+           xtype: 'proxmoxcheckbox',
+           fieldLabel: gettext('Allow Key-Sharing'),
+           labelWidth: 150,
+           name: 'key-sharing',
+           value: 1,
+           bind: {
+               hidden: '{!sevEnabled}',
+               disabled: '{!sevEnabled}',
+           },
+       },
+       {
+           xtype: 'proxmoxcheckbox',
+           fieldLabel: gettext('Enable Kernel Hashes'),
+           labelWidth: 150,
+           name: 'kernel-hashes',
+           deleteDefaultValue: false,
+           bind: {
+               hidden: '{!sevEnabled}',
+               disabled: '{!sevEnabled}',
+           },
+       },
+    ],
+});
+
+Ext.define('PVE.qemu.SevEdit', {
+    extend: 'Proxmox.window.Edit',
+
+    subject: gettext('SEV'),
+
+    items: {
+       xtype: 'pveSevInputPanel',
+    },
+
+    width: 400,
+
+    initComponent: function() {
+       let me = this;
+
+       me.callParent();
+
+       me.load({
+           success: function(response) {
+               let conf = response.result.data;
+               let amd_sev = conf.amd_sev || '__default__';
+               me.setValues(PVE.Parser.parsePropertyString(amd_sev, 'type'));
+           },
+       });
+    },
+});
-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to