Merge pull request #3005 from babyhuey/feat/libkernel-preadv

feat(libkernel): implement preadv and pwritev
This commit is contained in:
Adrià 2026-10-10 23:52:58 +02:00 committed by GitHub
commit c051e83c4e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 0 deletions

View File

@ -885,6 +885,16 @@ int64_t APS5_VABI sceKernelPwritev(int d, const KernelIovec* iov, int iovcnt, in
#endif
int64_t APS5_VABI preadv_nid_postfix(int d, const KernelIovec* iov, int iovcnt, int64_t offset) {
const auto result = sceKernelPreadv(d, iov, iovcnt, offset);
return result < 0 ? PosixFailure(static_cast<int>(result) & 0xffff) : result;
}
int64_t APS5_VABI pwritev_nid_postfix(int d, const KernelIovec* iov, int iovcnt, int64_t offset) {
const auto result = sceKernelPwritev(d, iov, iovcnt, offset);
return result < 0 ? PosixFailure(static_cast<int>(result) & 0xffff) : result;
}
int APS5_VABI sceKernelRename(const char* from, const char* to) {
if (from == nullptr || to == nullptr) throw std::invalid_argument("sceKernelRename: path is null");
const auto source = ResolvePath_nid_no_patch(from);

View File

@ -36,6 +36,9 @@ std::int64_t APS5_VABI sceKernelReadv(int, const GuestIovec*, int);
std::int64_t APS5_VABI sceKernelWritev(int, const GuestIovec*, int);
std::int64_t APS5_VABI sceKernelPreadv(int, const GuestIovec*, int, std::int64_t);
std::int64_t APS5_VABI sceKernelPwritev(int, const GuestIovec*, int, std::int64_t);
std::int64_t APS5_VABI preadv_nid_postfix(int, const GuestIovec*, int, std::int64_t);
std::int64_t APS5_VABI pwritev_nid_postfix(int, const GuestIovec*, int, std::int64_t);
int* APS5_VABI __error_nid_postfix();
std::int64_t APS5_VABI sceKernelPread(int, void*, std::size_t, std::int64_t);
std::int64_t APS5_VABI sceKernelPwrite(int, const void*, std::size_t, std::int64_t);
int APS5_VABI sceKernelFtruncate(int, std::int64_t);
@ -123,6 +126,30 @@ int main() {
Require(sceKernelPwritev(file, writes, 2, -1) == ErrorEinval);
Require(Contents(path) == "01ABCDE7ABCDE");
Require(sceKernelLseek(file, 4, 0) == 4);
Require(preadv_nid_postfix(file, reads, 2, 1) == 7);
Require(std::memcmp(first, "1AB", 3) == 0 && std::memcmp(second, "CDE7", 4) == 0);
Require(sceKernelLseek(file, 0, 1) == 4);
Require(preadv_nid_postfix(file, reads, 2, 13) == 0);
Require(preadv_nid_postfix(file, reads, 2, -1) == -1 && *__error_nid_postfix() == 22);
Require(preadv_nid_postfix(file, reads, -1, 0) == -1 && *__error_nid_postfix() == 22);
Require(preadv_nid_postfix(file, nullptr, 1, 0) == -1 && *__error_nid_postfix() == 14);
Require(pwritev_nid_postfix(file, writes, 2, 8) == 5);
Require(sceKernelLseek(file, 0, 1) == 4);
Require(Contents(path) == "01ABCDE7ABCDE");
char x[] = "X";
char y[] = "Y";
GuestIovec marks[2] = {{x, 1}, {y, 1}};
Require(pwritev_nid_postfix(file, marks, 2, 0) == 2);
Require(Contents(path) == "XYABCDE7ABCDE");
char zero[] = "0";
char one[] = "1";
GuestIovec restore[2] = {{zero, 1}, {one, 1}};
Require(pwritev_nid_postfix(file, restore, 2, 0) == 2);
Require(sceKernelLseek(file, 0, 1) == 4);
Require(pwritev_nid_postfix(file, writes, 2, -1) == -1 && *__error_nid_postfix() == 22);
Require(pwritev_nid_postfix(file, nullptr, 1, 0) == -1 && *__error_nid_postfix() == 14);
char byte = 0;
Require(sceKernelPread(file, &byte, 1, 2) == 1 && byte == 'A');
Require(sceKernelPread(file, nullptr, 0, 0) == 0);