HIPC: Difference between revisions

No edit summary
Line 13: Line 13:
| 0 || 27-24 || Number of buf B descriptors (each: 3 words).
| 0 || 27-24 || Number of buf B descriptors (each: 3 words).
|-
|-
| 0 || 31-28 || Number of type W desciptors (each: 3 words), never observed.
| 0 || 31-28 || Number of buf W desciptors (each: 3 words), never observed.
|-
|-
| 1 || 9-0 || Total word count (in u32's).
| 1 || 9-0 || Total word count (in u32's).
Line 118: Line 118:
| ... || Rest of raw data.
| ... || Rest of raw data.
|}
|}
== Official marshalling code ==
The official marshalling function takes an array of (buf_ptr, size) pairs and a type-field for each such pair.
Bitmask 0x10 seems to indicate null-terminated strings, but that flag is ignored by the marshalling code.


== Official marshalling code ==
== Official marshalling code ==
Line 127: Line 132:
! Type Mask || Description || Direction
! Type Mask || Description || Direction
|-
|-
| 4 + 1 || Creates an A descriptor || In
| 4 + 1 || Creates a A descriptor with flags=0. || In
|-
| 0x40 + 4 + 1 || Creates a A descriptor with flags=1. || In
|-
| 0x80 + 4 + 1 || Creates a A descriptor with flags=3. || In?
|-
|-
| 4 + 2 || Creates a B descriptor || Out
| 4 + 2 || Creates a B descriptor with flags=0. || Out
|-
| 0x40 + 4 + 2 || Creates a B descriptor with flags=1. || Out
|-
| 0x80 + 4 + 2 || Creates a B descriptor with flags=3. || Out?
|-
|-
| 8 + 1 || Creates an X descriptor ||
| 8 + 1 || Creates an X descriptor ||
|-
|-
| 8 + 2 || Creates a C descriptor || Out
| 8 + 2 || Creates a C descriptor || Out
|-
| 0x10 + 8 + 2 || Creates a C descriptor, and writes the u16 size to an offset into raw data. || Out
|-
|-
| 0x20 + 1 || Creates both an A and X descriptor ||
| 0x20 + 1 || Creates both an A and X descriptor ||
|-
| 0x20 + 2 || Creates both an B and C descriptor ||
|}
|}
For types 0x21, 0x22 if size doesn't fit in u16, it's added to a list.


== Official IPC Cmd Structure ==
== Official IPC Cmd Structure ==
Line 156: Line 176:
   u32 offset_a_descriptors;
   u32 offset_a_descriptors;
   u32 offset_b_descriptors;
   u32 offset_b_descriptors;
  u32 offset_w_descriptors; /* this is a guess */
  u32 offset_raw_data;
   u32 offset_c_descriptors;
   u32 offset_c_descriptors;
  u32 offset_raw_data;
  u32 unk1;
   u32 unk2;
   u32 unk2;
   u32 unk3;
   u32 unk3;
  }
  }