mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-05 13:20:11 +00:00
Merge pull request #7625 from voidlakhan/fix/ampr-null-command-buffer
fix(ampr): validate null command buffer arguments
This commit is contained in:
3 files changed
+15
No files matched your search
@@ -347,6 +347,7 @@ std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWaitOnCounter() { return sizeof
|
||||
std::uint64_t APS5_VABI sceAmprMeasureCommandSizeWriteKernelEventQueueOnCompletion() { return sizeof(Apr::WriteKernelEventQueueCommand); }
|
||||
|
||||
int APS5_VABI sceAmprAprCommandBufferConstructor(Apr::CommandBufferObject* buffer, uint64_t* gatherState, uint64_t* scatterState) {
|
||||
if (!buffer || !gatherState || !scatterState) return SCE_KERNEL_ERROR_EINVAL;
|
||||
buffer->type = Apr::BufferType::Apr;
|
||||
*gatherState = 0;
|
||||
*scatterState = 0;
|
||||
@@ -452,6 +453,7 @@ int APS5_VABI sceAmprCommandBufferConstructNop(Apr::CommandBufferObject* buffer,
|
||||
}
|
||||
|
||||
int APS5_VABI sceAmprCommandBufferConstructor(Apr::CommandBufferObject* buffer) {
|
||||
if (!buffer) return SCE_KERNEL_ERROR_EINVAL;
|
||||
*buffer = {Apr::BufferType::Generic, 0, 0, 0, 0, nullptr};
|
||||
return 0;
|
||||
}
|
||||
@@ -506,12 +508,14 @@ int APS5_VABI sceAmprCommandBufferPushMarkerWithColor(Apr::CommandBufferObject*
|
||||
}
|
||||
|
||||
int APS5_VABI sceAmprCommandBufferReset(Apr::CommandBufferObject* buffer) {
|
||||
if (!buffer) return SCE_KERNEL_ERROR_EINVAL;
|
||||
buffer->offset = 0;
|
||||
buffer->numCommands = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int APS5_VABI sceAmprCommandBufferSetBuffer(Apr::CommandBufferObject* buffer, void* memory, uint32_t size) {
|
||||
if (!buffer) return SCE_KERNEL_ERROR_EINVAL;
|
||||
buffer->base = static_cast<uint8_t*>(memory);
|
||||
buffer->size = size;
|
||||
buffer->offset = 0;
|
||||
|
||||
@@ -243,6 +243,16 @@ void TestRejectedArguments() {
|
||||
Require(sceAmprMeasureCommandSizePushMarkerWithColor(nullptr, color) == rejected);
|
||||
Require(sceAmprMeasureCommandSizeSetMarker(nullptr) == rejected);
|
||||
Require(sceAmprMeasureCommandSizeSetMarkerWithColor(nullptr, color) == rejected);
|
||||
|
||||
std::uint64_t gatherState = 0;
|
||||
std::uint64_t scatterState = 0;
|
||||
std::array<std::uint8_t, 64> memory{};
|
||||
Require(sceAmprCommandBufferConstructor(nullptr) == invalidArgument);
|
||||
Require(sceAmprAprCommandBufferConstructor(nullptr, &gatherState, &scatterState) == invalidArgument);
|
||||
Require(sceAmprAprCommandBufferConstructor(&recorder.buffer, nullptr, &scatterState) == invalidArgument);
|
||||
Require(sceAmprAprCommandBufferConstructor(&recorder.buffer, &gatherState, nullptr) == invalidArgument);
|
||||
Require(sceAmprCommandBufferReset(nullptr) == invalidArgument);
|
||||
Require(sceAmprCommandBufferSetBuffer(nullptr, memory.data(), memory.size()) == invalidArgument);
|
||||
}
|
||||
|
||||
void TestFullBuffer() {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
### Unknown function info
|
||||
|
||||
- [AMPR command buffer null arguments](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - the result for a null command buffer is unknown for `sceAmprCommandBufferConstructor`, `sceAmprAprCommandBufferConstructor`, `sceAmprCommandBufferReset` and `sceAmprCommandBufferSetBuffer`; these return `SCE_KERNEL_ERROR_EINVAL` here, but the behavior has not been confirmed on a PS5.
|
||||
- [AMPR WriteAddressFromCounterPairOnCompletion](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - the pair of an even counter n is assumed to give counter n in the low 32 bits and n + 1 in the high 32 bits. Wait compare values, wait flush and counter index ranges follow the [ampr_emu](https://github.com/drakmor/ampr_emu) reimplementation; the flush is accepted and has no effect, as commands run in order
|
||||
- [AMPR command buffer offsets](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - recording with a current offset greater than the bound memory size throws before calculating remaining capacity or writing a command. This validates the emulator's own command-buffer encoding; the console's response to a corrupted opaque buffer object is unknown.
|
||||
- [AMPR command sizes](../../../core/libs/prx/libSceAmpr/Export.cpp) (libSceAmpr) - commands use the emulator's own encoding with an 8-byte header, so `Nop(n)` takes 8 + 4n bytes where the console record is n dwords including its header (`NopWithData(n)`: (n + 1) dwords). The measure functions agree with the appended sizes, but a title that pads to an exact offset or the end of the buffer with `Nop(remaining / 4)` gets `SCE_KERNEL_ERROR_EBUSY` or a shifted offset. The at-start flag of the `_04_00` writes is ignored; commands run in order, each after the previous one completes
|
||||
|
||||
Reference in new issue
Block a user