summaryrefslogtreecommitdiff
path: root/src/mailbox.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailbox.h')
-rw-r--r--src/mailbox.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/mailbox.h b/src/mailbox.h
new file mode 100644
index 0000000..e96a4ed
--- /dev/null
+++ b/src/mailbox.h
@@ -0,0 +1,38 @@
1#pragma once
2
3#include <stdint.h>
4
5// The channel takes the lower 4 bits; the data pointer the upper 28. So a mail
6// must be aligned to a 16-byte boundary.
7#define MAIL_ALIGN 16
8
9enum
10{
11 PROPERTY_CHANNEL = 8,
12};
13
14typedef struct Tag {
15 union {
16 uint32_t all;
17 struct {
18 uint16_t command : 12; // Command.
19 uint8_t type : 4; // Command type.
20 uint8_t device : 4; // Hardware device.
21 uint16_t zeroes : 12; // Reserved.
22 } id;
23 };
24 uint32_t size; // Buffer size.
25 uint32_t code; // Request/response code.
26 uint32_t data[1]; // Buffer data.
27} Tag;
28
29typedef struct __attribute__((aligned(MAIL_ALIGN))) Mail {
30 uint32_t size; // Buffer size.
31 uint32_t code; // Request/response code.
32 Tag tags[1]; // Variable quantity.
33} Mail;
34
35void mbox_init();
36const Mail* mbox_read(uint8_t channel);
37void mbox_write(uint8_t channel, const void* mail);
38