IPC: Difference between revisions
m spelling |
Fix source code missing |
||
(One intermediate revision by one other user not shown) | |||
Line 231: | Line 231: | ||
|- | |- | ||
| 2 | | 2 | ||
| 0x00000004 <nowiki>|</nowiki> (size<< | | 0x00000004 <nowiki>|</nowiki> (size<<8) <nowiki>|</nowiki> (static_buffer_id<<4) | ||
<ptr> | <ptr> | ||
| This is typically used for RW buffers over PXI, but any process can use this. The address written to the destination cmd-buf is a phys-addr for a table located in the corresponding static buffer of the receiving process (which must be provided by the latter, otherwise the kernel dereferences NULL). Each static buffer needs to be page-aligned and musn't exceed a page's length (kernelpanic otherwise). This table contains the phys-addrs for the actual data, the array entries have the following format: {u32 *datachunk_physaddr, u32 datachunk_bytesize}. | | This is typically used for RW buffers over PXI, but any process can use this. The address written to the destination cmd-buf is a phys-addr for a table located in the corresponding static buffer of the receiving process (which must be provided by the latter, otherwise the kernel dereferences NULL). Each static buffer needs to be page-aligned and musn't exceed a page's length (kernelpanic otherwise). This table contains the phys-addrs for the actual data, the array entries have the following format: {u32 *datachunk_physaddr, u32 datachunk_bytesize}. | ||
|- | |- | ||
| 3 | | 3 | ||
| 0x00000006 <nowiki>|</nowiki> (size<< | | 0x00000006 <nowiki>|</nowiki> (size<<8) <nowiki>|</nowiki> (static_buffer_id<<4) | ||
<ptr> | <ptr> | ||
| Same as above except for read-only buffer. Prior(?) to the kernel version which implemented memory-permission checking for PXI buffers, this was unused and hence triggered a kernelpanic. | | Same as above except for read-only buffer. Prior(?) to the kernel version which implemented memory-permission checking for PXI buffers, this was unused and hence triggered a kernelpanic. | ||
Line 267: | Line 267: | ||
while (true) { | while (true) { | ||
Result res = svcReplyAndReceive(&requesting_index, | Result res = svcReplyAndReceive(&requesting_index, handles, 1 + connected_clients, reply_target); | ||
if (res == 0xC920181A) { | if (res == 0xC920181A) { |