add packet bound checks as an option
This commit is contained in:
parent
a3f4bd2378
commit
4f8fc7bdfd
45
lib/maca.c
45
lib/maca.c
|
@ -10,6 +10,15 @@
|
|||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#ifndef MACA_BOUND_CHECK
|
||||
#define MACA_BOUND_CHECK 0
|
||||
#endif
|
||||
#if (MACA_BOUND_CHECK == 0)
|
||||
#define BOUND_CHECK(x)
|
||||
#else
|
||||
#define BOUND_CHECK(x) bound_check(x)
|
||||
#endif
|
||||
|
||||
#ifndef NUM_PACKETS
|
||||
#define NUM_PACKETS 8
|
||||
#endif
|
||||
|
@ -101,6 +110,20 @@ void Print_Packets(char *s) {
|
|||
printf("found %d packets\n\r",i);
|
||||
}
|
||||
|
||||
inline void bad_packet_bounds(void) {
|
||||
while(1) { continue; }
|
||||
}
|
||||
|
||||
void bound_check(volatile packet_t *p) {
|
||||
volatile int i;
|
||||
if((p == 0) ||
|
||||
(p == &dummy_ack)) { return; }
|
||||
for(i=0; i < NUM_PACKETS; i++) {
|
||||
if(p == &packet_pool[i]) { return; }
|
||||
}
|
||||
bad_packet_bounds();
|
||||
}
|
||||
|
||||
|
||||
/* public packet routines */
|
||||
/* heads are to the right */
|
||||
|
@ -108,13 +131,19 @@ void Print_Packets(char *s) {
|
|||
void free_packet(volatile packet_t *p) {
|
||||
safe_irq_disable(MACA);
|
||||
|
||||
BOUND_CHECK(p);
|
||||
|
||||
if(!p) { PRINTF("free_packet passed packet 0\n\r"); return; }
|
||||
if(p == &dummy_ack) { return; }
|
||||
|
||||
BOUND_CHECK(free_head);
|
||||
|
||||
p->length = 0; p->offset = 0;
|
||||
p->left = free_head; p->right = 0;
|
||||
free_head = p;
|
||||
|
||||
BOUND_CHECK(free_head);
|
||||
|
||||
irq_restore();
|
||||
return;
|
||||
}
|
||||
|
@ -124,12 +153,16 @@ volatile packet_t* get_free_packet(void) {
|
|||
|
||||
safe_irq_disable(MACA);
|
||||
|
||||
BOUND_CHECK(free_head);
|
||||
|
||||
p = free_head;
|
||||
if( p != 0 ) {
|
||||
free_head = p->left;
|
||||
free_head->right = 0;
|
||||
}
|
||||
|
||||
BOUND_CHECK(free_head);
|
||||
|
||||
// print_packets("get_free_packet");
|
||||
irq_restore();
|
||||
return p;
|
||||
|
@ -154,6 +187,8 @@ void post_receive(void) {
|
|||
return;
|
||||
}
|
||||
}
|
||||
BOUND_CHECK(dma_rx);
|
||||
BOUND_CHECK(dma_tx);
|
||||
*MACA_DMARX = (uint32_t)&(dma_rx->data[0]);
|
||||
/* with timeout */
|
||||
*MACA_SFTCLK = *MACA_CLK + RECV_SOFTIMEOUT; /* soft timeout */
|
||||
|
@ -176,6 +211,8 @@ volatile packet_t* rx_packet(void) {
|
|||
volatile packet_t *p;
|
||||
safe_irq_disable(MACA);
|
||||
|
||||
BOUND_CHECK(rx_head);
|
||||
|
||||
p = rx_head;
|
||||
if( p != 0 ) {
|
||||
rx_head = p->left;
|
||||
|
@ -203,6 +240,8 @@ void post_tx(void) {
|
|||
}
|
||||
|
||||
}
|
||||
BOUND_CHECK(dma_rx);
|
||||
BOUND_CHECK(dma_tx);
|
||||
*MACA_DMARX = (uint32_t)&(dma_rx->data[0]);
|
||||
/* disable soft timeout clock */
|
||||
/* disable start clock */
|
||||
|
@ -227,6 +266,8 @@ void post_tx(void) {
|
|||
void tx_packet(volatile packet_t *p) {
|
||||
safe_irq_disable(MACA);
|
||||
|
||||
BOUND_CHECK(p);
|
||||
|
||||
if(!p) { PRINTF("tx_packet passed packet 0\n\r"); return; }
|
||||
if(tx_head == 0) {
|
||||
/* start a new queue if empty */
|
||||
|
@ -266,6 +307,8 @@ void free_tx_head(void) {
|
|||
volatile packet_t *p;
|
||||
safe_irq_disable(MACA);
|
||||
|
||||
BOUND_CHECK(tx_head);
|
||||
|
||||
p = tx_head;
|
||||
tx_head = tx_head->left;
|
||||
if(tx_head == 0) { tx_end = 0; }
|
||||
|
@ -279,6 +322,8 @@ void free_tx_head(void) {
|
|||
void add_to_rx(volatile packet_t *p) {
|
||||
safe_irq_disable(MACA);
|
||||
|
||||
BOUND_CHECK(p);
|
||||
|
||||
if(!p) { PRINTF("add_to_rx passed packet 0\n\r"); return; }
|
||||
p->offset = 1; /* first byte is the length */
|
||||
if(rx_head == 0) {
|
||||
|
|
Loading…
Reference in a new issue