diff options
author | Akshay Srivatsan <srivatsan@cs.stanford.edu> | 2023-03-19 18:14:16 -0700 |
---|---|---|
committer | Akshay Srivatsan <srivatsan@cs.stanford.edu> | 2023-03-19 18:14:16 -0700 |
commit | 868b71680667f55144bd4f85edbfb0b4373a4eb3 (patch) | |
tree | 204176ba01f9c9e60260264b7a5e972bb49fe455 | |
parent | f8bd8bd70cb15e60d5176c575690bf11ecc8f87e (diff) |
Add timing checks
-rw-r--r-- | bootloader/Makefile | 8 | ||||
-rw-r--r-- | bootloader/bootloader.c | 22 | ||||
-rw-r--r-- | bootloader/crc32.c | 6 |
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[] = { |