Skip to content

Commit 76ae950

Browse files
committed
switch console to sync-only
1 parent c7d8279 commit 76ae950

File tree

4 files changed

+32
-121
lines changed

4 files changed

+32
-121
lines changed

libtock/console.c

Lines changed: 11 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -4,138 +4,39 @@
44

55
#include "console.h"
66

7-
typedef struct putstr_data {
8-
char* buf;
9-
int len;
10-
bool called;
11-
struct putstr_data* next;
12-
} putstr_data_t;
13-
14-
static putstr_data_t *putstr_head = NULL;
15-
static putstr_data_t *putstr_tail = NULL;
16-
17-
static void putstr_upcall(int _x __attribute__ ((unused)),
18-
int _y __attribute__ ((unused)),
19-
int _z __attribute__ ((unused)),
20-
void* ud __attribute__ ((unused))) {
21-
putstr_data_t* data = putstr_head;
22-
data->called = true;
23-
putstr_head = data->next;
24-
25-
if (putstr_head == NULL) {
26-
putstr_tail = NULL;
27-
} else {
28-
int ret;
29-
ret = putnstr_async(putstr_head->buf, putstr_head->len, putstr_upcall, NULL);
30-
if (ret < 0) {
31-
// XXX There's no path to report errors currently, so just drop it
32-
putstr_upcall(0, 0, 0, NULL);
33-
}
34-
}
35-
}
36-
377
int putnstr(const char *str, size_t len) {
388
int ret = RETURNCODE_SUCCESS;
399

40-
putstr_data_t* data = (putstr_data_t*)malloc(sizeof(putstr_data_t));
41-
if (data == NULL) return RETURNCODE_ENOMEM;
42-
43-
data->len = len;
44-
data->called = false;
45-
data->buf = (char*)malloc(len * sizeof(char));
46-
if (data->buf == NULL) {
47-
ret = RETURNCODE_ENOMEM;
48-
goto putnstr_fail_buf_alloc;
49-
}
50-
strncpy(data->buf, str, len);
51-
data->next = NULL;
52-
53-
if (putstr_tail == NULL) {
54-
// Invariant, if tail is NULL, head is also NULL
55-
ret = putnstr_async(data->buf, data->len, putstr_upcall, NULL);
56-
if (ret < 0) goto putnstr_fail_async;
57-
putstr_head = data;
58-
putstr_tail = data;
59-
} else {
60-
putstr_tail->next = data;
61-
putstr_tail = data;
62-
}
63-
64-
yield_for(&data->called);
65-
66-
putnstr_fail_async:
67-
free(data->buf);
68-
putnstr_fail_buf_alloc:
69-
free(data);
70-
71-
return ret;
72-
}
73-
74-
int putnstr_async(const char *str, size_t len, subscribe_upcall cb, void* userdata) {
75-
#pragma GCC diagnostic push
76-
#pragma GCC diagnostic pop
77-
7810
allow_ro_return_t ro = allow_readonly(DRIVER_NUM_CONSOLE, 1, str, len);
7911
if (!ro.success) {
8012
return tock_status_to_returncode(ro.status);
8113
}
8214

83-
subscribe_return_t sub = subscribe(DRIVER_NUM_CONSOLE, 1, cb, userdata);
84-
if (!sub.success) {
85-
return tock_status_to_returncode(sub.status);
86-
}
87-
8815
syscall_return_t com = command(DRIVER_NUM_CONSOLE, 1, len, 0);
89-
return tock_command_return_novalue_to_returncode(com);
90-
}
91-
92-
int getnstr_async(char *buf, size_t len, subscribe_upcall cb, void* userdata) {
93-
allow_rw_return_t rw = allow_readwrite(DRIVER_NUM_CONSOLE, 1, buf, len);
94-
if (!rw.success) {
95-
return tock_status_to_returncode(rw.status);
96-
}
97-
98-
subscribe_return_t sub = subscribe(DRIVER_NUM_CONSOLE, 2, cb, userdata);
99-
if (!sub.success) {
100-
return tock_status_to_returncode(sub.status);
16+
ret = tock_command_return_novalue_to_returncode(com);
17+
if (ret < 0) {
18+
return ret;
10119
}
10220

103-
syscall_return_t com = command(DRIVER_NUM_CONSOLE, 2, len, 0);
104-
return tock_command_return_novalue_to_returncode(com);
21+
return yield_for_subscribable_upcall_returnr0_sync(DRIVER_NUM_CONSOLE, 2);
10522
}
10623

107-
typedef struct getnstr_data {
108-
bool called;
109-
int result;
110-
} getnstr_data_t;
111-
112-
static getnstr_data_t getnstr_data = { true, 0 };
11324

114-
static void getnstr_upcall(int result,
115-
int _y __attribute__ ((unused)),
116-
int _z __attribute__ ((unused)),
117-
void* ud __attribute__ ((unused))) {
118-
getnstr_data.result = result;
119-
getnstr_data.called = true;
120-
}
121-
122-
int getnstr(char *str, size_t len) {
25+
int getnstr(char *buf, size_t len) {
12326
int ret;
12427

125-
if (!getnstr_data.called) {
126-
// A call is already in progress
127-
return RETURNCODE_EALREADY;
28+
allow_rw_return_t rw = allow_readwrite(DRIVER_NUM_CONSOLE, 1, buf, len);
29+
if (!rw.success) {
30+
return tock_status_to_returncode(rw.status);
12831
}
129-
getnstr_data.called = false;
13032

131-
ret = getnstr_async(str, len, getnstr_upcall, NULL);
33+
syscall_return_t com = command(DRIVER_NUM_CONSOLE, 2, len, 0);
34+
ret = tock_command_return_novalue_to_returncode(com);
13235
if (ret < 0) {
13336
return ret;
13437
}
13538

136-
yield_for(&getnstr_data.called);
137-
138-
return getnstr_data.result;
39+
return yield_for_subscribable_upcall_returnr0_sync(DRIVER_NUM_CONSOLE, 2);
13940
}
14041

14142
int getch(void) {
@@ -145,8 +46,3 @@ int getch(void) {
14546
r = getnstr(buf, 1);
14647
return (r == RETURNCODE_SUCCESS) ? buf[0] : RETURNCODE_FAIL;
14748
}
148-
149-
int getnstr_abort(void) {
150-
syscall_return_t com = command(DRIVER_NUM_CONSOLE, 3, 0, 0);
151-
return tock_command_return_novalue_to_returncode(com);
152-
}

libtock/console.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,12 @@ extern "C" {
99
#define DRIVER_NUM_CONSOLE 0x1
1010

1111
int putnstr(const char* str, size_t len);
12-
int putnstr_async(const char* str, size_t len, subscribe_upcall cb, void* userdata);
1312

1413
int getnstr(char *str, size_t len);
15-
int getnstr_async(char *str, size_t len, subscribe_upcall cb, void* userdata);
1614

1715
/* Returns TOCK_FAIL on failure, or else the character received */
1816
int getch(void);
1917

20-
// Abort an ongoing receive call.
21-
int getnstr_abort(void);
22-
2318
#ifdef __cplusplus
2419
}
2520
#endif

libtock/tock.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,25 @@ int yield_no_wait(void) {
193193
}
194194
}
195195

196+
int yield_for_subscribable_upcall_returnr0_sync(uint32_t driver, uint32_t subscribe) {
197+
register uint32_t wait __asm__ ("r0") = 2; // yield-waitfor-nocallback
198+
register uint8_t* wait_field __asm__ ("r1") = NULL; // yield result ptr
199+
register uint32_t r2 __asm__ ("r2") = driver;
200+
register uint32_t r3 __asm__ ("r3") = subscribe;
201+
register int rv0 __asm__ ("r0");
202+
register int rv1 __asm__ ("r1");
203+
register int rv2 __asm__ ("r2");
204+
205+
__asm__ volatile (
206+
"svc 0 \n"
207+
: "=r" (rv0), "=r" (rv1), "=r" (rv2)
208+
: "r" (wait), "r" (wait_field), "r" (r2), "r" (r3)
209+
: "memory"
210+
);
211+
return rv0;
212+
}
213+
214+
196215
void tock_exit(uint32_t completion_code) {
197216
register uint32_t r0 __asm__ ("r0") = 0; // Terminate
198217
register uint32_t r1 __asm__ ("r1") = completion_code;

libtock/tock.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,10 @@ int tock_allow_ro_return_to_returncode(allow_ro_return_t);
164164
int tock_enqueue(subscribe_upcall cb, int arg0, int arg1, int arg2, void* ud);
165165

166166
int yield_check_tasks(void);
167+
int yield_no_wait(void);
167168
void yield(void);
168169
void yield_for(bool*);
169-
int yield_no_wait(void);
170+
int yield_for_subscribable_upcall_returnr0_sync(uint32_t driver, uint32_t subscribe);
170171

171172
void tock_exit(uint32_t completion_code) __attribute__ ((noreturn));
172173
void tock_restart(uint32_t completion_code) __attribute__ ((noreturn));

0 commit comments

Comments
 (0)