summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Srivatsan <srivatsan@cs.stanford.edu>2023-03-19 18:14:16 -0700
committerAkshay Srivatsan <srivatsan@cs.stanford.edu>2023-03-19 18:14:16 -0700
commit868b71680667f55144bd4f85edbfb0b4373a4eb3 (patch)
tree204176ba01f9c9e60260264b7a5e972bb49fe455
parentf8bd8bd70cb15e60d5176c575690bf11ecc8f87e (diff)
Add timing checks
-rw-r--r--bootloader/Makefile8
-rw-r--r--bootloader/bootloader.c22
-rw-r--r--bootloader/crc32.c6
3 files changed, 26 insertions, 10 deletions
diff --git a/bootloader/Makefile b/bootloader/Makefile
index c0cbbb2..c2ef1f4 100644
--- a/bootloader/Makefile
+++ b/bootloader/Makefile
@@ -12,19 +12,19 @@ LD=$(PREFIX)-ld
OBJDUMP=$(PREFIX)-objdump
OBJCOPY=$(PREFIX)-objcopy
-OPT ?= 0
+OPT ?= 3
COMMON_FLAGS=-MMD -ffreestanding -nostdlib -nostartfiles -march=rv64imafc -mabi=lp64
CFLAGS=$(COMMON_FLAGS) -O$(OPT)
ASFLAGS=$(COMMON_FLAGS)
-LDFLAGS=-nostdlib
+LDFLAGS=-nostdlib -flto
all: tags $(TARGET)
clean:
rm -f *.o *.elf *.bin *.d tags
-tags:
+tags: $(wildcard *.[chS])
ctags *.[chS]
ifneq ($(MAKECMDGOALS),clean)
@@ -45,7 +45,7 @@ bootloader.elf: memmap.ld $(OBJ)
$(CC) -c $< $(CFLAGS) -o $@
run: $(TARGET)
- ox-flash --keep-open $(TARGET)
+ ox-flash --bootloader --run --echo $(TARGET)
.PHONY: all clean run
.PRECIOUS: %.list
diff --git a/bootloader/bootloader.c b/bootloader/bootloader.c
index e67f087..d119351 100644
--- a/bootloader/bootloader.c
+++ b/bootloader/bootloader.c
@@ -11,10 +11,13 @@ struct PACKED payload {
extern const struct payload payload;
+#define CLOCK 1000000
+#define CKSUM 1
+
void kmain() {
{
TRACE("uart init\n");
- uart_init(2000000);
+ uart_init(115200);
gpio_set_function(14, GPIO_UART);
gpio_set_function(15, GPIO_UART);
@@ -38,23 +41,36 @@ void kmain() {
INFO("psram init success\n");
}
TRACE("timer init\n");
- timer_init(1000000);
+ timer_init(CLOCK);
INFO("addr = 0x%lx\n", payload.entry);
INFO("size = 0x%x\n", payload.size);
INFO("cksum = 0x%x\n", payload.cksum);
DEBUG("copying %d bytes of code to address %p\n", payload.size, payload.entry);
+ u64 start = timer_read();
memcpy((void *)payload.entry, payload.data, payload.size);
+ u64 end = timer_read();
+ u64 ms = (end - start) * 1000 / CLOCK;
+ DEBUG("memcpy took %d ms\n", ms);
+#if CKSUM
+ start = timer_read();
uint32_t cksum = crc32((void *)payload.entry, payload.size);
+ end = timer_read();
+ ms = (end - start) * 1000 / CLOCK;
+ DEBUG("crc32 took %d ms\n", ms);
if (payload.cksum != cksum) {
- ERROR("invalid checksum\n");
+ ERROR("invalid checksum: got 0x%x, expected 0x%x\n", cksum, payload.cksum);
ERROR("refusing to boot\n");
while(1);
} else {
INFO("valid checksum: 0x%x\n", cksum);
}
+#else
+#warning "Checksum verification disabled."
+ WARN("not verifying checksum\n");
+#endif
TRACE("branching to code\n");
void (*fn)(void) = (void (*)(void))payload.entry;
diff --git a/bootloader/crc32.c b/bootloader/crc32.c
index 794ba6a..9025b5e 100644
--- a/bootloader/crc32.c
+++ b/bootloader/crc32.c
@@ -1,8 +1,8 @@
#include "crc32.h"
-/* ***********************************************************************
- * Simple public domain implementation of the standard CRC32 checksum.
- * http://home.thep.lu.se/~bjorn/crc/crc32_simple.c
+/*
+ * Based on
+ * https://github.com/dddrrreee/cs140e-23win/blob/main/libpi/libc/crc.c
*/
static uint32_t crc32_tab[] = {
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback