summaryrefslogtreecommitdiff
path: root/libhw
diff options
context:
space:
mode:
Diffstat (limited to 'libhw')
-rw-r--r--libhw/host_alarmclock.c43
-rw-r--r--libhw/host_include/libhw/host_alarmclock.h4
-rw-r--r--libhw/host_net.c4
-rw-r--r--libhw/rp2040_hwtimer.c42
-rw-r--r--libhw/rp2040_include/libhw/rp2040_hwtimer.h2
-rw-r--r--libhw/w5500.c32
6 files changed, 41 insertions, 86 deletions
diff --git a/libhw/host_alarmclock.c b/libhw/host_alarmclock.c
index bb1821a..19ece7c 100644
--- a/libhw/host_alarmclock.c
+++ b/libhw/host_alarmclock.c
@@ -10,7 +10,6 @@
#include <libcr/coroutine.h>
#include <libmisc/assert.h>
-#include <libmisc/vcall.h>
#define IMPLEMENTATION_FOR_LIBHW_GENERIC_ALARMCLOCK_H YES
#include <libhw/generic/alarmclock.h>
@@ -20,28 +19,9 @@
#include "host_util.h" /* for host_sigrt_alloc(), ns_to_host_ns_time() */
-/* Globals ********************************************************************/
+LO_IMPLEMENTATION_C(alarmclock, struct hostclock, hostclock, static)
-static uint64_t hostclock_get_time_ns(implements_alarmclock *self);
-static bool hostclock_add_trigger(implements_alarmclock *self,
- struct alarmclock_trigger *trigger,
- uint64_t fire_at_ns,
- void (*cb)(void *),
- void *cb_arg);
-static void hostclock_del_trigger(implements_alarmclock *self,
- struct alarmclock_trigger *trigger);
-
-struct alarmclock_vtable hostclock_vtable = {
- .get_time_ns = hostclock_get_time_ns,
- .add_trigger = hostclock_add_trigger,
- .del_trigger = hostclock_del_trigger,
-};
-
-/* Main implementation ********************************************************/
-
-static uint64_t hostclock_get_time_ns(implements_alarmclock *_alarmclock) {
- struct hostclock *alarmclock =
- VCALL_SELF(struct hostclock, implements_alarmclock, _alarmclock);
+static uint64_t hostclock_get_time_ns(struct hostclock *alarmclock) {
assert(alarmclock);
struct timespec ts;
@@ -76,13 +56,11 @@ static void hostclock_handle_sig_alarm(int LM_UNUSED(sig), siginfo_t *info, void
}
}
-static bool hostclock_add_trigger(implements_alarmclock *_alarmclock,
- struct alarmclock_trigger *trigger,
- uint64_t fire_at_ns,
- void (*cb)(void *),
- void *cb_arg) {
- struct hostclock *alarmclock =
- VCALL_SELF(struct hostclock, implements_alarmclock, _alarmclock);
+static bool hostclock_add_trigger(struct hostclock *alarmclock,
+ struct alarmclock_trigger *trigger,
+ uint64_t fire_at_ns,
+ void (*cb)(void *),
+ void *cb_arg) {
assert(alarmclock);
assert(trigger);
assert(fire_at_ns);
@@ -133,11 +111,8 @@ static bool hostclock_add_trigger(implements_alarmclock *_alarmclock,
return false;
}
-static void hostclock_del_trigger(implements_alarmclock *_alarmclock,
- struct alarmclock_trigger *trigger) {
- struct hostclock *alarmclock =
- VCALL_SELF(struct hostclock, implements_alarmclock, _alarmclock);
-
+static void hostclock_del_trigger(struct hostclock *alarmclock,
+ struct alarmclock_trigger *trigger) {
assert(alarmclock);
assert(trigger);
diff --git a/libhw/host_include/libhw/host_alarmclock.h b/libhw/host_include/libhw/host_alarmclock.h
index 163fb9f..89df68a 100644
--- a/libhw/host_include/libhw/host_alarmclock.h
+++ b/libhw/host_include/libhw/host_alarmclock.h
@@ -14,7 +14,6 @@
#include <libhw/generic/alarmclock.h>
struct hostclock {
- implements_alarmclock;
clockid_t clock_id;
BEGIN_PRIVATE(LIBHW_HOST_ALARMCLOCK_H)
@@ -23,7 +22,6 @@ struct hostclock {
struct alarmclock_trigger *queue;
END_PRIVATE(LIBHW_HOST_ALARMCLOCK_H)
};
-
-extern struct alarmclock_vtable hostclock_vtable;
+LO_IMPLEMENTATION_H(alarmclock, struct hostclock, hostclock)
#endif /* _LIBHW_HOST_ALARMCLOCK_H_ */
diff --git a/libhw/host_net.c b/libhw/host_net.c
index bf79480..3352b87 100644
--- a/libhw/host_net.c
+++ b/libhw/host_net.c
@@ -267,7 +267,7 @@ static ssize_t hostnet_tcp_read(implements_net_stream_conn *_conn, void *buf, si
.ret = &ret,
};
if (conn->read_deadline_ns) {
- uint64_t now_ns = VCALL(bootclock, get_time_ns);
+ uint64_t now_ns = LO_CALL(bootclock, get_time_ns);
if (conn->read_deadline_ns < now_ns)
return -NET_ERECV_TIMEOUT;
args.timeout = ns_to_host_us_time(conn->read_deadline_ns-now_ns);
@@ -534,7 +534,7 @@ static ssize_t hostnet_udp_recvfrom(implements_net_packet_conn *_conn, void *buf
.ret_port = ret_port,
};
if (conn->read_deadline_ns) {
- uint64_t now_ns = VCALL(bootclock, get_time_ns);
+ uint64_t now_ns = LO_CALL(bootclock, get_time_ns);
if (conn->read_deadline_ns < now_ns)
return -NET_ERECV_TIMEOUT;
args.timeout = ns_to_host_us_time(conn->read_deadline_ns-now_ns);
diff --git a/libhw/rp2040_hwtimer.c b/libhw/rp2040_hwtimer.c
index 6c871a3..ada6246 100644
--- a/libhw/rp2040_hwtimer.c
+++ b/libhw/rp2040_hwtimer.c
@@ -9,10 +9,10 @@
#include <libcr/coroutine.h>
#include <libmisc/assert.h>
-#include <libmisc/vcall.h>
#define IMPLEMENTATION_FOR_LIBHW_GENERIC_ALARMCLOCK_H YES
#include <libhw/generic/alarmclock.h>
+
#include <libhw/rp2040_hwtimer.h>
/******************************************************************************/
@@ -23,46 +23,32 @@ void add_alarm_at(void) {};
/* Types **********************************************************************/
struct rp2040_hwtimer {
- implements_alarmclock;
enum rp2040_hwalarm_instance alarm_num;
bool initialized;
struct alarmclock_trigger *queue;
};
+LO_IMPLEMENTATION_H(alarmclock, struct rp2040_hwtimer, rp2040_hwtimer);
+LO_IMPLEMENTATION_C(alarmclock, struct rp2040_hwtimer, rp2040_hwtimer, static);
/* Globals ********************************************************************/
-static uint64_t rp2040_hwtimer_get_time_ns(implements_alarmclock *self);
-static bool rp2040_hwtimer_add_trigger(implements_alarmclock *self,
- struct alarmclock_trigger *trigger,
- uint64_t fire_at_ns,
- void (*cb)(void *),
- void *cb_arg);
-static void rp2040_hwtimer_del_trigger(implements_alarmclock *self,
- struct alarmclock_trigger *trigger);
-
-static struct alarmclock_vtable rp2040_hwtimer_vtable = {
- .get_time_ns = rp2040_hwtimer_get_time_ns,
- .add_trigger = rp2040_hwtimer_add_trigger,
- .del_trigger = rp2040_hwtimer_del_trigger,
-};
-
static struct rp2040_hwtimer hwtimers[] = {
- { .vtable = &rp2040_hwtimer_vtable, .alarm_num = 0 },
- { .vtable = &rp2040_hwtimer_vtable, .alarm_num = 1 },
- { .vtable = &rp2040_hwtimer_vtable, .alarm_num = 2 },
- { .vtable = &rp2040_hwtimer_vtable, .alarm_num = 3 },
+ { .alarm_num = 0 },
+ { .alarm_num = 1 },
+ { .alarm_num = 2 },
+ { .alarm_num = 3 },
};
static_assert(sizeof(hwtimers)/sizeof(hwtimers[0]) == _RP2040_HWALARM_NUM);
/* Main implementation ********************************************************/
-implements_alarmclock *rp2040_hwtimer(enum rp2040_hwalarm_instance alarm_num) {
+lo_interface alarmclock rp2040_hwtimer(enum rp2040_hwalarm_instance alarm_num) {
assert(alarm_num < _RP2040_HWALARM_NUM);
- return &hwtimers[alarm_num];
+ return lo_box_rp2040_hwtimer_as_alarmclock(&hwtimers[alarm_num]);
}
-static uint64_t rp2040_hwtimer_get_time_ns(implements_alarmclock *) {
+static uint64_t rp2040_hwtimer_get_time_ns(struct rp2040_hwtimer *) {
return timer_time_us_64(timer_hw) * (NS_PER_S/US_PER_S);
}
@@ -91,13 +77,11 @@ static void rp2040_hwtimer_intrhandler(void) {
timer_hw->alarm[alarm_num] = (uint32_t)NS_TO_US_ROUNDUP(alarmclock->queue->fire_at_ns);
}
-static bool rp2040_hwtimer_add_trigger(implements_alarmclock *_alarmclock,
+static bool rp2040_hwtimer_add_trigger(struct rp2040_hwtimer *alarmclock,
struct alarmclock_trigger *trigger,
uint64_t fire_at_ns,
void (*cb)(void *),
void *cb_arg) {
- struct rp2040_hwtimer *alarmclock =
- VCALL_SELF(struct rp2040_hwtimer, implements_alarmclock, _alarmclock);
assert(alarmclock);
assert(trigger);
assert(fire_at_ns);
@@ -147,10 +131,8 @@ static bool rp2040_hwtimer_add_trigger(implements_alarmclock *_alarmclock,
return false;
}
-static void rp2040_hwtimer_del_trigger(implements_alarmclock *_alarmclock,
+static void rp2040_hwtimer_del_trigger(struct rp2040_hwtimer *alarmclock,
struct alarmclock_trigger *trigger) {
- struct rp2040_hwtimer *alarmclock =
- VCALL_SELF(struct rp2040_hwtimer, implements_alarmclock, _alarmclock);
assert(alarmclock);
assert(trigger);
diff --git a/libhw/rp2040_include/libhw/rp2040_hwtimer.h b/libhw/rp2040_include/libhw/rp2040_hwtimer.h
index 645ba20..40e4172 100644
--- a/libhw/rp2040_include/libhw/rp2040_hwtimer.h
+++ b/libhw/rp2040_include/libhw/rp2040_hwtimer.h
@@ -20,6 +20,6 @@ enum rp2040_hwalarm_instance {
_RP2040_HWALARM_NUM,
};
-implements_alarmclock *rp2040_hwtimer(enum rp2040_hwalarm_instance alarm_num);
+lo_interface alarmclock rp2040_hwtimer(enum rp2040_hwalarm_instance alarm_num);
#endif /* _LIBHW_RP2040_HWTIMER_H_ */
diff --git a/libhw/w5500.c b/libhw/w5500.c
index cebcf8e..5a9a718 100644
--- a/libhw/w5500.c
+++ b/libhw/w5500.c
@@ -1,6 +1,6 @@
/* libhw/w5500.c - <libhw/generic/net.h> implementation for the WIZnet W5500 chip
*
- * Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
* -----------------------------------------------------------------------------
@@ -744,7 +744,7 @@ static ssize_t w5500_tcp_read(implements_net_stream_conn *_socket, void *buf, si
struct alarmclock_trigger trigger = {0};
if (socket->read_deadline_ns)
- VCALL(bootclock, add_trigger, &trigger,
+ LO_CALL(bootclock, add_trigger, &trigger,
socket->read_deadline_ns,
w5500_tcp_alarm_handler,
socket);
@@ -753,12 +753,12 @@ static ssize_t w5500_tcp_read(implements_net_stream_conn *_socket, void *buf, si
uint16_t avail = 0;
for (;;) {
if (!socket->read_open) {
- VCALL(bootclock, del_trigger, &trigger);
+ LO_CALL(bootclock, del_trigger, &trigger);
debugf(" => soft closed");
return -NET_ECLOSED;
}
- if (socket->read_deadline_ns && socket->read_deadline_ns <= VCALL(bootclock, get_time_ns)) {
- VCALL(bootclock, del_trigger, &trigger);
+ if (socket->read_deadline_ns && socket->read_deadline_ns <= LO_CALL(bootclock, get_time_ns)) {
+ LO_CALL(bootclock, del_trigger, &trigger);
debugf(" => recv timeout");
return -NET_ERECV_TIMEOUT;
}
@@ -770,7 +770,7 @@ static ssize_t w5500_tcp_read(implements_net_stream_conn *_socket, void *buf, si
case STATE_TCP_FIN_WAIT:
break; /* OK */
default:
- VCALL(bootclock, del_trigger, &trigger);
+ LO_CALL(bootclock, del_trigger, &trigger);
cr_mutex_unlock(&chip->mu);
debugf(" => hard closed");
return -NET_ECLOSED;
@@ -781,7 +781,7 @@ static ssize_t w5500_tcp_read(implements_net_stream_conn *_socket, void *buf, si
/* We have data to read. */
break;
if (state == STATE_TCP_CLOSE_WAIT) {
- VCALL(bootclock, del_trigger, &trigger);
+ LO_CALL(bootclock, del_trigger, &trigger);
cr_mutex_unlock(&chip->mu);
debugf(" => EOF");
return 0;
@@ -801,7 +801,7 @@ static ssize_t w5500_tcp_read(implements_net_stream_conn *_socket, void *buf, si
w5500ll_write_sock_reg(chip->spidev, socknum, rx_read_pointer, uint16be_marshal(ptr+avail));
w5500_socket_cmd(socket, CMD_RECV);
/* Return. */
- VCALL(bootclock, del_trigger, &trigger);
+ LO_CALL(bootclock, del_trigger, &trigger);
cr_mutex_unlock(&chip->mu);
return avail;
}
@@ -916,23 +916,23 @@ static ssize_t w5500_udp_recvfrom(implements_net_packet_conn *_socket, void *buf
struct alarmclock_trigger trigger = {0};
if (socket->read_deadline_ns)
- VCALL(bootclock, add_trigger, &trigger,
- socket->read_deadline_ns,
- w5500_udp_alarm_handler,
- socket);
+ LO_CALL(bootclock, add_trigger, &trigger,
+ socket->read_deadline_ns,
+ w5500_udp_alarm_handler,
+ socket);
/* Wait until there is data to read. */
uint16_t avail = 0;
for (;;) {
- if (socket->read_deadline_ns && socket->read_deadline_ns <= VCALL(bootclock, get_time_ns)) {
- VCALL(bootclock, del_trigger, &trigger);
+ if (socket->read_deadline_ns && socket->read_deadline_ns <= LO_CALL(bootclock, get_time_ns)) {
+ LO_CALL(bootclock, del_trigger, &trigger);
debugf(" => recv timeout");
return -NET_ERECV_TIMEOUT;
}
cr_mutex_lock(&chip->mu);
uint8_t state = w5500ll_read_sock_reg(chip->spidev, socknum, state);
if (state != STATE_UDP) {
- VCALL(bootclock, del_trigger, &trigger);
+ LO_CALL(bootclock, del_trigger, &trigger);
debugf(" => hard closed");
return -NET_ECLOSED;
}
@@ -970,7 +970,7 @@ static ssize_t w5500_udp_recvfrom(implements_net_packet_conn *_socket, void *buf
w5500ll_write_sock_reg(chip->spidev, socknum, rx_read_pointer, uint16be_marshal(ptr+8+len));
w5500_socket_cmd(socket, CMD_RECV);
/* Return. */
- VCALL(bootclock, del_trigger, &trigger);
+ LO_CALL(bootclock, del_trigger, &trigger);
cr_mutex_unlock(&chip->mu);
return len;
}