IRUSER Shared Memory

From 3dbrew
Revision as of 17:19, 22 February 2017 by Wwylele (talk | contribs)
Jump to navigation Jump to search

This is the shared-memory for "ir:USER", which is provided by the application via InitializeIrnop or InitializeIrnopShared. The size of the shared memory is determined by parameters of the Init functions above.

Overall Structure

The shared memory consists of 2 or 5 components, depending on which Init function is called. For InitializeIrnopShared, ir service puts more information to the shared memory and applications can read it directly; for InitializeIrnop, ir service puts less information and store the rest in its local storage. All these components are adjacent to each other, without any padding, which means the data can be unaligned if the size specified in Init is unaligned.

Size Description
0x10 StatusInfo. Only presents when InitializeIrnopShared is called
0x10 ReceiveBufferInfo. Only presents when InitializeIrnopShared is called
(specified by Init paramter) ReceiveBuffer
0x10 SendBufferInfo. Only presents when InitializeIrnopShared is called
(specified by Init paramter) SendBuffer

StatusInfo

Relative offset Size Description
0x0 0x4 Latest receive error result. Read by IRUSER:GetLatestReceiveErrorResult
0x4 0x4 Latest Send error result. Read by IRUSER:GetLatestSendErrorResult
0x8 0x1 Connection status. Read by IRUSER:GetConnectionStatus
0x9 0x1 Trying to connect status. Read by IRUSER:GetTryingToConnectStatus
0xA 0x1 Connection role. Read by IRUSER:GetConnectionRole
0xB 0x1 Machine ID. Set by IRUSER:SetOwnMachineId
0xC 0x4 Unknown

ReceiveBufferInfo/SendBufferInfo

(Information below is poorly verified against real hardware. Please help me verify them -- Wwylele (talk))

The BufferInfo sections store data validity information for the two buffers

Relative offset Size Description
0x0 0x4 Start index of valid packages
0x4 0x4 End index of valid packages
0x8 0x4 Number valid packages
0xC 0x4 Unknown

ReceiveBuffer/SendBuffer

Relative offset Size Description
0x0 0x8 * package_count (specified in Init parameter) PackageInfo{u32 offset_to_data_buffer, u32 data_length}
0x8 * package_count buffer_size - 0x8 * package_count Data buffer

The buffers are two circular buffers. A new package is added to the end of previous package in the data buffer, with package info added to PackageInfo[end_index++]. Note that if an added package exceeds the end of the buffer, the exceeding data will be wrapped around to the beginning of the data buffer.