keymap.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Devices/HID/HIDManagement.h>
  7. #include <Kernel/Process.h>
  8. namespace Kernel {
  9. constexpr size_t map_name_max_size = 50;
  10. KResultOr<FlatPtr> Process::sys$setkeymap(Userspace<const Syscall::SC_setkeymap_params*> user_params)
  11. {
  12. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
  13. REQUIRE_PROMISE(setkeymap);
  14. if (!is_superuser())
  15. return EPERM;
  16. Syscall::SC_setkeymap_params params;
  17. if (!copy_from_user(&params, user_params))
  18. return EFAULT;
  19. Keyboard::CharacterMapData character_map_data;
  20. if (!copy_n_from_user(character_map_data.map, params.map, CHAR_MAP_SIZE))
  21. return EFAULT;
  22. if (!copy_n_from_user(character_map_data.shift_map, params.shift_map, CHAR_MAP_SIZE))
  23. return EFAULT;
  24. if (!copy_n_from_user(character_map_data.alt_map, params.alt_map, CHAR_MAP_SIZE))
  25. return EFAULT;
  26. if (!copy_n_from_user(character_map_data.altgr_map, params.altgr_map, CHAR_MAP_SIZE))
  27. return EFAULT;
  28. if (!copy_n_from_user(character_map_data.shift_altgr_map, params.shift_altgr_map, CHAR_MAP_SIZE))
  29. return EFAULT;
  30. auto map_name = get_syscall_path_argument(params.map_name);
  31. if (map_name.is_error())
  32. return map_name.error();
  33. if (map_name.value()->length() > map_name_max_size)
  34. return ENAMETOOLONG;
  35. HIDManagement::the().set_maps(character_map_data, map_name.value()->view());
  36. return 0;
  37. }
  38. KResultOr<FlatPtr> Process::sys$getkeymap(Userspace<const Syscall::SC_getkeymap_params*> user_params)
  39. {
  40. VERIFY_NO_PROCESS_BIG_LOCK(this);
  41. REQUIRE_PROMISE(getkeymap);
  42. Syscall::SC_getkeymap_params params;
  43. if (!copy_from_user(&params, user_params))
  44. return EFAULT;
  45. String keymap_name = HIDManagement::the().keymap_name();
  46. const Keyboard::CharacterMapData& character_maps = HIDManagement::the().character_maps();
  47. if (!copy_to_user(params.map, character_maps.map, CHAR_MAP_SIZE * sizeof(u32)))
  48. return EFAULT;
  49. if (!copy_to_user(params.shift_map, character_maps.shift_map, CHAR_MAP_SIZE * sizeof(u32)))
  50. return EFAULT;
  51. if (!copy_to_user(params.alt_map, character_maps.alt_map, CHAR_MAP_SIZE * sizeof(u32)))
  52. return EFAULT;
  53. if (!copy_to_user(params.altgr_map, character_maps.altgr_map, CHAR_MAP_SIZE * sizeof(u32)))
  54. return EFAULT;
  55. if (!copy_to_user(params.shift_altgr_map, character_maps.shift_altgr_map, CHAR_MAP_SIZE * sizeof(u32)))
  56. return EFAULT;
  57. if (params.map_name.size < keymap_name.length())
  58. return ENAMETOOLONG;
  59. if (!copy_to_user(params.map_name.data, keymap_name.characters(), keymap_name.length()))
  60. return EFAULT;
  61. return 0;
  62. }
  63. }