uvdevice.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright IBM Corp. 2022
  4. * Author(s): Steffen Eiden <seiden@linux.ibm.com>
  5. *
  6. * This file provides a Linux misc device to give userspace access to some
  7. * Ultravisor (UV) functions. The device only accepts IOCTLs and will only
  8. * be present if the Ultravisor facility (158) is present.
  9. *
  10. * When userspace sends a valid IOCTL uvdevice will copy the input data to
  11. * kernel space, do some basic validity checks to avoid kernel/system
  12. * corruption. Any other check that the Ultravisor does will not be done by
  13. * the uvdevice to keep changes minimal when adding new functionalities
  14. * to existing UV-calls.
  15. * After the checks uvdevice builds a corresponding
  16. * Ultravisor Call Control Block, and sends the request to the Ultravisor.
  17. * Then, it copies the response, including the return codes, back to userspace.
  18. * It is the responsibility of the userspace to check for any error issued
  19. * by UV and to interpret the UV response. The uvdevice acts as a communication
  20. * channel for userspace to the Ultravisor.
  21. */
  22. #include <linux/module.h>
  23. #include <linux/kernel.h>
  24. #include <linux/miscdevice.h>
  25. #include <linux/types.h>
  26. #include <linux/stddef.h>
  27. #include <linux/vmalloc.h>
  28. #include <linux/slab.h>
  29. #include <linux/cpufeature.h>
  30. #include <asm/uvdevice.h>
  31. #include <asm/uv.h>
  32. #define BIT_UVIO_INTERNAL U32_MAX
  33. /* Mapping from IOCTL-nr to UVC-bit */
  34. static const u32 ioctl_nr_to_uvc_bit[] __initconst = {
  35. [UVIO_IOCTL_UVDEV_INFO_NR] = BIT_UVIO_INTERNAL,
  36. [UVIO_IOCTL_ATT_NR] = BIT_UVC_CMD_RETR_ATTEST,
  37. [UVIO_IOCTL_ADD_SECRET_NR] = BIT_UVC_CMD_ADD_SECRET,
  38. [UVIO_IOCTL_LIST_SECRETS_NR] = BIT_UVC_CMD_LIST_SECRETS,
  39. [UVIO_IOCTL_LOCK_SECRETS_NR] = BIT_UVC_CMD_LOCK_SECRETS,
  40. };
  41. static_assert(ARRAY_SIZE(ioctl_nr_to_uvc_bit) == UVIO_IOCTL_NUM_IOCTLS);
  42. static struct uvio_uvdev_info uvdev_info = {
  43. .supp_uvio_cmds = GENMASK_ULL(UVIO_IOCTL_NUM_IOCTLS - 1, 0),
  44. };
  45. static void __init set_supp_uv_cmds(unsigned long *supp_uv_cmds)
  46. {
  47. int i;
  48. for (i = 0; i < UVIO_IOCTL_NUM_IOCTLS; i++) {
  49. if (ioctl_nr_to_uvc_bit[i] == BIT_UVIO_INTERNAL)
  50. continue;
  51. if (!test_bit_inv(ioctl_nr_to_uvc_bit[i], uv_info.inst_calls_list))
  52. continue;
  53. __set_bit(i, supp_uv_cmds);
  54. }
  55. }
  56. /**
  57. * uvio_uvdev_info() - get information about the uvdevice
  58. *
  59. * @uv_ioctl: ioctl control block
  60. *
  61. * Lists all IOCTLs that are supported by this uvdevice
  62. */
  63. static int uvio_uvdev_info(struct uvio_ioctl_cb *uv_ioctl)
  64. {
  65. void __user *user_buf_arg = (void __user *)uv_ioctl->argument_addr;
  66. if (uv_ioctl->argument_len < sizeof(uvdev_info))
  67. return -EINVAL;
  68. if (copy_to_user(user_buf_arg, &uvdev_info, sizeof(uvdev_info)))
  69. return -EFAULT;
  70. uv_ioctl->uv_rc = UVC_RC_EXECUTED;
  71. return 0;
  72. }
  73. static int uvio_build_uvcb_attest(struct uv_cb_attest *uvcb_attest, u8 *arcb,
  74. u8 *meas, u8 *add_data, struct uvio_attest *uvio_attest)
  75. {
  76. void __user *user_buf_arcb = (void __user *)uvio_attest->arcb_addr;
  77. if (copy_from_user(arcb, user_buf_arcb, uvio_attest->arcb_len))
  78. return -EFAULT;
  79. uvcb_attest->header.len = sizeof(*uvcb_attest);
  80. uvcb_attest->header.cmd = UVC_CMD_RETR_ATTEST;
  81. uvcb_attest->arcb_addr = (u64)arcb;
  82. uvcb_attest->cont_token = 0;
  83. uvcb_attest->user_data_len = uvio_attest->user_data_len;
  84. memcpy(uvcb_attest->user_data, uvio_attest->user_data, sizeof(uvcb_attest->user_data));
  85. uvcb_attest->meas_len = uvio_attest->meas_len;
  86. uvcb_attest->meas_addr = (u64)meas;
  87. uvcb_attest->add_data_len = uvio_attest->add_data_len;
  88. uvcb_attest->add_data_addr = (u64)add_data;
  89. return 0;
  90. }
  91. static int uvio_copy_attest_result_to_user(struct uv_cb_attest *uvcb_attest,
  92. struct uvio_ioctl_cb *uv_ioctl,
  93. u8 *measurement, u8 *add_data,
  94. struct uvio_attest *uvio_attest)
  95. {
  96. struct uvio_attest __user *user_uvio_attest = (void __user *)uv_ioctl->argument_addr;
  97. u32 __user *user_buf_add_len = (u32 __user *)&user_uvio_attest->add_data_len;
  98. void __user *user_buf_add = (void __user *)uvio_attest->add_data_addr;
  99. void __user *user_buf_meas = (void __user *)uvio_attest->meas_addr;
  100. void __user *user_buf_uid = &user_uvio_attest->config_uid;
  101. if (copy_to_user(user_buf_meas, measurement, uvio_attest->meas_len))
  102. return -EFAULT;
  103. if (add_data && copy_to_user(user_buf_add, add_data, uvio_attest->add_data_len))
  104. return -EFAULT;
  105. if (put_user(uvio_attest->add_data_len, user_buf_add_len))
  106. return -EFAULT;
  107. if (copy_to_user(user_buf_uid, uvcb_attest->config_uid, sizeof(uvcb_attest->config_uid)))
  108. return -EFAULT;
  109. return 0;
  110. }
  111. static int get_uvio_attest(struct uvio_ioctl_cb *uv_ioctl, struct uvio_attest *uvio_attest)
  112. {
  113. u8 __user *user_arg_buf = (u8 __user *)uv_ioctl->argument_addr;
  114. if (copy_from_user(uvio_attest, user_arg_buf, sizeof(*uvio_attest)))
  115. return -EFAULT;
  116. if (uvio_attest->arcb_len > UVIO_ATT_ARCB_MAX_LEN)
  117. return -EINVAL;
  118. if (uvio_attest->arcb_len == 0)
  119. return -EINVAL;
  120. if (uvio_attest->meas_len > UVIO_ATT_MEASUREMENT_MAX_LEN)
  121. return -EINVAL;
  122. if (uvio_attest->meas_len == 0)
  123. return -EINVAL;
  124. if (uvio_attest->add_data_len > UVIO_ATT_ADDITIONAL_MAX_LEN)
  125. return -EINVAL;
  126. if (uvio_attest->reserved136)
  127. return -EINVAL;
  128. return 0;
  129. }
  130. /**
  131. * uvio_attestation() - Perform a Retrieve Attestation Measurement UVC.
  132. *
  133. * @uv_ioctl: ioctl control block
  134. *
  135. * uvio_attestation() does a Retrieve Attestation Measurement Ultravisor Call.
  136. * It verifies that the given userspace addresses are valid and request sizes
  137. * are sane. Every other check is made by the Ultravisor (UV) and won't result
  138. * in a negative return value. It copies the input to kernelspace, builds the
  139. * request, sends the UV-call, and copies the result to userspace.
  140. *
  141. * The Attestation Request has two input and two outputs.
  142. * ARCB and User Data are inputs for the UV generated by userspace.
  143. * Measurement and Additional Data are outputs for userspace generated by UV.
  144. *
  145. * The Attestation Request Control Block (ARCB) is a cryptographically verified
  146. * and secured request to UV and User Data is some plaintext data which is
  147. * going to be included in the Attestation Measurement calculation.
  148. *
  149. * Measurement is a cryptographic measurement of the callers properties,
  150. * optional data configured by the ARCB and the user data. If specified by the
  151. * ARCB, UV will add some Additional Data to the measurement calculation.
  152. * This Additional Data is then returned as well.
  153. *
  154. * If the Retrieve Attestation Measurement UV facility is not present,
  155. * UV will return invalid command rc. This won't be fenced in the driver
  156. * and does not result in a negative return value.
  157. *
  158. * Context: might sleep
  159. *
  160. * Return: 0 on success or a negative error code on error.
  161. */
  162. static int uvio_attestation(struct uvio_ioctl_cb *uv_ioctl)
  163. {
  164. struct uv_cb_attest *uvcb_attest = NULL;
  165. struct uvio_attest *uvio_attest = NULL;
  166. u8 *measurement = NULL;
  167. u8 *add_data = NULL;
  168. u8 *arcb = NULL;
  169. int ret;
  170. ret = -EINVAL;
  171. if (uv_ioctl->argument_len != sizeof(*uvio_attest))
  172. goto out;
  173. ret = -ENOMEM;
  174. uvio_attest = kzalloc(sizeof(*uvio_attest), GFP_KERNEL);
  175. if (!uvio_attest)
  176. goto out;
  177. ret = get_uvio_attest(uv_ioctl, uvio_attest);
  178. if (ret)
  179. goto out;
  180. ret = -ENOMEM;
  181. arcb = kvzalloc(uvio_attest->arcb_len, GFP_KERNEL);
  182. measurement = kvzalloc(uvio_attest->meas_len, GFP_KERNEL);
  183. if (!arcb || !measurement)
  184. goto out;
  185. if (uvio_attest->add_data_len) {
  186. add_data = kvzalloc(uvio_attest->add_data_len, GFP_KERNEL);
  187. if (!add_data)
  188. goto out;
  189. }
  190. uvcb_attest = kzalloc(sizeof(*uvcb_attest), GFP_KERNEL);
  191. if (!uvcb_attest)
  192. goto out;
  193. ret = uvio_build_uvcb_attest(uvcb_attest, arcb, measurement, add_data, uvio_attest);
  194. if (ret)
  195. goto out;
  196. uv_call_sched(0, (u64)uvcb_attest);
  197. uv_ioctl->uv_rc = uvcb_attest->header.rc;
  198. uv_ioctl->uv_rrc = uvcb_attest->header.rrc;
  199. ret = uvio_copy_attest_result_to_user(uvcb_attest, uv_ioctl, measurement, add_data,
  200. uvio_attest);
  201. out:
  202. kvfree(arcb);
  203. kvfree(measurement);
  204. kvfree(add_data);
  205. kfree(uvio_attest);
  206. kfree(uvcb_attest);
  207. return ret;
  208. }
  209. /** uvio_add_secret() - perform an Add Secret UVC
  210. *
  211. * @uv_ioctl: ioctl control block
  212. *
  213. * uvio_add_secret() performs the Add Secret Ultravisor Call.
  214. *
  215. * The given userspace argument address and size are verified to be
  216. * valid but every other check is made by the Ultravisor
  217. * (UV). Therefore UV errors won't result in a negative return
  218. * value. The request is then copied to kernelspace, the UV-call is
  219. * performed and the results are copied back to userspace.
  220. *
  221. * The argument has to point to an Add Secret Request Control Block
  222. * which is an encrypted and cryptographically verified request that
  223. * inserts a protected guest's secrets into the Ultravisor for later
  224. * use.
  225. *
  226. * If the Add Secret UV facility is not present, UV will return
  227. * invalid command rc. This won't be fenced in the driver and does not
  228. * result in a negative return value.
  229. *
  230. * Context: might sleep
  231. *
  232. * Return: 0 on success or a negative error code on error.
  233. */
  234. static int uvio_add_secret(struct uvio_ioctl_cb *uv_ioctl)
  235. {
  236. void __user *user_buf_arg = (void __user *)uv_ioctl->argument_addr;
  237. struct uv_cb_guest_addr uvcb = {
  238. .header.len = sizeof(uvcb),
  239. .header.cmd = UVC_CMD_ADD_SECRET,
  240. };
  241. void *asrcb = NULL;
  242. int ret;
  243. if (uv_ioctl->argument_len > UVIO_ADD_SECRET_MAX_LEN)
  244. return -EINVAL;
  245. if (uv_ioctl->argument_len == 0)
  246. return -EINVAL;
  247. asrcb = kvzalloc(uv_ioctl->argument_len, GFP_KERNEL);
  248. if (!asrcb)
  249. return -ENOMEM;
  250. ret = -EFAULT;
  251. if (copy_from_user(asrcb, user_buf_arg, uv_ioctl->argument_len))
  252. goto out;
  253. ret = 0;
  254. uvcb.addr = (u64)asrcb;
  255. uv_call_sched(0, (u64)&uvcb);
  256. uv_ioctl->uv_rc = uvcb.header.rc;
  257. uv_ioctl->uv_rrc = uvcb.header.rrc;
  258. out:
  259. kvfree(asrcb);
  260. return ret;
  261. }
  262. /** uvio_list_secrets() - perform a List Secret UVC
  263. * @uv_ioctl: ioctl control block
  264. *
  265. * uvio_list_secrets() performs the List Secret Ultravisor Call. It verifies
  266. * that the given userspace argument address is valid and its size is sane.
  267. * Every other check is made by the Ultravisor (UV) and won't result in a
  268. * negative return value. It builds the request, performs the UV-call, and
  269. * copies the result to userspace.
  270. *
  271. * The argument specifies the location for the result of the UV-Call.
  272. *
  273. * If the List Secrets UV facility is not present, UV will return invalid
  274. * command rc. This won't be fenced in the driver and does not result in a
  275. * negative return value.
  276. *
  277. * Context: might sleep
  278. *
  279. * Return: 0 on success or a negative error code on error.
  280. */
  281. static int uvio_list_secrets(struct uvio_ioctl_cb *uv_ioctl)
  282. {
  283. void __user *user_buf_arg = (void __user *)uv_ioctl->argument_addr;
  284. struct uv_cb_guest_addr uvcb = {
  285. .header.len = sizeof(uvcb),
  286. .header.cmd = UVC_CMD_LIST_SECRETS,
  287. };
  288. void *secrets = NULL;
  289. int ret = 0;
  290. if (uv_ioctl->argument_len != UVIO_LIST_SECRETS_LEN)
  291. return -EINVAL;
  292. secrets = kvzalloc(UVIO_LIST_SECRETS_LEN, GFP_KERNEL);
  293. if (!secrets)
  294. return -ENOMEM;
  295. uvcb.addr = (u64)secrets;
  296. uv_call_sched(0, (u64)&uvcb);
  297. uv_ioctl->uv_rc = uvcb.header.rc;
  298. uv_ioctl->uv_rrc = uvcb.header.rrc;
  299. if (copy_to_user(user_buf_arg, secrets, UVIO_LIST_SECRETS_LEN))
  300. ret = -EFAULT;
  301. kvfree(secrets);
  302. return ret;
  303. }
  304. /** uvio_lock_secrets() - perform a Lock Secret Store UVC
  305. * @uv_ioctl: ioctl control block
  306. *
  307. * uvio_lock_secrets() performs the Lock Secret Store Ultravisor Call. It
  308. * performs the UV-call and copies the return codes to the ioctl control block.
  309. * After this call was dispatched successfully every following Add Secret UVC
  310. * and Lock Secrets UVC will fail with return code 0x102.
  311. *
  312. * The argument address and size must be 0.
  313. *
  314. * If the Lock Secrets UV facility is not present, UV will return invalid
  315. * command rc. This won't be fenced in the driver and does not result in a
  316. * negative return value.
  317. *
  318. * Context: might sleep
  319. *
  320. * Return: 0 on success or a negative error code on error.
  321. */
  322. static int uvio_lock_secrets(struct uvio_ioctl_cb *ioctl)
  323. {
  324. struct uv_cb_nodata uvcb = {
  325. .header.len = sizeof(uvcb),
  326. .header.cmd = UVC_CMD_LOCK_SECRETS,
  327. };
  328. if (ioctl->argument_addr || ioctl->argument_len)
  329. return -EINVAL;
  330. uv_call(0, (u64)&uvcb);
  331. ioctl->uv_rc = uvcb.header.rc;
  332. ioctl->uv_rrc = uvcb.header.rrc;
  333. return 0;
  334. }
  335. static int uvio_copy_and_check_ioctl(struct uvio_ioctl_cb *ioctl, void __user *argp,
  336. unsigned long cmd)
  337. {
  338. u8 nr = _IOC_NR(cmd);
  339. if (_IOC_DIR(cmd) != (_IOC_READ | _IOC_WRITE))
  340. return -ENOIOCTLCMD;
  341. if (_IOC_TYPE(cmd) != UVIO_TYPE_UVC)
  342. return -ENOIOCTLCMD;
  343. if (nr >= UVIO_IOCTL_NUM_IOCTLS)
  344. return -ENOIOCTLCMD;
  345. if (_IOC_SIZE(cmd) != sizeof(*ioctl))
  346. return -ENOIOCTLCMD;
  347. if (copy_from_user(ioctl, argp, sizeof(*ioctl)))
  348. return -EFAULT;
  349. if (ioctl->flags != 0)
  350. return -EINVAL;
  351. if (memchr_inv(ioctl->reserved14, 0, sizeof(ioctl->reserved14)))
  352. return -EINVAL;
  353. return nr;
  354. }
  355. /*
  356. * IOCTL entry point for the Ultravisor device.
  357. */
  358. static long uvio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  359. {
  360. void __user *argp = (void __user *)arg;
  361. struct uvio_ioctl_cb uv_ioctl = { };
  362. long ret;
  363. int nr;
  364. nr = uvio_copy_and_check_ioctl(&uv_ioctl, argp, cmd);
  365. if (nr < 0)
  366. return nr;
  367. switch (nr) {
  368. case UVIO_IOCTL_UVDEV_INFO_NR:
  369. ret = uvio_uvdev_info(&uv_ioctl);
  370. break;
  371. case UVIO_IOCTL_ATT_NR:
  372. ret = uvio_attestation(&uv_ioctl);
  373. break;
  374. case UVIO_IOCTL_ADD_SECRET_NR:
  375. ret = uvio_add_secret(&uv_ioctl);
  376. break;
  377. case UVIO_IOCTL_LIST_SECRETS_NR:
  378. ret = uvio_list_secrets(&uv_ioctl);
  379. break;
  380. case UVIO_IOCTL_LOCK_SECRETS_NR:
  381. ret = uvio_lock_secrets(&uv_ioctl);
  382. break;
  383. default:
  384. ret = -ENOIOCTLCMD;
  385. break;
  386. }
  387. if (ret)
  388. return ret;
  389. if (copy_to_user(argp, &uv_ioctl, sizeof(uv_ioctl)))
  390. ret = -EFAULT;
  391. return ret;
  392. }
  393. static const struct file_operations uvio_dev_fops = {
  394. .owner = THIS_MODULE,
  395. .unlocked_ioctl = uvio_ioctl,
  396. };
  397. static struct miscdevice uvio_dev_miscdev = {
  398. .minor = MISC_DYNAMIC_MINOR,
  399. .name = UVIO_DEVICE_NAME,
  400. .fops = &uvio_dev_fops,
  401. };
  402. static void __exit uvio_dev_exit(void)
  403. {
  404. misc_deregister(&uvio_dev_miscdev);
  405. }
  406. static int __init uvio_dev_init(void)
  407. {
  408. set_supp_uv_cmds((unsigned long *)&uvdev_info.supp_uv_cmds);
  409. return misc_register(&uvio_dev_miscdev);
  410. }
  411. module_cpu_feature_match(S390_CPU_FEATURE_UV, uvio_dev_init);
  412. module_exit(uvio_dev_exit);
  413. MODULE_AUTHOR("IBM Corporation");
  414. MODULE_LICENSE("GPL");
  415. MODULE_DESCRIPTION("Ultravisor UAPI driver");