diff options
author | Giedrius Statkevičius <giedriuswork@gmail.com> | 2020-11-11 22:45:58 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-02-17 15:31:29 +0900 |
commit | 68337e55f62cf49b7bdfb73dc5662e23b0ea17fa (patch) | |
tree | 494f0944d4b54579df479c6a9dd06ef0809376a3 /src/shared/condition.c | |
parent | b1b4e9204c8260956825e2b9733c95903e215e31 (diff) | |
download | systemd-68337e55f62cf49b7bdfb73dc5662e23b0ea17fa.tar.gz |
condition: add CPUFeature
Taking a stab at implementing #14479.
Add {Condition,Assert}CPUFeature to `systemd-analyze` & friends. Implement it
by executing the CPUID instruction. Add tables for common x86/i386
features.
Tested via unit tests + checked that commands such as:
```bash
systemd-analyze condition 'AssertCPUFeature = rdrand'
```
Succeed as expected and that commands such as
```bash
systemd-analyze condition 'AssertCPUFeature = foobar'
```
Fail as expected. Finally, I have amended the `systemd.unit` manual page
with the new condition and the list of all currently supported flags.
Diffstat (limited to 'src/shared/condition.c')
-rw-r--r-- | src/shared/condition.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/shared/condition.c b/src/shared/condition.c index 485b3bab39..1e63956c05 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -756,6 +756,14 @@ static int condition_test_path_is_read_write(Condition *c, char **env) { return path_is_read_only_fs(c->parameter) <= 0; } +static int condition_test_cpufeature(Condition *c, char **env) { + assert(c); + assert(c->parameter); + assert(c->type == CONDITION_CPU_FEATURE); + + return has_cpu_with_flag(ascii_strlower(c->parameter)); +} + static int condition_test_path_is_encrypted(Condition *c, char **env) { int r; @@ -834,6 +842,7 @@ int condition_test(Condition *c, char **env) { [CONDITION_CPUS] = condition_test_cpus, [CONDITION_MEMORY] = condition_test_memory, [CONDITION_ENVIRONMENT] = condition_test_environment, + [CONDITION_CPU_FEATURE] = condition_test_cpufeature, }; int r, b; @@ -956,6 +965,7 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = { [CONDITION_CPUS] = "ConditionCPUs", [CONDITION_MEMORY] = "ConditionMemory", [CONDITION_ENVIRONMENT] = "ConditionEnvironment", + [CONDITION_CPU_FEATURE] = "ConditionCPUFeature", }; DEFINE_STRING_TABLE_LOOKUP(condition_type, ConditionType); @@ -987,6 +997,7 @@ static const char* const assert_type_table[_CONDITION_TYPE_MAX] = { [CONDITION_CPUS] = "AssertCPUs", [CONDITION_MEMORY] = "AssertMemory", [CONDITION_ENVIRONMENT] = "AssertEnvironment", + [CONDITION_CPU_FEATURE] = "AssertCPUFeature", }; DEFINE_STRING_TABLE_LOOKUP(assert_type, ConditionType); |