vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / hardware / cpu / amd-sev.nix
blob8dae958bf344ab9a87692dc41cc310ef27a5283a
1 { config, options, lib, ... }:
2 let
3   cfgSev = config.hardware.cpu.amd.sev;
4   cfgSevGuest = config.hardware.cpu.amd.sevGuest;
6   optionsFor = device: group: {
7     enable = lib.mkEnableOption "access to the AMD ${device} device";
8     user = lib.mkOption {
9       description = "Owner to assign to the ${device} device.";
10       type = lib.types.str;
11       default = "root";
12     };
13     group = lib.mkOption {
14       description = "Group to assign to the ${device} device.";
15       type = lib.types.str;
16       default = group;
17     };
18     mode = lib.mkOption {
19       description = "Mode to set for the ${device} device.";
20       type = lib.types.str;
21       default = "0660";
22     };
23   };
25 with lib; {
26   options.hardware.cpu.amd.sev = optionsFor "SEV" "sev";
28   options.hardware.cpu.amd.sevGuest = optionsFor "SEV guest" "sev-guest";
30   config = lib.mkMerge [
31     # /dev/sev
32     (lib.mkIf cfgSev.enable {
33       assertions = [
34         {
35           assertion = lib.hasAttr cfgSev.user config.users.users;
36           message = "Given user does not exist";
37         }
38         {
39           assertion = (cfgSev.group == options.hardware.cpu.amd.sev.group.default) || (lib.hasAttr cfgSev.group config.users.groups);
40           message = "Given group does not exist";
41         }
42       ];
44       boot.extraModprobeConfig = ''
45         options kvm_amd sev=1
46       '';
48       users.groups = lib.optionalAttrs (cfgSev.group == options.hardware.cpu.amd.sev.group.default) {
49         "${cfgSev.group}" = { };
50       };
52       services.udev.extraRules = with cfgSev; ''
53         KERNEL=="sev", OWNER="${user}", GROUP="${group}", MODE="${mode}"
54       '';
55     })
57     # /dev/sev-guest
58     (lib.mkIf cfgSevGuest.enable {
59       assertions = [
60         {
61           assertion = lib.hasAttr cfgSevGuest.user config.users.users;
62           message = "Given user does not exist";
63         }
64         {
65           assertion = (cfgSevGuest.group == options.hardware.cpu.amd.sevGuest.group.default) || (lib.hasAttr cfgSevGuest.group config.users.groups);
66           message = "Given group does not exist";
67         }
68       ];
70       users.groups = lib.optionalAttrs (cfgSevGuest.group == options.hardware.cpu.amd.sevGuest.group.default) {
71         "${cfgSevGuest.group}" = { };
72       };
74       services.udev.extraRules = with cfgSevGuest; ''
75         KERNEL=="sev-guest", OWNER="${user}", GROUP="${group}", MODE="${mode}"
76       '';
77     })
78   ];