#pragma once #include "orbis/error.hpp" #include "orbis/thread/RegisterId.hpp" #include #include namespace orbis { using int8_t = std::int8_t; using int16_t = std::int16_t; using int32_t = std::int32_t; using int64_t = std::int64_t; using uint8_t = std::uint8_t; using uint16_t = std::uint16_t; using uint32_t = std::uint32_t; using uint64_t = std::uint64_t; using size_t = uint64_t; using ssize_t = int64_t; using off_t = int64_t; using uint = uint32_t; using sint = int32_t; using slong = int64_t; using ulong = uint64_t; template using ptr = T *; template using cptr = T *const; using caddr_t = ptr; inline ErrorCode uread(void *kernelAddress, ptr userAddress, size_t size) { std::memcpy(kernelAddress, userAddress, size); return {}; } inline ErrorCode uwrite(ptr userAddress, const void *kernelAddress, size_t size) { std::memcpy(userAddress, kernelAddress, size); return {}; } inline ErrorCode ureadString(char *kernelAddress, size_t kernelSize, ptr userAddress) { std::strncpy(kernelAddress, userAddress, kernelSize); if (kernelAddress[kernelSize - 1] != '\0') { kernelAddress[kernelSize - 1] = '\0'; return ErrorCode::NAMETOOLONG; } return {}; } template T uread(ptr pointer) { T result; uread(&result, pointer, sizeof(T)); return result; } template void uwrite(ptr pointer, T data) { uwrite(pointer, &data, sizeof(T)); } uint64_t readRegister(void *context, RegisterId id); void writeRegister(void *context, RegisterId id, uint64_t value); } // namespace orbis