serenity.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <arpa/inet.h>
  7. #include <errno.h>
  8. #include <serenity.h>
  9. #include <string.h>
  10. #include <syscall.h>
  11. extern "C" {
  12. int disown(pid_t pid)
  13. {
  14. int rc = syscall(SC_disown, pid);
  15. __RETURN_WITH_ERRNO(rc, rc, -1);
  16. }
  17. int module_load(const char* path, size_t path_length)
  18. {
  19. int rc = syscall(SC_module_load, path, path_length);
  20. __RETURN_WITH_ERRNO(rc, rc, -1);
  21. }
  22. int module_unload(const char* name, size_t name_length)
  23. {
  24. int rc = syscall(SC_module_unload, name, name_length);
  25. __RETURN_WITH_ERRNO(rc, rc, -1);
  26. }
  27. int profiling_enable(pid_t pid, uint64_t event_mask)
  28. {
  29. int rc = syscall(SC_profiling_enable, pid, event_mask);
  30. __RETURN_WITH_ERRNO(rc, rc, -1);
  31. }
  32. int profiling_disable(pid_t pid)
  33. {
  34. int rc = syscall(SC_profiling_disable, pid);
  35. __RETURN_WITH_ERRNO(rc, rc, -1);
  36. }
  37. int profiling_free_buffer(pid_t pid)
  38. {
  39. int rc = syscall(SC_profiling_free_buffer, pid);
  40. __RETURN_WITH_ERRNO(rc, rc, -1);
  41. }
  42. int futex(uint32_t* userspace_address, int futex_op, uint32_t value, const struct timespec* timeout, uint32_t* userspace_address2, uint32_t value3)
  43. {
  44. int rc;
  45. switch (futex_op & FUTEX_CMD_MASK) {
  46. //case FUTEX_CMP_REQUEUE:
  47. // FUTEX_CMP_REQUEUE_PI:
  48. case FUTEX_WAKE_OP: {
  49. // These interpret timeout as a u32 value for val2
  50. Syscall::SC_futex_params params {
  51. .userspace_address = userspace_address,
  52. .futex_op = futex_op,
  53. .val = value,
  54. .val2 = (FlatPtr)timeout,
  55. .userspace_address2 = userspace_address2,
  56. .val3 = value3
  57. };
  58. rc = syscall(SC_futex, &params);
  59. break;
  60. }
  61. default: {
  62. Syscall::SC_futex_params params {
  63. .userspace_address = userspace_address,
  64. .futex_op = futex_op,
  65. .val = value,
  66. .timeout = timeout,
  67. .userspace_address2 = userspace_address2,
  68. .val3 = value3
  69. };
  70. rc = syscall(SC_futex, &params);
  71. break;
  72. }
  73. }
  74. __RETURN_WITH_ERRNO(rc, rc, -1);
  75. }
  76. int purge(int mode)
  77. {
  78. int rc = syscall(SC_purge, mode);
  79. __RETURN_WITH_ERRNO(rc, rc, -1);
  80. }
  81. int perf_event(int type, uintptr_t arg1, FlatPtr arg2)
  82. {
  83. int rc = syscall(SC_perf_event, type, arg1, arg2);
  84. __RETURN_WITH_ERRNO(rc, rc, -1);
  85. }
  86. int perf_register_string(char const* string, size_t string_length)
  87. {
  88. int rc = syscall(SC_perf_register_string, string, string_length);
  89. __RETURN_WITH_ERRNO(rc, rc, -1);
  90. }
  91. int get_stack_bounds(uintptr_t* user_stack_base, size_t* user_stack_size)
  92. {
  93. int rc = syscall(SC_get_stack_bounds, user_stack_base, user_stack_size);
  94. __RETURN_WITH_ERRNO(rc, rc, -1);
  95. }
  96. int anon_create(size_t size, int options)
  97. {
  98. int rc = syscall(SC_anon_create, size, options);
  99. __RETURN_WITH_ERRNO(rc, rc, -1);
  100. }
  101. int serenity_readlink(const char* path, size_t path_length, char* buffer, size_t buffer_size)
  102. {
  103. Syscall::SC_readlink_params small_params {
  104. { path, path_length },
  105. { buffer, buffer_size }
  106. };
  107. int rc = syscall(SC_readlink, &small_params);
  108. __RETURN_WITH_ERRNO(rc, rc, -1);
  109. }
  110. int setkeymap(const char* name, const u32* map, u32* const shift_map, const u32* alt_map, const u32* altgr_map, const u32* shift_altgr_map)
  111. {
  112. Syscall::SC_setkeymap_params params { map, shift_map, alt_map, altgr_map, shift_altgr_map, { name, strlen(name) } };
  113. return syscall(SC_setkeymap, &params);
  114. }
  115. int getkeymap(char* name_buffer, size_t name_buffer_size, u32* map, u32* shift_map, u32* alt_map, u32* altgr_map, u32* shift_altgr_map)
  116. {
  117. Syscall::SC_getkeymap_params params {
  118. map,
  119. shift_map,
  120. alt_map,
  121. altgr_map,
  122. shift_altgr_map,
  123. { name_buffer, name_buffer_size }
  124. };
  125. int rc = syscall(SC_getkeymap, &params);
  126. __RETURN_WITH_ERRNO(rc, rc, -1);
  127. }
  128. u16 internet_checksum(const void* ptr, size_t count)
  129. {
  130. u32 checksum = 0;
  131. auto* w = (const u16*)ptr;
  132. while (count > 1) {
  133. checksum += ntohs(*w++);
  134. if (checksum & 0x80000000)
  135. checksum = (checksum & 0xffff) | (checksum >> 16);
  136. count -= 2;
  137. }
  138. while (checksum >> 16)
  139. checksum = (checksum & 0xffff) + (checksum >> 16);
  140. return htons(~checksum);
  141. }
  142. int emuctl(uintptr_t command, uintptr_t arg0, uintptr_t arg1)
  143. {
  144. return syscall(SC_emuctl, command, arg0, arg1);
  145. }
  146. }