hypercalls.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (C) 2019 Arm Ltd.
  3. #include <linux/arm-smccc.h>
  4. #include <linux/kvm_host.h>
  5. #include <asm/kvm_emulate.h>
  6. #include <kvm/arm_hypercalls.h>
  7. #include <kvm/arm_psci.h>
  8. #define KVM_ARM_SMCCC_STD_FEATURES \
  9. GENMASK(KVM_REG_ARM_STD_BMAP_BIT_COUNT - 1, 0)
  10. #define KVM_ARM_SMCCC_STD_HYP_FEATURES \
  11. GENMASK(KVM_REG_ARM_STD_HYP_BMAP_BIT_COUNT - 1, 0)
  12. #define KVM_ARM_SMCCC_VENDOR_HYP_FEATURES \
  13. GENMASK(KVM_REG_ARM_VENDOR_HYP_BMAP_BIT_COUNT - 1, 0)
  14. static void kvm_ptp_get_time(struct kvm_vcpu *vcpu, u64 *val)
  15. {
  16. struct system_time_snapshot systime_snapshot;
  17. u64 cycles = ~0UL;
  18. u32 feature;
  19. /*
  20. * system time and counter value must captured at the same
  21. * time to keep consistency and precision.
  22. */
  23. ktime_get_snapshot(&systime_snapshot);
  24. /*
  25. * This is only valid if the current clocksource is the
  26. * architected counter, as this is the only one the guest
  27. * can see.
  28. */
  29. if (systime_snapshot.cs_id != CSID_ARM_ARCH_COUNTER)
  30. return;
  31. /*
  32. * The guest selects one of the two reference counters
  33. * (virtual or physical) with the first argument of the SMCCC
  34. * call. In case the identifier is not supported, error out.
  35. */
  36. feature = smccc_get_arg1(vcpu);
  37. switch (feature) {
  38. case KVM_PTP_VIRT_COUNTER:
  39. cycles = systime_snapshot.cycles - vcpu->kvm->arch.timer_data.voffset;
  40. break;
  41. case KVM_PTP_PHYS_COUNTER:
  42. cycles = systime_snapshot.cycles - vcpu->kvm->arch.timer_data.poffset;
  43. break;
  44. default:
  45. return;
  46. }
  47. /*
  48. * This relies on the top bit of val[0] never being set for
  49. * valid values of system time, because that is *really* far
  50. * in the future (about 292 years from 1970, and at that stage
  51. * nobody will give a damn about it).
  52. */
  53. val[0] = upper_32_bits(systime_snapshot.real);
  54. val[1] = lower_32_bits(systime_snapshot.real);
  55. val[2] = upper_32_bits(cycles);
  56. val[3] = lower_32_bits(cycles);
  57. }
  58. static bool kvm_smccc_default_allowed(u32 func_id)
  59. {
  60. switch (func_id) {
  61. /*
  62. * List of function-ids that are not gated with the bitmapped
  63. * feature firmware registers, and are to be allowed for
  64. * servicing the call by default.
  65. */
  66. case ARM_SMCCC_VERSION_FUNC_ID:
  67. case ARM_SMCCC_ARCH_FEATURES_FUNC_ID:
  68. return true;
  69. default:
  70. /* PSCI 0.2 and up is in the 0:0x1f range */
  71. if (ARM_SMCCC_OWNER_NUM(func_id) == ARM_SMCCC_OWNER_STANDARD &&
  72. ARM_SMCCC_FUNC_NUM(func_id) <= 0x1f)
  73. return true;
  74. /*
  75. * KVM's PSCI 0.1 doesn't comply with SMCCC, and has
  76. * its own function-id base and range
  77. */
  78. if (func_id >= KVM_PSCI_FN(0) && func_id <= KVM_PSCI_FN(3))
  79. return true;
  80. return false;
  81. }
  82. }
  83. static bool kvm_smccc_test_fw_bmap(struct kvm_vcpu *vcpu, u32 func_id)
  84. {
  85. struct kvm_smccc_features *smccc_feat = &vcpu->kvm->arch.smccc_feat;
  86. switch (func_id) {
  87. case ARM_SMCCC_TRNG_VERSION:
  88. case ARM_SMCCC_TRNG_FEATURES:
  89. case ARM_SMCCC_TRNG_GET_UUID:
  90. case ARM_SMCCC_TRNG_RND32:
  91. case ARM_SMCCC_TRNG_RND64:
  92. return test_bit(KVM_REG_ARM_STD_BIT_TRNG_V1_0,
  93. &smccc_feat->std_bmap);
  94. case ARM_SMCCC_HV_PV_TIME_FEATURES:
  95. case ARM_SMCCC_HV_PV_TIME_ST:
  96. return test_bit(KVM_REG_ARM_STD_HYP_BIT_PV_TIME,
  97. &smccc_feat->std_hyp_bmap);
  98. case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID:
  99. case ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID:
  100. return test_bit(KVM_REG_ARM_VENDOR_HYP_BIT_FUNC_FEAT,
  101. &smccc_feat->vendor_hyp_bmap);
  102. case ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID:
  103. return test_bit(KVM_REG_ARM_VENDOR_HYP_BIT_PTP,
  104. &smccc_feat->vendor_hyp_bmap);
  105. default:
  106. return false;
  107. }
  108. }
  109. #define SMC32_ARCH_RANGE_BEGIN ARM_SMCCC_VERSION_FUNC_ID
  110. #define SMC32_ARCH_RANGE_END ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
  111. ARM_SMCCC_SMC_32, \
  112. 0, ARM_SMCCC_FUNC_MASK)
  113. #define SMC64_ARCH_RANGE_BEGIN ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
  114. ARM_SMCCC_SMC_64, \
  115. 0, 0)
  116. #define SMC64_ARCH_RANGE_END ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
  117. ARM_SMCCC_SMC_64, \
  118. 0, ARM_SMCCC_FUNC_MASK)
  119. static int kvm_smccc_filter_insert_reserved(struct kvm *kvm)
  120. {
  121. int r;
  122. /*
  123. * Prevent userspace from handling any SMCCC calls in the architecture
  124. * range, avoiding the risk of misrepresenting Spectre mitigation status
  125. * to the guest.
  126. */
  127. r = mtree_insert_range(&kvm->arch.smccc_filter,
  128. SMC32_ARCH_RANGE_BEGIN, SMC32_ARCH_RANGE_END,
  129. xa_mk_value(KVM_SMCCC_FILTER_HANDLE),
  130. GFP_KERNEL_ACCOUNT);
  131. if (r)
  132. goto out_destroy;
  133. r = mtree_insert_range(&kvm->arch.smccc_filter,
  134. SMC64_ARCH_RANGE_BEGIN, SMC64_ARCH_RANGE_END,
  135. xa_mk_value(KVM_SMCCC_FILTER_HANDLE),
  136. GFP_KERNEL_ACCOUNT);
  137. if (r)
  138. goto out_destroy;
  139. return 0;
  140. out_destroy:
  141. mtree_destroy(&kvm->arch.smccc_filter);
  142. return r;
  143. }
  144. static bool kvm_smccc_filter_configured(struct kvm *kvm)
  145. {
  146. return !mtree_empty(&kvm->arch.smccc_filter);
  147. }
  148. static int kvm_smccc_set_filter(struct kvm *kvm, struct kvm_smccc_filter __user *uaddr)
  149. {
  150. const void *zero_page = page_to_virt(ZERO_PAGE(0));
  151. struct kvm_smccc_filter filter;
  152. u32 start, end;
  153. int r;
  154. if (copy_from_user(&filter, uaddr, sizeof(filter)))
  155. return -EFAULT;
  156. if (memcmp(filter.pad, zero_page, sizeof(filter.pad)))
  157. return -EINVAL;
  158. start = filter.base;
  159. end = start + filter.nr_functions - 1;
  160. if (end < start || filter.action >= NR_SMCCC_FILTER_ACTIONS)
  161. return -EINVAL;
  162. mutex_lock(&kvm->arch.config_lock);
  163. if (kvm_vm_has_ran_once(kvm)) {
  164. r = -EBUSY;
  165. goto out_unlock;
  166. }
  167. if (!kvm_smccc_filter_configured(kvm)) {
  168. r = kvm_smccc_filter_insert_reserved(kvm);
  169. if (WARN_ON_ONCE(r))
  170. goto out_unlock;
  171. }
  172. r = mtree_insert_range(&kvm->arch.smccc_filter, start, end,
  173. xa_mk_value(filter.action), GFP_KERNEL_ACCOUNT);
  174. out_unlock:
  175. mutex_unlock(&kvm->arch.config_lock);
  176. return r;
  177. }
  178. static u8 kvm_smccc_filter_get_action(struct kvm *kvm, u32 func_id)
  179. {
  180. unsigned long idx = func_id;
  181. void *val;
  182. if (!kvm_smccc_filter_configured(kvm))
  183. return KVM_SMCCC_FILTER_HANDLE;
  184. /*
  185. * But where's the error handling, you say?
  186. *
  187. * mt_find() returns NULL if no entry was found, which just so happens
  188. * to match KVM_SMCCC_FILTER_HANDLE.
  189. */
  190. val = mt_find(&kvm->arch.smccc_filter, &idx, idx);
  191. return xa_to_value(val);
  192. }
  193. static u8 kvm_smccc_get_action(struct kvm_vcpu *vcpu, u32 func_id)
  194. {
  195. /*
  196. * Intervening actions in the SMCCC filter take precedence over the
  197. * pseudo-firmware register bitmaps.
  198. */
  199. u8 action = kvm_smccc_filter_get_action(vcpu->kvm, func_id);
  200. if (action != KVM_SMCCC_FILTER_HANDLE)
  201. return action;
  202. if (kvm_smccc_test_fw_bmap(vcpu, func_id) ||
  203. kvm_smccc_default_allowed(func_id))
  204. return KVM_SMCCC_FILTER_HANDLE;
  205. return KVM_SMCCC_FILTER_DENY;
  206. }
  207. static void kvm_prepare_hypercall_exit(struct kvm_vcpu *vcpu, u32 func_id)
  208. {
  209. u8 ec = ESR_ELx_EC(kvm_vcpu_get_esr(vcpu));
  210. struct kvm_run *run = vcpu->run;
  211. u64 flags = 0;
  212. if (ec == ESR_ELx_EC_SMC32 || ec == ESR_ELx_EC_SMC64)
  213. flags |= KVM_HYPERCALL_EXIT_SMC;
  214. if (!kvm_vcpu_trap_il_is32bit(vcpu))
  215. flags |= KVM_HYPERCALL_EXIT_16BIT;
  216. run->exit_reason = KVM_EXIT_HYPERCALL;
  217. run->hypercall = (typeof(run->hypercall)) {
  218. .nr = func_id,
  219. .flags = flags,
  220. };
  221. }
  222. int kvm_smccc_call_handler(struct kvm_vcpu *vcpu)
  223. {
  224. struct kvm_smccc_features *smccc_feat = &vcpu->kvm->arch.smccc_feat;
  225. u32 func_id = smccc_get_function(vcpu);
  226. u64 val[4] = {SMCCC_RET_NOT_SUPPORTED};
  227. u32 feature;
  228. u8 action;
  229. gpa_t gpa;
  230. action = kvm_smccc_get_action(vcpu, func_id);
  231. switch (action) {
  232. case KVM_SMCCC_FILTER_HANDLE:
  233. break;
  234. case KVM_SMCCC_FILTER_DENY:
  235. goto out;
  236. case KVM_SMCCC_FILTER_FWD_TO_USER:
  237. kvm_prepare_hypercall_exit(vcpu, func_id);
  238. return 0;
  239. default:
  240. WARN_RATELIMIT(1, "Unhandled SMCCC filter action: %d\n", action);
  241. goto out;
  242. }
  243. switch (func_id) {
  244. case ARM_SMCCC_VERSION_FUNC_ID:
  245. val[0] = ARM_SMCCC_VERSION_1_1;
  246. break;
  247. case ARM_SMCCC_ARCH_FEATURES_FUNC_ID:
  248. feature = smccc_get_arg1(vcpu);
  249. switch (feature) {
  250. case ARM_SMCCC_ARCH_WORKAROUND_1:
  251. switch (arm64_get_spectre_v2_state()) {
  252. case SPECTRE_VULNERABLE:
  253. break;
  254. case SPECTRE_MITIGATED:
  255. val[0] = SMCCC_RET_SUCCESS;
  256. break;
  257. case SPECTRE_UNAFFECTED:
  258. val[0] = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED;
  259. break;
  260. }
  261. break;
  262. case ARM_SMCCC_ARCH_WORKAROUND_2:
  263. switch (arm64_get_spectre_v4_state()) {
  264. case SPECTRE_VULNERABLE:
  265. break;
  266. case SPECTRE_MITIGATED:
  267. /*
  268. * SSBS everywhere: Indicate no firmware
  269. * support, as the SSBS support will be
  270. * indicated to the guest and the default is
  271. * safe.
  272. *
  273. * Otherwise, expose a permanent mitigation
  274. * to the guest, and hide SSBS so that the
  275. * guest stays protected.
  276. */
  277. if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, SSBS, IMP))
  278. break;
  279. fallthrough;
  280. case SPECTRE_UNAFFECTED:
  281. val[0] = SMCCC_RET_NOT_REQUIRED;
  282. break;
  283. }
  284. break;
  285. case ARM_SMCCC_ARCH_WORKAROUND_3:
  286. switch (arm64_get_spectre_bhb_state()) {
  287. case SPECTRE_VULNERABLE:
  288. break;
  289. case SPECTRE_MITIGATED:
  290. val[0] = SMCCC_RET_SUCCESS;
  291. break;
  292. case SPECTRE_UNAFFECTED:
  293. val[0] = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED;
  294. break;
  295. }
  296. break;
  297. case ARM_SMCCC_HV_PV_TIME_FEATURES:
  298. if (test_bit(KVM_REG_ARM_STD_HYP_BIT_PV_TIME,
  299. &smccc_feat->std_hyp_bmap))
  300. val[0] = SMCCC_RET_SUCCESS;
  301. break;
  302. }
  303. break;
  304. case ARM_SMCCC_HV_PV_TIME_FEATURES:
  305. val[0] = kvm_hypercall_pv_features(vcpu);
  306. break;
  307. case ARM_SMCCC_HV_PV_TIME_ST:
  308. gpa = kvm_init_stolen_time(vcpu);
  309. if (gpa != INVALID_GPA)
  310. val[0] = gpa;
  311. break;
  312. case ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID:
  313. val[0] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0;
  314. val[1] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1;
  315. val[2] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2;
  316. val[3] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3;
  317. break;
  318. case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID:
  319. val[0] = smccc_feat->vendor_hyp_bmap;
  320. break;
  321. case ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID:
  322. kvm_ptp_get_time(vcpu, val);
  323. break;
  324. case ARM_SMCCC_TRNG_VERSION:
  325. case ARM_SMCCC_TRNG_FEATURES:
  326. case ARM_SMCCC_TRNG_GET_UUID:
  327. case ARM_SMCCC_TRNG_RND32:
  328. case ARM_SMCCC_TRNG_RND64:
  329. return kvm_trng_call(vcpu);
  330. default:
  331. return kvm_psci_call(vcpu);
  332. }
  333. out:
  334. smccc_set_retval(vcpu, val[0], val[1], val[2], val[3]);
  335. return 1;
  336. }
  337. static const u64 kvm_arm_fw_reg_ids[] = {
  338. KVM_REG_ARM_PSCI_VERSION,
  339. KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1,
  340. KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2,
  341. KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3,
  342. KVM_REG_ARM_STD_BMAP,
  343. KVM_REG_ARM_STD_HYP_BMAP,
  344. KVM_REG_ARM_VENDOR_HYP_BMAP,
  345. };
  346. void kvm_arm_init_hypercalls(struct kvm *kvm)
  347. {
  348. struct kvm_smccc_features *smccc_feat = &kvm->arch.smccc_feat;
  349. smccc_feat->std_bmap = KVM_ARM_SMCCC_STD_FEATURES;
  350. smccc_feat->std_hyp_bmap = KVM_ARM_SMCCC_STD_HYP_FEATURES;
  351. smccc_feat->vendor_hyp_bmap = KVM_ARM_SMCCC_VENDOR_HYP_FEATURES;
  352. mt_init(&kvm->arch.smccc_filter);
  353. }
  354. void kvm_arm_teardown_hypercalls(struct kvm *kvm)
  355. {
  356. mtree_destroy(&kvm->arch.smccc_filter);
  357. }
  358. int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu)
  359. {
  360. return ARRAY_SIZE(kvm_arm_fw_reg_ids);
  361. }
  362. int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
  363. {
  364. int i;
  365. for (i = 0; i < ARRAY_SIZE(kvm_arm_fw_reg_ids); i++) {
  366. if (put_user(kvm_arm_fw_reg_ids[i], uindices++))
  367. return -EFAULT;
  368. }
  369. return 0;
  370. }
  371. #define KVM_REG_FEATURE_LEVEL_MASK GENMASK(3, 0)
  372. /*
  373. * Convert the workaround level into an easy-to-compare number, where higher
  374. * values mean better protection.
  375. */
  376. static int get_kernel_wa_level(struct kvm_vcpu *vcpu, u64 regid)
  377. {
  378. switch (regid) {
  379. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
  380. switch (arm64_get_spectre_v2_state()) {
  381. case SPECTRE_VULNERABLE:
  382. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_AVAIL;
  383. case SPECTRE_MITIGATED:
  384. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_AVAIL;
  385. case SPECTRE_UNAFFECTED:
  386. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_REQUIRED;
  387. }
  388. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1_NOT_AVAIL;
  389. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2:
  390. switch (arm64_get_spectre_v4_state()) {
  391. case SPECTRE_MITIGATED:
  392. /*
  393. * As for the hypercall discovery, we pretend we
  394. * don't have any FW mitigation if SSBS is there at
  395. * all times.
  396. */
  397. if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, SSBS, IMP))
  398. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL;
  399. fallthrough;
  400. case SPECTRE_UNAFFECTED:
  401. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED;
  402. case SPECTRE_VULNERABLE:
  403. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL;
  404. }
  405. break;
  406. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
  407. switch (arm64_get_spectre_bhb_state()) {
  408. case SPECTRE_VULNERABLE:
  409. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL;
  410. case SPECTRE_MITIGATED:
  411. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_AVAIL;
  412. case SPECTRE_UNAFFECTED:
  413. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_REQUIRED;
  414. }
  415. return KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3_NOT_AVAIL;
  416. }
  417. return -EINVAL;
  418. }
  419. int kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
  420. {
  421. struct kvm_smccc_features *smccc_feat = &vcpu->kvm->arch.smccc_feat;
  422. void __user *uaddr = (void __user *)(long)reg->addr;
  423. u64 val;
  424. switch (reg->id) {
  425. case KVM_REG_ARM_PSCI_VERSION:
  426. val = kvm_psci_version(vcpu);
  427. break;
  428. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
  429. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2:
  430. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
  431. val = get_kernel_wa_level(vcpu, reg->id) & KVM_REG_FEATURE_LEVEL_MASK;
  432. break;
  433. case KVM_REG_ARM_STD_BMAP:
  434. val = READ_ONCE(smccc_feat->std_bmap);
  435. break;
  436. case KVM_REG_ARM_STD_HYP_BMAP:
  437. val = READ_ONCE(smccc_feat->std_hyp_bmap);
  438. break;
  439. case KVM_REG_ARM_VENDOR_HYP_BMAP:
  440. val = READ_ONCE(smccc_feat->vendor_hyp_bmap);
  441. break;
  442. default:
  443. return -ENOENT;
  444. }
  445. if (copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)))
  446. return -EFAULT;
  447. return 0;
  448. }
  449. static int kvm_arm_set_fw_reg_bmap(struct kvm_vcpu *vcpu, u64 reg_id, u64 val)
  450. {
  451. int ret = 0;
  452. struct kvm *kvm = vcpu->kvm;
  453. struct kvm_smccc_features *smccc_feat = &kvm->arch.smccc_feat;
  454. unsigned long *fw_reg_bmap, fw_reg_features;
  455. switch (reg_id) {
  456. case KVM_REG_ARM_STD_BMAP:
  457. fw_reg_bmap = &smccc_feat->std_bmap;
  458. fw_reg_features = KVM_ARM_SMCCC_STD_FEATURES;
  459. break;
  460. case KVM_REG_ARM_STD_HYP_BMAP:
  461. fw_reg_bmap = &smccc_feat->std_hyp_bmap;
  462. fw_reg_features = KVM_ARM_SMCCC_STD_HYP_FEATURES;
  463. break;
  464. case KVM_REG_ARM_VENDOR_HYP_BMAP:
  465. fw_reg_bmap = &smccc_feat->vendor_hyp_bmap;
  466. fw_reg_features = KVM_ARM_SMCCC_VENDOR_HYP_FEATURES;
  467. break;
  468. default:
  469. return -ENOENT;
  470. }
  471. /* Check for unsupported bit */
  472. if (val & ~fw_reg_features)
  473. return -EINVAL;
  474. mutex_lock(&kvm->arch.config_lock);
  475. if (kvm_vm_has_ran_once(kvm) && val != *fw_reg_bmap) {
  476. ret = -EBUSY;
  477. goto out;
  478. }
  479. WRITE_ONCE(*fw_reg_bmap, val);
  480. out:
  481. mutex_unlock(&kvm->arch.config_lock);
  482. return ret;
  483. }
  484. int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
  485. {
  486. void __user *uaddr = (void __user *)(long)reg->addr;
  487. u64 val;
  488. int wa_level;
  489. if (KVM_REG_SIZE(reg->id) != sizeof(val))
  490. return -ENOENT;
  491. if (copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id)))
  492. return -EFAULT;
  493. switch (reg->id) {
  494. case KVM_REG_ARM_PSCI_VERSION:
  495. {
  496. bool wants_02;
  497. wants_02 = vcpu_has_feature(vcpu, KVM_ARM_VCPU_PSCI_0_2);
  498. switch (val) {
  499. case KVM_ARM_PSCI_0_1:
  500. if (wants_02)
  501. return -EINVAL;
  502. vcpu->kvm->arch.psci_version = val;
  503. return 0;
  504. case KVM_ARM_PSCI_0_2:
  505. case KVM_ARM_PSCI_1_0:
  506. case KVM_ARM_PSCI_1_1:
  507. if (!wants_02)
  508. return -EINVAL;
  509. vcpu->kvm->arch.psci_version = val;
  510. return 0;
  511. }
  512. break;
  513. }
  514. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1:
  515. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3:
  516. if (val & ~KVM_REG_FEATURE_LEVEL_MASK)
  517. return -EINVAL;
  518. if (get_kernel_wa_level(vcpu, reg->id) < val)
  519. return -EINVAL;
  520. return 0;
  521. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2:
  522. if (val & ~(KVM_REG_FEATURE_LEVEL_MASK |
  523. KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED))
  524. return -EINVAL;
  525. /* The enabled bit must not be set unless the level is AVAIL. */
  526. if ((val & KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_ENABLED) &&
  527. (val & KVM_REG_FEATURE_LEVEL_MASK) != KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_AVAIL)
  528. return -EINVAL;
  529. /*
  530. * Map all the possible incoming states to the only two we
  531. * really want to deal with.
  532. */
  533. switch (val & KVM_REG_FEATURE_LEVEL_MASK) {
  534. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL:
  535. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_UNKNOWN:
  536. wa_level = KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_AVAIL;
  537. break;
  538. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_AVAIL:
  539. case KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED:
  540. wa_level = KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2_NOT_REQUIRED;
  541. break;
  542. default:
  543. return -EINVAL;
  544. }
  545. /*
  546. * We can deal with NOT_AVAIL on NOT_REQUIRED, but not the
  547. * other way around.
  548. */
  549. if (get_kernel_wa_level(vcpu, reg->id) < wa_level)
  550. return -EINVAL;
  551. return 0;
  552. case KVM_REG_ARM_STD_BMAP:
  553. case KVM_REG_ARM_STD_HYP_BMAP:
  554. case KVM_REG_ARM_VENDOR_HYP_BMAP:
  555. return kvm_arm_set_fw_reg_bmap(vcpu, reg->id, val);
  556. default:
  557. return -ENOENT;
  558. }
  559. return -EINVAL;
  560. }
  561. int kvm_vm_smccc_has_attr(struct kvm *kvm, struct kvm_device_attr *attr)
  562. {
  563. switch (attr->attr) {
  564. case KVM_ARM_VM_SMCCC_FILTER:
  565. return 0;
  566. default:
  567. return -ENXIO;
  568. }
  569. }
  570. int kvm_vm_smccc_set_attr(struct kvm *kvm, struct kvm_device_attr *attr)
  571. {
  572. void __user *uaddr = (void __user *)attr->addr;
  573. switch (attr->attr) {
  574. case KVM_ARM_VM_SMCCC_FILTER:
  575. return kvm_smccc_set_filter(kvm, uaddr);
  576. default:
  577. return -ENXIO;
  578. }
  579. }