diff --git a/abstract-machine/README b/abstract-machine/README index 2e0392a..b67eb91 100644 --- a/abstract-machine/README +++ b/abstract-machine/README @@ -1,4 +1,4 @@ -AbstractMachine is a minimal, modularized, and machine-independent +AbstractMachine is a minimal, modularized, and machine-independent abstraction layer of the computer hardware: * physical memory and direct execution (The "Turing Machine"); @@ -9,5 +9,5 @@ abstraction layer of the computer hardware: CONTACTS -Bug reports and suggestions go to Yanyan Jiang (jyy@nju.edu.cn) and Zihao +Bug reports and suggestions go to Yanyan Jiang (jyy@nju.edu.cn) and Zihao Yu (yuzihao@ict.ac.cn). diff --git a/abstract-machine/am/src/native/mpe.c b/abstract-machine/am/src/native/mpe.c index a25c0fe..ec51442 100644 --- a/abstract-machine/am/src/native/mpe.c +++ b/abstract-machine/am/src/native/mpe.c @@ -1,5 +1,5 @@ -#include #include "platform.h" +#include int __am_mpe_init = 0; extern bool __am_has_ioe; @@ -16,7 +16,8 @@ bool mpe_init(void (*entry)()) { char ch; assert(read(sync_pipe[0], &ch, 1) == 1); assert(ch == '+'); - close(sync_pipe[0]); close(sync_pipe[1]); + close(sync_pipe[0]); + close(sync_pipe[1]); thiscpu->cpuid = i; __am_init_timer_irq(); @@ -31,8 +32,9 @@ bool mpe_init(void (*entry)()) { for (int i = 1; i < cpu_count(); i++) { assert(write(sync_pipe[1], "+", 1) == 1); } - close(sync_pipe[0]); close(sync_pipe[1]); - + close(sync_pipe[0]); + close(sync_pipe[1]); + entry(); panic("MP entry should not return\n"); } @@ -42,9 +44,7 @@ int cpu_count() { return __am_ncpu; } -int cpu_current() { - return thiscpu->cpuid; -} +int cpu_current() { return thiscpu->cpuid; } int atomic_xchg(int *addr, int newval) { return atomic_exchange((int *)addr, newval); diff --git a/abstract-machine/am/src/x86/qemu/trap32.S b/abstract-machine/am/src/x86/qemu/trap32.S index b0b41a8..43fb2e2 100644 --- a/abstract-machine/am/src/x86/qemu/trap32.S +++ b/abstract-machine/am/src/x86/qemu/trap32.S @@ -55,25 +55,25 @@ __am_iret: popl %edi popl %ebp iret - + .kernel_iret: popl %eax popl %ebx popl %ecx popl %edx addl $4, %esp - + /* stack frame: 28 ss 24 esp (not popped by iret when returning to ring0) 20 eflags ---> move to new-esp 16 cs 12 eip - 8 ebp - 4 edi + 8 ebp + 4 edi 0 esi <--- %esp */ - + movl %esp, %ebp movl 24(%ebp), %edi // %edi is new-esp diff --git a/abstract-machine/klib/src/string.c b/abstract-machine/klib/src/string.c index 931e7dd..f8d95be 100644 --- a/abstract-machine/klib/src/string.c +++ b/abstract-machine/klib/src/string.c @@ -1,5 +1,5 @@ -#include #include +#include #include #if !defined(__ISA_NATIVE__) || defined(__NATIVE_USE_KLIB__) @@ -7,14 +7,15 @@ size_t strlen(const char *s) { const char *p = s; size_t len = 0; - while(*(p++) != '\0') len++; + while (*(p++) != '\0') + len++; return len; } char *strcpy(char *dst, const char *src) { char *p_dst = dst; const char *p_src = src; - for(; *p_src != '\0'; p_src++, p_dst++) { + for (; *p_src != '\0'; p_src++, p_dst++) { *p_dst = *p_src; } *p_dst = '\0'; @@ -23,10 +24,10 @@ char *strcpy(char *dst, const char *src) { char *strncpy(char *dst, const char *src, size_t n) { int i = 0; - for(; i < n && src[i] != '\0'; i++) { + for (; i < n && src[i] != '\0'; i++) { dst[i] = src[i]; } - for(; i < n; i++) { + for (; i < n; i++) { dst[i] = '\0'; } return dst; @@ -35,8 +36,9 @@ char *strncpy(char *dst, const char *src, size_t n) { char *strcat(char *dst, const char *src) { char *p_dst = dst; const char *p_src = src; - while(*p_dst != '\0') p_dst++; - for(; *p_src != '\0'; p_src++, p_dst++) { + while (*p_dst != '\0') + p_dst++; + for (; *p_src != '\0'; p_src++, p_dst++) { *p_dst = *p_src; } *p_dst = '\0'; @@ -45,54 +47,56 @@ char *strcat(char *dst, const char *src) { int strcmp(const char *s1, const char *s2) { const char *p_s1 = s1, *p_s2 = s2; - for(; *p_s1 == *p_s2; p_s1++, p_s2++) { - if(*p_s1 == '\0' || *p_s2 == '\0') { + for (; *p_s1 == *p_s2; p_s1++, p_s2++) { + if (*p_s1 == '\0' || *p_s2 == '\0') { break; } - } + } return *p_s1 - *p_s2; } int strncmp(const char *s1, const char *s2, size_t n) { const char *p_s1 = s1, *p_s2 = s2; int i = 0; - for(i = 0; i < n - 1; i++) { - if(s1[i] == '\0' || s2[i] == '\0') + for (i = 0; i < n - 1; i++) { + if (s1[i] == '\0' || s2[i] == '\0') break; - } + } return s1[i] - s2[i]; } void *memset(void *s, int c, size_t n) { uint8_t *p = s; - for(int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { p[i] = c; } return s; } void *memmove(void *dst, const void *src, size_t n) { - if (src + n > dst && src < dst) { + if (src + n > dst && src < dst) { size_t len = dst - src; void *p_dst = (void *)src + n; const void *p_src = src + n - len; - while(p_dst >= dst) { + while (p_dst >= dst) { memcpy(p_dst, p_src, len); p_src -= len; p_dst -= len; } - if(n % len) memcpy(dst, src, n % len); + if (n % len) + memcpy(dst, src, n % len); } else if (dst < src && dst + n > src) { size_t len = src - dst; void *p_dst = dst; const void *p_src = src; - while(p_src < src + n) { + while (p_src < src + n) { memcpy(p_dst, p_src, len); p_src += len; p_dst += len; } - if(n % len) memcpy(p_dst, p_src, n % len); - } else { + if (n % len) + memcpy(p_dst, p_src, n % len); + } else { memcpy(dst, src, n); } @@ -100,7 +104,7 @@ void *memmove(void *dst, const void *src, size_t n) { } void *memcpy(void *out, const void *in, size_t n) { - for (size_t i = 0 ; i < n ; i++) { + for (size_t i = 0; i < n; i++) { *(uint8_t *)(out + i) = *(uint8_t *)(in + i); } return out; @@ -109,9 +113,10 @@ void *memcpy(void *out, const void *in, size_t n) { int memcmp(const void *s1, const void *s2, size_t n) { const uint8_t *p1 = s1, *p2 = s2; for (int i = 0; i < n; i++) { - if(*p1 != *p2) + if (*p1 != *p2) return p1 - p2; - p1++; p2++; + p1++; + p2++; } return 0; } diff --git a/diffu b/diffu index 0c590d2..645b0f6 160000 --- a/diffu +++ b/diffu @@ -1 +1 @@ -Subproject commit 0c590d218be4b2df4f8f827a9fd40278c227a1ca +Subproject commit 645b0f607ae510fda4d71b8152ea932a2b38bc32 diff --git a/nemu/Makefile b/nemu/Makefile index e5e5838..1a645d7 100644 --- a/nemu/Makefile +++ b/nemu/Makefile @@ -83,7 +83,7 @@ $(IMAGES): %: %.bin $(BINARY) @echo + TEST $(notdir $<) @$(BINARY) -b $< >/dev/null 2>&1 || printf "\t%14s\n" $(notdir $<) >> $(RESULT) -integration-tests: $(IMAGES) +integration-tests: $(IMAGES) @printf "$(COLOR_BLUE)INTEGRATION TEST:$(COLOR_NONE)\n\tALL: %s\n\tFAILED: %s\n" $(words $(IMAGES)) $(shell wc -l $(RESULT) | cut -f1 -d' ') @test ! -s $(RESULT) || printf "$(COLOR_RED)FAILED:$(COLOR_NONE)\n" @cat $(RESULT) diff --git a/nemu/resource/sdcard/README.md b/nemu/resource/sdcard/README.md index 80324e0..cad435a 100644 --- a/nemu/resource/sdcard/README.md +++ b/nemu/resource/sdcard/README.md @@ -38,15 +38,15 @@ @@ -983,6 +983,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, int err = 0; u32 status; - + + return err; do { bool done = time_after(jiffies, timeout); - + --- linux/drivers/mmc/core/core.h +++ linux/drivers/mmc/core/core.h @@ -64,6 +64,7 @@ void mmc_set_initial_state(struct mmc_host *host); - + static inline void mmc_delay(unsigned int ms) { + return; diff --git a/nemu/src/isa/mips32/logo.c b/nemu/src/isa/mips32/logo.c index 9fedb02..e3c0968 100644 --- a/nemu/src/isa/mips32/logo.c +++ b/nemu/src/isa/mips32/logo.c @@ -16,63 +16,62 @@ // refer to http://www.patorjk.com/software/taag/#p=display&f=Big&t=Type%20Something%20 /* - _ ____ ___ __ __ _ + _ ____ ___ __ __ _ (_) |___ \__ \ | \/ | | | _ __ ___ _ _ __ ___ __) | ) | | \ / | __ _ _ __ _ _ __ _| | | '_ ` _ \| | '_ \/ __||__ < / / | |\/| |/ _` | '_ \| | | |/ _` | | | | | | | | | |_) \__ \___) / /_ | | | | (_| | | | | |_| | (_| | | |_| |_| |_|_| .__/|___/____/____| |_| |_|\__,_|_| |_|\__,_|\__,_|_| - | | - |_| + | | + |_| */ unsigned char isa_logo[] = { - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x5f, 0x29, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x5f, 0x5f, - 0x5f, 0x20, 0x5c, 0x5f, 0x5f, 0x20, 0x5c, 0x20, 0x20, 0x7c, 0x20, 0x20, - 0x5c, 0x2f, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x20, 0x5f, 0x20, - 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x20, 0x5f, 0x20, - 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x29, - 0x20, 0x7c, 0x20, 0x29, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x5c, 0x20, 0x20, - 0x2f, 0x20, 0x7c, 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x20, 0x5f, 0x20, 0x5f, - 0x5f, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x5f, 0x5f, - 0x20, 0x5f, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, - 0x60, 0x20, 0x5f, 0x20, 0x5c, 0x7c, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, - 0x5c, 0x2f, 0x20, 0x5f, 0x5f, 0x7c, 0x7c, 0x5f, 0x5f, 0x20, 0x3c, 0x20, - 0x2f, 0x20, 0x2f, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x5c, 0x2f, 0x7c, 0x20, - 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, 0x5c, - 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, - 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, - 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x5f, 0x29, 0x20, 0x5c, - 0x5f, 0x5f, 0x20, 0x5c, 0x5f, 0x5f, 0x5f, 0x29, 0x20, 0x2f, 0x20, 0x2f, - 0x5f, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x20, - 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, - 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, - 0x7c, 0x0a, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, - 0x5f, 0x7c, 0x5f, 0x7c, 0x20, 0x2e, 0x5f, 0x5f, 0x2f, 0x7c, 0x5f, 0x5f, - 0x5f, 0x2f, 0x5f, 0x5f, 0x5f, 0x5f, 0x2f, 0x5f, 0x5f, 0x5f, 0x5f, 0x7c, - 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x20, 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, - 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, - 0x2c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, - 0x5f, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, '\0' -}; + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x5f, 0x29, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x5f, 0x5f, + 0x5f, 0x20, 0x5c, 0x5f, 0x5f, 0x20, 0x5c, 0x20, 0x20, 0x7c, 0x20, 0x20, + 0x5c, 0x2f, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x20, 0x5f, 0x20, + 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x20, 0x5f, 0x20, + 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x29, + 0x20, 0x7c, 0x20, 0x29, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x5c, 0x20, 0x20, + 0x2f, 0x20, 0x7c, 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x20, 0x5f, 0x20, 0x5f, + 0x5f, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x5f, 0x5f, + 0x20, 0x5f, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, + 0x60, 0x20, 0x5f, 0x20, 0x5c, 0x7c, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, + 0x5c, 0x2f, 0x20, 0x5f, 0x5f, 0x7c, 0x7c, 0x5f, 0x5f, 0x20, 0x3c, 0x20, + 0x2f, 0x20, 0x2f, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x5c, 0x2f, 0x7c, 0x20, + 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, 0x5c, + 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, + 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, + 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x5f, 0x29, 0x20, 0x5c, + 0x5f, 0x5f, 0x20, 0x5c, 0x5f, 0x5f, 0x5f, 0x29, 0x20, 0x2f, 0x20, 0x2f, + 0x5f, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, + 0x7c, 0x0a, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, + 0x5f, 0x7c, 0x5f, 0x7c, 0x20, 0x2e, 0x5f, 0x5f, 0x2f, 0x7c, 0x5f, 0x5f, + 0x5f, 0x2f, 0x5f, 0x5f, 0x5f, 0x5f, 0x2f, 0x5f, 0x5f, 0x5f, 0x5f, 0x7c, + 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x20, 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, + 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, + 0x2c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, + 0x5f, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, '\0'}; diff --git a/nemu/src/isa/riscv32/logo.c b/nemu/src/isa/riscv32/logo.c index d693d43..c731672 100644 --- a/nemu/src/isa/riscv32/logo.c +++ b/nemu/src/isa/riscv32/logo.c @@ -16,7 +16,7 @@ // refer to http://www.patorjk.com/software/taag/#p=display&f=Big&t=Type%20Something%20 /* - _ __ __ _ + _ __ __ _ (_) | \/ | | | _ __ _ ___ ___ ________ __ | \ / | __ _ _ __ _ _ __ _| | | '__| / __|/ __|______\ \ / / | |\/| |/ _` | '_ \| | | |/ _` | | @@ -25,39 +25,49 @@ */ -unsigned char isa_logo[] = { - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x20, - 0x20, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x5f, 0x29, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x5c, 0x2f, 0x20, 0x20, 0x7c, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, - 0x7c, 0x0a, 0x20, 0x20, 0x5f, 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x20, 0x5f, - 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, - 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x20, 0x7c, 0x20, - 0x5c, 0x20, 0x20, 0x2f, 0x20, 0x7c, 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x20, - 0x5f, 0x20, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x20, 0x5f, 0x20, - 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x20, - 0x27, 0x5f, 0x5f, 0x7c, 0x20, 0x2f, 0x20, 0x5f, 0x5f, 0x7c, 0x2f, 0x20, - 0x5f, 0x5f, 0x7c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5c, 0x20, 0x5c, - 0x20, 0x2f, 0x20, 0x2f, 0x20, 0x7c, 0x20, 0x7c, 0x5c, 0x2f, 0x7c, 0x20, - 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, 0x5c, - 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, - 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, - 0x5c, 0x5f, 0x5f, 0x20, 0x5c, 0x20, 0x28, 0x5f, 0x5f, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x20, 0x56, 0x20, 0x2f, 0x20, 0x20, - 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x7c, - 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, - 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x0a, 0x20, - 0x7c, 0x5f, 0x7c, 0x20, 0x20, 0x7c, 0x5f, 0x7c, 0x5f, 0x5f, 0x5f, 0x2f, - 0x5c, 0x5f, 0x5f, 0x5f, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5c, 0x5f, 0x2f, 0x20, 0x20, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x20, - 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x20, - 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, - 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x0a, '\0' /* Termination Character is indispensable! */ +unsigned char + isa_logo + [] = + { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x5f, 0x29, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, + 0x20, 0x20, 0x5c, 0x2f, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x20, 0x5f, 0x20, 0x5f, 0x5f, + 0x20, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, + 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x20, 0x7c, 0x20, 0x5c, 0x20, + 0x20, 0x2f, 0x20, 0x7c, 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x20, + 0x5f, 0x20, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x20, 0x20, 0x20, + 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x20, 0x5f, 0x7c, 0x20, 0x7c, + 0x0a, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x5f, 0x7c, 0x20, 0x2f, + 0x20, 0x5f, 0x5f, 0x7c, 0x2f, 0x20, 0x5f, 0x5f, 0x7c, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5c, 0x20, 0x5c, 0x20, 0x2f, + 0x20, 0x2f, 0x20, 0x7c, 0x20, 0x7c, 0x5c, 0x2f, 0x7c, 0x20, + 0x7c, 0x2f, 0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x27, 0x5f, + 0x20, 0x5c, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x2f, + 0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, + 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x5c, 0x5f, 0x5f, 0x20, + 0x5c, 0x20, 0x28, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x20, 0x56, 0x20, 0x2f, 0x20, 0x20, + 0x7c, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x28, + 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, + 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x7c, + 0x20, 0x7c, 0x20, 0x7c, 0x0a, 0x20, 0x7c, 0x5f, 0x7c, 0x20, + 0x20, 0x7c, 0x5f, 0x7c, 0x5f, 0x5f, 0x5f, 0x2f, 0x5c, 0x5f, + 0x5f, 0x5f, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5c, 0x5f, 0x2f, 0x20, 0x20, 0x20, 0x7c, 0x5f, 0x7c, + 0x20, 0x20, 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, + 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, + 0x2c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5f, + 0x7c, 0x0a, '\0' /* Termination Character is indispensable! */ }; diff --git a/nemu/src/utils/ftrace.c b/nemu/src/utils/ftrace.c index a522be7..228eb34 100644 --- a/nemu/src/utils/ftrace.c +++ b/nemu/src/utils/ftrace.c @@ -17,10 +17,12 @@ static int cmp_func_t(const void *a, const void *b) { static func_t *get_func(vaddr_t addr) { int l = 0, r = func_table_len - 1; - while(l <= r) { + while (l <= r) { int mid = (l + r) / 2; - if(func_table[mid].start <= addr) l = mid + 1; - else r = mid - 1; + if (func_table[mid].start <= addr) + l = mid + 1; + else + r = mid - 1; } return l == 0 ? NULL : &func_table[l - 1]; } @@ -33,20 +35,27 @@ void init_elf(const char *path) { func_table = (func_t *)calloc(func_table_size, sizeof(func_t)); assert(func_table); - FAILED_GOTO(failed_header, fread(&header, sizeof(Elf32_Ehdr), 1, elf_file) <= 0); + FAILED_GOTO(failed_header, + fread(&header, sizeof(Elf32_Ehdr), 1, elf_file) <= 0); FAILED_GOTO(failed_header, fseek(elf_file, header.e_shoff, SEEK_SET) != 0); - FAILED_GOTO(failed_header, fread(section_header, header.e_shentsize, header.e_shnum, elf_file) <= 0); + FAILED_GOTO(failed_header, fread(section_header, header.e_shentsize, + header.e_shnum, elf_file) <= 0); char *shstrtab = calloc(1, section_header[header.e_shstrndx].sh_size); - FAILED_GOTO(failed_shstrtab, fseek(elf_file, section_header[header.e_shstrndx].sh_offset, SEEK_SET) != 0); - FAILED_GOTO(failed_shstrtab, fread(shstrtab, section_header[header.e_shstrndx].sh_size, 1, elf_file) <= 0); + FAILED_GOTO(failed_shstrtab, + fseek(elf_file, section_header[header.e_shstrndx].sh_offset, + SEEK_SET) != 0); + FAILED_GOTO(failed_shstrtab, + fread(shstrtab, section_header[header.e_shstrndx].sh_size, 1, + elf_file) <= 0); Elf32_Shdr *symtab = NULL, *strtab = NULL; - for(int i = 0; i < header.e_shnum; i++) { + for (int i = 0; i < header.e_shnum; i++) { psh = section_header + i; if (psh->sh_type == SHT_SYMTAB) { symtab = psh; - } else if (psh->sh_type == SHT_STRTAB && strncmp(shstrtab + psh->sh_name, ".strtab", 8) == 0) { + } else if (psh->sh_type == SHT_STRTAB && + strncmp(shstrtab + psh->sh_name, ".strtab", 8) == 0) { strtab = psh; } } @@ -54,22 +63,28 @@ void init_elf(const char *path) { int sym_length = symtab->sh_size / sizeof(Elf32_Sym); Elf32_Sym *sym = calloc(sym_length, sizeof(Elf32_Sym)); assert(sym); - FAILED_GOTO(failed_funcname, fseek(elf_file, symtab->sh_offset, SEEK_SET) != 0); - FAILED_GOTO(failed_funcname, fread(sym, sizeof(Elf32_Sym), sym_length, elf_file) <= 0); - - for(int j = 0; j < sym_length; j++) { - if(ELF32_ST_TYPE(sym[j].st_info) != STT_FUNC) continue; + FAILED_GOTO(failed_funcname, + fseek(elf_file, symtab->sh_offset, SEEK_SET) != 0); + FAILED_GOTO(failed_funcname, + fread(sym, sizeof(Elf32_Sym), sym_length, elf_file) <= 0); + + for (int j = 0; j < sym_length; j++) { + if (ELF32_ST_TYPE(sym[j].st_info) != STT_FUNC) + continue; // Only read function type symbol func_t *f = &func_table[func_table_len]; char *func = (char *)malloc(30); - FAILED_GOTO(failed_funcname, fseek(elf_file, strtab->sh_offset + sym[j].st_name, SEEK_SET) != 0); + FAILED_GOTO(failed_funcname, + fseek(elf_file, strtab->sh_offset + sym[j].st_name, SEEK_SET) != + 0); FAILED_GOTO(failed_funcname, fgets(func, 30, elf_file) <= 0); f->start = sym[j].st_value; f->len = sym[j].st_size; f->name = func; ++func_table_len; - if(func_table_len >= func_table_size) { - Assert(func_table_size * 2 > func_table_size, "Function table exceed memory limit"); + if (func_table_len >= func_table_size) { + Assert(func_table_size * 2 > func_table_size, + "Function table exceed memory limit"); func_table_size *= 2; func_table = realloc(func_table, func_table_size * sizeof(func_t)); Assert(func_table, "Function table exceed memory limit"); @@ -88,10 +103,12 @@ failed_funcname: failed_shstrtab: free(shstrtab); failed_header: - for(int i = 0; i < func_table_len; i++) { + for (int i = 0; i < func_table_len; i++) { func_t *f = &func_table[i]; - if(f->name) { free(f->name); } - } + if (f->name) { + free(f->name); + } + } free(func_table); Error("Failed reading elf file"); return; @@ -114,11 +131,12 @@ void ftrace_return(vaddr_t pc, vaddr_t addr) { ftrace_stack_len--) { vaddr_t tco_addr = ftrace_stack[ftrace_stack_len]; func_t *f = get_func(tco_addr); - Trace("%*s0x%x ret 0x%x <%s+0x%x> (TCO)", ftrace_stack_len, "", pc, tco_addr, - f == NULL ? "???" : f->name, f == NULL ? addr : addr - f->start); + Trace("%*s0x%x ret 0x%x <%s+0x%x> (TCO)", ftrace_stack_len, "", pc, + tco_addr, f == NULL ? "???" : f->name, + f == NULL ? addr : addr - f->start); } func_t *f = get_func(addr); - Trace("%*s0x%x ret 0x%x <%s+0x%x>", ftrace_stack_len, "", pc, addr, + Trace("%*s0x%x ret 0x%x <%s+0x%x>", ftrace_stack_len, "", pc, addr, f == NULL ? "???" : f->name, f == NULL ? addr : addr - f->start); } #endif diff --git a/nemu/tests/Makefile b/nemu/tests/Makefile index 2e8c784..1575102 100644 --- a/nemu/tests/Makefile +++ b/nemu/tests/Makefile @@ -4,7 +4,7 @@ YACC = bison $(OBJ_DIR)/%: %.c $(TEST_OBJS) app @mkdir -p $(dir $@) @echo + CC $< - @$(CC) $(CFLAGS) -o $@.o -c $< + @$(CC) $(CFLAGS) -o $@.o -c $< @echo + LD $@ @$(LD) $(LIBS) $(LDFLAGS) -o $@ $(TEST_OBJS) $@.o @$@ diff --git a/nemu/tools/qemu-diff/include/isa.h b/nemu/tools/qemu-diff/include/isa.h index 3637206..9f1f9e6 100644 --- a/nemu/tools/qemu-diff/include/isa.h +++ b/nemu/tools/qemu-diff/include/isa.h @@ -18,14 +18,14 @@ #if defined(CONFIG_ISA_mips32) #define ISA_QEMU_BIN "qemu-system-mipsel" -#define ISA_QEMU_ARGS "-machine", "mipssim",\ - "-kernel", NEMU_HOME "/resource/mips-elf/mips.dummy", +#define ISA_QEMU_ARGS \ + "-machine", "mipssim", "-kernel", NEMU_HOME "/resource/mips-elf/mips.dummy", #elif defined(CONFIG_ISA_riscv) && !defined(CONFIG_RV64) #define ISA_QEMU_BIN "qemu-system-riscv32" #define ISA_QEMU_ARGS "-bios", "none", #elif defined(CONFIG_ISA_riscv) && defined(CONFIG_RV64) #define ISA_QEMU_BIN "qemu-system-riscv64" -#define ISA_QEMU_ARGS +#define ISA_QEMU_ARGS #elif defined(CONFIG_ISA_x86) #define ISA_QEMU_BIN "qemu-system-i386" #define ISA_QEMU_ARGS @@ -41,7 +41,7 @@ union isa_gdb_regs { #elif defined(CONFIG_ISA_riscv) && !defined(CONFIG_RV64) uint32_t gpr[32]; uint32_t pc; -#elif defined(CONFIG_ISA_riscv) && defined(CONFIG_RV64) +#elif defined(CONFIG_ISA_riscv) && defined(CONFIG_RV64) uint64_t gpr[32]; uint64_t fpr[32]; uint64_t pc; diff --git a/npc/.gdbinit b/npc/.gdbinit new file mode 100644 index 0000000..6549aeb --- /dev/null +++ b/npc/.gdbinit @@ -0,0 +1,3 @@ +set substitute-path /build/am-kernels /home/xin/repo/ysyx-workbench/am-kernels +file /nix/store/g8hi9rlby6xm7grzcpfc8lpmdfgv1i92-am-kernel-riscv32-none-elf-2024-07-10/libexec/am-kernels/add +target remote /tmp/gdbstub-npc.sock diff --git a/npc/core/src/main/scala/utils/DPI.scala b/npc/core/src/main/scala/utils/DPI.scala index 2c83be5..1a31361 100644 --- a/npc/core/src/main/scala/utils/DPI.scala +++ b/npc/core/src/main/scala/utils/DPI.scala @@ -5,7 +5,7 @@ import chisel3.util.HasBlackBoxResource // class DiffTester extends BlackBox with HasBlackBoxResource { // val io = IO(new Bundle { -// val regs = +// val regs = // }) // addResource("difftest.v"); // } diff --git a/npc/core/src/test/scala/Main.scala b/npc/core/src/test/scala/Main.scala index 0cab4ef..cbca1f4 100644 --- a/npc/core/src/test/scala/Main.scala +++ b/npc/core/src/test/scala/Main.scala @@ -13,7 +13,7 @@ class RV32CPUSpec extends AnyFreeSpec with ChiselScalatestTester { import chisel3.util.{SRAM, SRAMInterface, HexMemoryFile} class UserMem extends Module { val io = IO(new SRAMInterface(1024, UInt(32.W), 1, 1, 0)) - val memoryFile = HexMemoryFile("../resource/addi.txt") + val memoryFile = HexMemoryFile("../resource/addi.txt") io :<>= SRAM( size = 1024, tpe = UInt(32.W), @@ -22,7 +22,7 @@ class RV32CPUSpec extends AnyFreeSpec with ChiselScalatestTester { numReadwritePorts = 0, memoryFile = memoryFile ) - + val read = io.readPorts(0).data printf(cf"memoryFile=$memoryFile, readPort=$read%x\n") } diff --git a/npc/csrc/Switch/main.cpp b/npc/csrc/Switch/main.cpp index 9a3f262..0a5467c 100644 --- a/npc/csrc/Switch/main.cpp +++ b/npc/csrc/Switch/main.cpp @@ -1,36 +1,36 @@ -#include +#include #include #include #include #include -#include -const int MAX_SIM_TIME=100; +const int MAX_SIM_TIME = 100; int main(int argc, char **argv, char **env) { - int sim_time = 0; - Verilated::commandArgs(argc, argv); - VSwitch *top = new VSwitch; + int sim_time = 0; + Verilated::commandArgs(argc, argv); + VSwitch *top = new VSwitch; - Verilated::traceEverOn(true); - VerilatedVcdC *m_trace = new VerilatedVcdC; + Verilated::traceEverOn(true); + VerilatedVcdC *m_trace = new VerilatedVcdC; #ifdef VERILATOR_TRACE - top->trace(m_trace, 5); - m_trace->open("waveform.vcd"); + top->trace(m_trace, 5); + m_trace->open("waveform.vcd"); #endif - for (sim_time = 0; sim_time < MAX_SIM_TIME; sim_time++) { - top->io_sw_0 = rand() % 2; - top->io_sw_1 = rand() % 2; - top->eval(); - printf("sw0 = %d, sw1 = %d, ledr = %d\n", top->io_sw_0, top->io_sw_1, top->io_out); - assert(top->io_out == (top->io_sw_0 ^ top->io_sw_1)); + for (sim_time = 0; sim_time < MAX_SIM_TIME; sim_time++) { + top->io_sw_0 = rand() % 2; + top->io_sw_1 = rand() % 2; + top->eval(); + printf("sw0 = %d, sw1 = %d, ledr = %d\n", top->io_sw_0, top->io_sw_1, + top->io_out); + assert(top->io_out == (top->io_sw_0 ^ top->io_sw_1)); #ifdef VERILATOR_TRACE - m_trace->dump(sim_time); + m_trace->dump(sim_time); #endif - } + } #ifdef VERILATOR_TRACE - m_trace->close(); + m_trace->close(); #endif - delete top; - exit(EXIT_SUCCESS); + delete top; + exit(EXIT_SUCCESS); }