mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
libkernel: implement sceKernelAioWaitRequests (#1109)
kernel: implement batch AIO completion waits Co-authored-by: nmzik <Nmzik@mail.ru>
This commit is contained in:
committed by
GitHub
parent
7415febd93
commit
e7cfe5a2f7
@@ -169,12 +169,14 @@ void TestAioBatches() {
|
||||
using Batch = int (KYTY_SYSV_ABI *)(int32_t *, int32_t, int32_t *);
|
||||
using Single = int (KYTY_SYSV_ABI *)(int32_t, int32_t *);
|
||||
using Wait = int (KYTY_SYSV_ABI *)(int32_t, int32_t *, uint32_t *);
|
||||
using WaitBatch = int (KYTY_SYSV_ABI *)(int32_t *, int32_t, int32_t *, uint32_t, uint32_t *);
|
||||
const auto submit = reinterpret_cast<Submit>(find("HgX7+AORI58"));
|
||||
const auto poll = reinterpret_cast<Batch>(find("o7O4z3jwKzo"));
|
||||
const auto erase = reinterpret_cast<Batch>(find("Ft3EtsZzAoY"));
|
||||
const auto poll_one = reinterpret_cast<Single>(find("2pOuoWoCxdk"));
|
||||
const auto erase_one = reinterpret_cast<Single>(find("5TgME6AYty4"));
|
||||
const auto wait = reinterpret_cast<Wait>(find("KOF-oJbQVvc"));
|
||||
const auto wait_batch = reinterpret_cast<WaitBatch>(find("lgK+oIWkJyA"));
|
||||
constexpr char Payload[] = "AIO payload";
|
||||
const int fd = FileSystem::KernelOpen("/savedata0/aio.dat", 0x602, 0777);
|
||||
Check(fd >= 3 && FileSystem::KernelWrite(fd, Payload, sizeof(Payload)) == sizeof(Payload),
|
||||
@@ -191,14 +193,22 @@ void TestAioBatches() {
|
||||
}
|
||||
ids[2] = -1;
|
||||
std::array<int32_t, 3> states {-1, -1, -1};
|
||||
Check(poll(ids.data(), ids.size(), states.data()) == OK &&
|
||||
uint32_t timeout = 0;
|
||||
Check(wait_batch(ids.data(), ids.size(), states.data(), 2, &timeout) == OK &&
|
||||
states[0] == 3 && states[1] == 3 && states[2] == Kernel::KERNEL_ERROR_ESRCH,
|
||||
"batch poll writes every state and per-request invalid-ID error");
|
||||
"OR wait observes completed reads and invalid-ID errors even with a zero timeout");
|
||||
Check(poll_one(ids[0], &states[0]) == OK && states[0] == (3 | 0x10000) &&
|
||||
poll(ids.data(), 2, states.data()) == OK &&
|
||||
states[0] == (3 | 0x10000) && states[1] == (3 | 0x10000) &&
|
||||
wait(ids[0], &states[0], nullptr) == OK && states[0] == (3 | 0x10000),
|
||||
"single and batch polls and waits share completion notification state");
|
||||
timeout = 1000000;
|
||||
Check(wait_batch(ids.data(), ids.size(), states.data(), 1, &timeout) == OK &&
|
||||
states[0] == (3 | 0x10000) && states[1] == (3 | 0x10000) &&
|
||||
states[2] == Kernel::KERNEL_ERROR_ESRCH && timeout <= 1000000 &&
|
||||
wait_batch(ids.data(), ids.size(), states.data(), 2, nullptr) == OK &&
|
||||
wait_batch(ids.data(), 1, states.data(), 0, nullptr) == OK,
|
||||
"AND and OR waits return when all IDs are terminal and one-ID waits ignore mode");
|
||||
Check(erase(ids.data(), ids.size(), states.data()) == OK &&
|
||||
states[0] == OK && states[1] == OK && states[2] == Kernel::KERNEL_ERROR_ESRCH,
|
||||
"batch deletion writes per-request results");
|
||||
@@ -221,6 +231,22 @@ void TestAioBatches() {
|
||||
}),
|
||||
"maximum-sized batch returns all invalid-ID errors");
|
||||
}
|
||||
states.fill(42);
|
||||
Check(wait_batch(nullptr, 1, states.data(), 1, nullptr) == Kernel::KERNEL_ERROR_EFAULT &&
|
||||
wait_batch(ids.data(), 1, nullptr, 1, nullptr) == Kernel::KERNEL_ERROR_EFAULT &&
|
||||
wait_batch(ids.data(), 0, states.data(), 1, nullptr) == Kernel::KERNEL_ERROR_EINVAL &&
|
||||
wait_batch(ids.data(), 129, states.data(), 1, nullptr) == Kernel::KERNEL_ERROR_EINVAL &&
|
||||
wait_batch(ids.data(), 2, states.data(), 0, nullptr) == Kernel::KERNEL_ERROR_EINVAL &&
|
||||
wait_batch(ids.data(), 2, states.data(), 3, nullptr) == Kernel::KERNEL_ERROR_EINVAL &&
|
||||
states == std::array<int32_t, 3> {42, 42, 42},
|
||||
"invalid wait arguments do not modify outputs");
|
||||
std::array<int32_t, 128> invalid_ids {};
|
||||
std::array<int32_t, 128> errors {};
|
||||
Check(wait_batch(invalid_ids.data(), invalid_ids.size(), errors.data(), 1, nullptr) == OK &&
|
||||
std::all_of(errors.begin(), errors.end(), [](int32_t error) {
|
||||
return error == Kernel::KERNEL_ERROR_ESRCH;
|
||||
}),
|
||||
"maximum-sized wait returns every invalid-ID error");
|
||||
Check(FileSystem::KernelClose(fd) == OK, "close AIO read fixture");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user