From 12e5fe2524cd6b0fdc95df1b558d153db64e3452 Mon Sep 17 00:00:00 2001 From: Teng Date: Wed, 8 May 2024 19:12:09 +0800 Subject: [PATCH 1/4] Lab4 finished --- lab3/kernel/build/kernel8.elf | Bin 97176 -> 96936 bytes lab3/kernel/src/exception.c | 7 +- lab3/kernel/src/shell.c | 10 +- lab3/kernel/src/timer.c | 4 +- lab3/kernel/src/uart1.c | 84 +++- lab4/bootloader/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32761 bytes lab4/bootloader/config.txt | 3 + lab4/bootloader/include/bcm2837/rpi_base.h | 6 + lab4/bootloader/include/bcm2837/rpi_gpio.h | 25 + lab4/bootloader/include/bcm2837/rpi_uart1.h | 19 + lab4/bootloader/include/power.h | 8 + lab4/bootloader/include/shell.h | 23 + lab4/bootloader/include/uart1.h | 11 + lab4/bootloader/include/utils.h | 11 + lab4/bootloader/makefile | 42 ++ lab4/bootloader/src/boot.S | 52 ++ lab4/bootloader/src/link.ld | 32 ++ lab4/bootloader/src/main.c | 48 ++ lab4/bootloader/src/shell.c | 113 +++++ lab4/bootloader/src/uart1.c | 83 ++++ lab4/bootloader/src/utils.c | 133 ++++++ lab4/create_fs/create_cpio.sh | 11 + lab4/create_fs/lab3_user_proc/linker.ld | 5 + lab4/create_fs/lab3_user_proc/makefile | 23 + lab4/create_fs/lab3_user_proc/user_proc.S | 12 + lab4/create_fs/rootfs/file0.txt | 2 + lab4/create_fs/rootfs/file1.txt | 2 + lab4/debug.gdb | 2 + lab4/kernel/bcm2710-rpi-3-b-plus.dtb | Bin 0 -> 32761 bytes lab4/kernel/build/boot_s.d | 1 + lab4/kernel/build/cpio_c.d | 1 + lab4/kernel/build/dtb_c.d | 2 + lab4/kernel/build/entry_s.d | 1 + lab4/kernel/build/exception_c.d | 3 + lab4/kernel/build/kernel8.elf | Bin 0 -> 144352 bytes lab4/kernel/build/main_c.d | 3 + lab4/kernel/build/mbox_c.d | 2 + lab4/kernel/build/memory_c.d | 2 + lab4/kernel/build/shell_c.d | 3 + lab4/kernel/build/timer_c.d | 2 + lab4/kernel/build/u_string_c.d | 1 + lab4/kernel/build/uart1_c.d | 4 + lab4/kernel/include/bcm2837/rpi_base.h | 6 + lab4/kernel/include/bcm2837/rpi_gpio.h | 25 + lab4/kernel/include/bcm2837/rpi_irq.h | 24 + lab4/kernel/include/bcm2837/rpi_mbox.h | 17 + lab4/kernel/include/bcm2837/rpi_uart1.h | 19 + lab4/kernel/include/cpio.h | 38 ++ lab4/kernel/include/dtb.h | 26 + lab4/kernel/include/exception.h | 38 ++ lab4/kernel/include/mbox.h | 63 +++ lab4/kernel/include/memory.h | 71 +++ lab4/kernel/include/power.h | 8 + lab4/kernel/include/shell.h | 36 ++ lab4/kernel/include/timer.h | 30 ++ lab4/kernel/include/u_list.h | 137 ++++++ lab4/kernel/include/u_string.h | 19 + lab4/kernel/include/uart1.h | 18 + lab4/kernel/initramfs.cpio | Bin 0 -> 1024 bytes lab4/kernel/makefile | 39 ++ lab4/kernel/src/boot.S | 43 ++ lab4/kernel/src/cpio.c | 63 +++ lab4/kernel/src/dtb.c | 154 ++++++ lab4/kernel/src/entry.S | 191 ++++++++ lab4/kernel/src/exception.c | 173 +++++++ lab4/kernel/src/link.ld | 36 ++ lab4/kernel/src/main.c | 38 ++ lab4/kernel/src/mbox.c | 23 + lab4/kernel/src/memory.c | 503 ++++++++++++++++++++ lab4/kernel/src/shell.c | 430 +++++++++++++++++ lab4/kernel/src/timer.c | 134 ++++++ lab4/kernel/src/u_string.c | 254 ++++++++++ lab4/kernel/src/uart1.c | 169 +++++++ lab4/toolbox/run_commands.sh | 11 + lab4/toolbox/send_image_to_bootloader.py | 70 +++ 75 files changed, 3666 insertions(+), 36 deletions(-) create mode 100644 lab4/bootloader/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab4/bootloader/config.txt create mode 100644 lab4/bootloader/include/bcm2837/rpi_base.h create mode 100644 lab4/bootloader/include/bcm2837/rpi_gpio.h create mode 100644 lab4/bootloader/include/bcm2837/rpi_uart1.h create mode 100644 lab4/bootloader/include/power.h create mode 100644 lab4/bootloader/include/shell.h create mode 100644 lab4/bootloader/include/uart1.h create mode 100644 lab4/bootloader/include/utils.h create mode 100644 lab4/bootloader/makefile create mode 100644 lab4/bootloader/src/boot.S create mode 100644 lab4/bootloader/src/link.ld create mode 100644 lab4/bootloader/src/main.c create mode 100644 lab4/bootloader/src/shell.c create mode 100644 lab4/bootloader/src/uart1.c create mode 100644 lab4/bootloader/src/utils.c create mode 100755 lab4/create_fs/create_cpio.sh create mode 100644 lab4/create_fs/lab3_user_proc/linker.ld create mode 100644 lab4/create_fs/lab3_user_proc/makefile create mode 100644 lab4/create_fs/lab3_user_proc/user_proc.S create mode 100644 lab4/create_fs/rootfs/file0.txt create mode 100644 lab4/create_fs/rootfs/file1.txt create mode 100644 lab4/debug.gdb create mode 100644 lab4/kernel/bcm2710-rpi-3-b-plus.dtb create mode 100644 lab4/kernel/build/boot_s.d create mode 100644 lab4/kernel/build/cpio_c.d create mode 100644 lab4/kernel/build/dtb_c.d create mode 100644 lab4/kernel/build/entry_s.d create mode 100644 lab4/kernel/build/exception_c.d create mode 100755 lab4/kernel/build/kernel8.elf create mode 100644 lab4/kernel/build/main_c.d create mode 100644 lab4/kernel/build/mbox_c.d create mode 100644 lab4/kernel/build/memory_c.d create mode 100644 lab4/kernel/build/shell_c.d create mode 100644 lab4/kernel/build/timer_c.d create mode 100644 lab4/kernel/build/u_string_c.d create mode 100644 lab4/kernel/build/uart1_c.d create mode 100644 lab4/kernel/include/bcm2837/rpi_base.h create mode 100644 lab4/kernel/include/bcm2837/rpi_gpio.h create mode 100644 lab4/kernel/include/bcm2837/rpi_irq.h create mode 100644 lab4/kernel/include/bcm2837/rpi_mbox.h create mode 100644 lab4/kernel/include/bcm2837/rpi_uart1.h create mode 100644 lab4/kernel/include/cpio.h create mode 100644 lab4/kernel/include/dtb.h create mode 100644 lab4/kernel/include/exception.h create mode 100644 lab4/kernel/include/mbox.h create mode 100644 lab4/kernel/include/memory.h create mode 100644 lab4/kernel/include/power.h create mode 100644 lab4/kernel/include/shell.h create mode 100644 lab4/kernel/include/timer.h create mode 100644 lab4/kernel/include/u_list.h create mode 100644 lab4/kernel/include/u_string.h create mode 100644 lab4/kernel/include/uart1.h create mode 100644 lab4/kernel/initramfs.cpio create mode 100644 lab4/kernel/makefile create mode 100644 lab4/kernel/src/boot.S create mode 100644 lab4/kernel/src/cpio.c create mode 100644 lab4/kernel/src/dtb.c create mode 100644 lab4/kernel/src/entry.S create mode 100644 lab4/kernel/src/exception.c create mode 100644 lab4/kernel/src/link.ld create mode 100644 lab4/kernel/src/main.c create mode 100644 lab4/kernel/src/mbox.c create mode 100644 lab4/kernel/src/memory.c create mode 100644 lab4/kernel/src/shell.c create mode 100644 lab4/kernel/src/timer.c create mode 100644 lab4/kernel/src/u_string.c create mode 100644 lab4/kernel/src/uart1.c create mode 100755 lab4/toolbox/run_commands.sh create mode 100755 lab4/toolbox/send_image_to_bootloader.py diff --git a/lab3/kernel/build/kernel8.elf b/lab3/kernel/build/kernel8.elf index 03d4b25470b55eba21c7be3feb677b913a546e3d..5e498fa1c83a0e8b767361276dc2cb041c016b8b 100755 GIT binary patch delta 7613 zcmai33v^V+d7l67N?M7v9_Y0adaMv{gkA^`23r@549Mab3GtMI#3KpD!bmZ7WT4S< zOjGQTR`(e4J3R(uAMD^q9hBfm3e;XAMD^(BOaf6PB~XGY6YU&b8!BBpDKarF^v+U$g(Mqz)<=ANy;iqLZhXVLT&vw5El z4mEll_SJTJl4weAj6wNCA)e@>*J&dE!9_o%6}<=D)J*gYe-T3~GWW-c1EDIjU${j| zs7mzvg*YyPCEOfKxt*OL6<`Tr_7g<hM7!4!no&G`7Z&kKCM>KzU;d zMBu!gOsJYyC(y*X-*W3J%&@CqxJ6w7%2W`XVU5Sg#BTG+%P#SvZFH_WybUh@5#Ksa z@lqxaCQt>v#WaTY8keg1Z^uxLH&h)igklrENxUI}e7PhV;t+>)aQMjpy9(d0Ts+oG zb3CCE89w|m*LkUscJg1LNxJZLgy%&f>||WRKk?FCoxca@m2;D6hNVd;Q^=Ye7s`dq zR&pK~<_pp8zZr4nZWJ#RFOc0wPF+X(a2YSYgIEbt=Xbq#bJrWkg0AMyi#K<@_QFk< zu-qV~Adwif(Fxc|C8?y2J7p!5F_eUaJ!Tk_`Nu6nG<*){NH9&}=g_x(C_M(%uk{$v zG|iEy5&a)SEXh>VPxdu=ITNcGbM~R)i@`@H_OHNYMFL+%8sv!BKaPCdkVq4a?h@XW zNaY#bB^Jq=CYk+M1wXK@!M%}4v)71H>oTGuf>Uoi8_-G(eNY_^pq58L|mICM@y?>SsEc;aw@U>iJ+29d;iVW+~4}rXSJ~elwX$-Jwz| z%;98uI6cz?%W(p;Erv*xS)qJ0yny$lP)?`cd8)+wBS*FYWqlsLzk#yaYSZCM6~703 zXq*|o1Wkk1v^bi{Q9fcx9H`ZNz~S?w_#eZ55%^_xkZwni8724{g8AA((BYG!_)Q2< zq4|)*$MFMWDaR+u?E!ur>kNsoJY~wi=0jjTro&$6fwAQC1n`6@`Ghaar=Y`KW=bWW zJ5+A9ac(O4&F-1jw=pR)R}q|PZPtA;%i5s(fmzmi-4D*T8g(DGYxu9>#V{-QNGcW3 zVIF|{G;@w+LX?R?gbK~DTp7>vXEJd29BUTGr%{eOILDg7Q`4v@^Fno4t(7ji;;fac ze~B>rGboJ%X%y4hQfZ~@pn*zj>~Mdsm8ARPPRpzN-FI5?y6>N7#p-@=p5@a0z~*M4OO^GxCPG!#b=^mD|KZ~ArBc2u!{T(5p~5c1 z1eD<-RC%%tSeCL3^VQ4^VCMXyyZ#=2E}bUR3jUXLrzWTPvvewQw+QPv=Vo9P2dl&6 z4%Fk#>i63xNOd^heXGAf1nLV!_jky13)=&Xytkh7lcV}+QGH)jKj&6oZYqKT^>^d# z~G+(S1}}4(y32-97wHCXMUt!PX^@l4r?2A-gCmD^mG@EcY+TnS9pb5frgr8f;Lgkz*i>W7bM!v07$I zeUh0r93UG8>b&8Sbjpw`j(t>+*YXuS+>dkNeq2hh*>z(x6LQsJ4H_=K=%ai$62zwI zqnSAi;8z~rA0dW1z`Mkm>hKioJUp01S;;}e!pb^t4{WeHoXhQ5Sf3%odY7#%YM9#M zvI@W>M3)FnvTk5YlUk$OWnoesd}y-uUxM>8Xxx;b%Su66W$L!emJ0hqfrZ?@Ct@GL zU837m(pK~yohd>@JIuE5C&I8ZGc?2u$JU)W& z@mu_rwjZS*kq0oD#}fDqc%C@ldvpRlP1&|w4Sz%`L!396Ch+$rQ9_*-rJ@!aVnvF6 zMjiT(U<))<{uGimNu4&FhjKh34`BJ+Gm*0Rm5CI~f1X5Hi5U0rTm&mQe=?OXQMDKz zGoD9}S=N3Z;@kNs{fJn=>{$7|eUoWrj1i3OO`1X16RhC!UsO^kjuQED6`iEt^E(Tv zH^#(^dED-D@b~gs+!1*fKJxK))VgjkOyF9cQ z!gvP`0RAoaEP?PP+4RN)f$X-s9IAnEnd~?7qWkDtuWuR6j)|G|aB+g*74`Ihar6~_ zt)4RID!*4xg`E{Wkw^;$E*2#ES0xIOgKjInyMebEHr{f`dw7iT4q!mcNtdX*EKD1(=;A$M#JBEM_{*?IHP55lO_F-opcMh(C(Ihx!Z=wE{d ze<|1jm#BdIf#2Y=2FmR8{vs0bN*bSJeEUGTqcB;RK`DouO0+WXL&jk;YHtnv8t}B< zNCdZ1$=d_JUkzN^dr{Cz@V;pKMYf>OEX#?dMrG1>R zlJW}D`XiAGj?RC`ec1JIRG_2KpXH@1DSy@=WNIS(Yt*nm0G;#8{~6|U;6C61KD3g? zm3N?fOl7h~nHIS)wF;=r zpO9_x>--{G&~H1cPo%18fD={&4e`{~cx*V$HFz}IPV-jT?mo>=Ncsf70GclG+i2=; zoW3>ta!P7cC1e#h$6z|&u-BShQN7f51D^nV^in$jd<|P`@Mkqvnul6te_ZYbzyZid zFS2XEpOTV%dYOA*m30cL=w&A79hXrt$d{$+9Mf7#O}_+{J;`9DVlNbzc9M=9_L4xYSN;T6E=1DBrVGOAXSR14e$ zuGfQHHu}Z%LD~ww3%p*RPa4LecOBa}u@B__x43v6a=OCH)={S6JO1n}|WyAN15&uFB=g4)4IT)0R1F zab&bLa{UG>E+0KYZU5&{8EgAMJ^u`LWur%wh`p1y-ZO6P|*QZ|;QO&x3CXF)B{Q>;_h9+o6&pAMrlI@>T3pU6EM@kS@}I|x`lbXzM! zRMw8P(%wQ1ymJ#3XO(7;niOsCQ=ss(pG_a*>yrLJ(G^ar;*6q` zxnMJBbDZN`(;q5&2iJk_d|J^{l(mzaNBGrZSFmt!L$r-ry|e7O@Q5i&KXPr5IF6rf zqd$7=zSTCKFwEWMl(N(=Wp>~HV&-4V3%`k_bbM4Ajvo?jlW!j`u&(#nZ_`(z{yctKZXNWCNsQ>RWjp%%P}ocMcksI z;g>)gKjCxy%vbmVg^Mu`ZtwlzRw#V1)W#Qz&B|aMh-3uT8-jwxCS`EW?>OpE#5RR{ zcG)DGyTS(xZir?1Ga0oARQMoC69EDZJs1k@_zczK`4CuI5;} zL;ICkBCaZOr26gB6YW!YAlK2?s)aNjc(Q#$@c9Rko9K8ADC>VxbSqz%$@q&Mdat72 zSM-ot+^>qF*U`@vKBz{0T4?YJ9?SDOD3`f|QpW0QR$rZy!-;r@{0+zieG_SI=b<}bTm5RH9YrGDoM~+ ztaFY0okthC|v5ja0o7;9iwkmLyctZN$1k__^-d(os5D&m6rgOo1O65UdhQEpbw3F^OlDBjDF1kB@*CURm)zQGA_rC#Iq2w$8 delta 7915 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 diff --git a/lab3/kernel/src/exception.c b/lab3/kernel/src/exception.c index c91cf021d..33f3b7c0e 100644 --- a/lab3/kernel/src/exception.c +++ b/lab3/kernel/src/exception.c @@ -24,13 +24,13 @@ void el1h_irq_router(){ if (*AUX_MU_IIR_REG & (1 << 1)) // FIFO clear bits { *AUX_MU_IER_REG &= ~(2); // disable write interrupt - irqtask_add(uart_w_irq_handler, UART_IRQ_PRIORITY); + irqtask_add(uart_w_irq_handler, UART_IRQ_PRIORITY); //rpi write mean we read irqtask_run_preemptive(); // run the queued task before returning to the program. } else if (*AUX_MU_IIR_REG & (2 << 1)) // Interrupt ID bits { *AUX_MU_IER_REG &= ~(1); // disable read interrupt - irqtask_add(uart_r_irq_handler, timer_priority); + irqtask_add(uart_r_irq_handler, UART_IRQ_PRIORITY); //rpi read mean we write irqtask_run_preemptive(); } } @@ -154,8 +154,7 @@ void irqtask_run_preemptive() // Run new task (early return) if its priority is lower than the scheduled task. if (curr_task_priority <= the_task->priority) { - exit = 1; - + //exit = 1; el1_interrupt_enable(); break; } diff --git a/lab3/kernel/src/shell.c b/lab3/kernel/src/shell.c index cc8a69974..e6d7c6193 100644 --- a/lab3/kernel/src/shell.c +++ b/lab3/kernel/src/shell.c @@ -33,12 +33,12 @@ void cli_cmd_read(char* buffer) while (1) { if (idx >= CMD_MAX_LEN) break; - c = uart_async_getc(); //test preemtive + c = uart_async_getc(); if (c == '\n') break; if (c == 127 && idx > 0) { - uart_puts("\b \b"); //test preemptive + uart_puts("\b \b"); idx--; continue; } @@ -301,7 +301,7 @@ void do_cmd_reboot() void do_test_preemptive() { add_timer(test_loop, 1, "test loop"); - add_timer(set_exit, 10, "exit"); + add_timer(set_exit, 5, "exit"); } volatile int exit = 0; @@ -314,6 +314,6 @@ void test_loop() void set_exit() { - //exit = 1; - uart_sendline("We set exit as 1 to exit infinite loop at t = 10s.\n"); + exit = 1; + uart_sendline("We set exit as 1 to exit infinite loop at t = 5s.\n"); } \ No newline at end of file diff --git a/lab3/kernel/src/timer.c b/lab3/kernel/src/timer.c index 3f24138af..58bdfc594 100644 --- a/lab3/kernel/src/timer.c +++ b/lab3/kernel/src/timer.c @@ -7,6 +7,7 @@ #define STR(x) #x #define XSTR(s) STR(s) + struct list_head* timer_event_list; // first head has nothing, store timer_event_t after it void timer_list_init(){ @@ -60,12 +61,13 @@ void timer_event_callback(timer_event_t * timer_event){ } core_timer_enable(); ((void (*)(char*))timer_event->callback)(timer_event->args); // call the event + } void timer_set2sAlert(char* str) { static int count = 0; - if(count > 10){ + if(count > 3){ return; } count++; diff --git a/lab3/kernel/src/uart1.c b/lab3/kernel/src/uart1.c index 557043054..d56dddabd 100644 --- a/lab3/kernel/src/uart1.c +++ b/lab3/kernel/src/uart1.c @@ -90,32 +90,53 @@ int uart_sendline(char* fmt, ...) { } -// uart_async_getc read from buffer -// uart_r_irq_handler write to buffer then output +// Read a character asynchronously from UART receive buffer. char uart_async_getc() { - *AUX_MU_IER_REG |=1; // enable read interrupt - // do while if buffer empty - while (uart_rx_buffer_ridx == uart_rx_buffer_widx) *AUX_MU_IER_REG |=1; // enable read interrupt + // Enable read interrupt + *AUX_MU_IER_REG |= 1; + + // Loop until the buffer has data + while (uart_rx_buffer_ridx == uart_rx_buffer_widx) { + *AUX_MU_IER_REG |= 1; // Keep enabling read interrupt + } + + // Disable interrupts to ensure atomic operations el1_interrupt_disable(); + + // Read character from the buffer and increment read index char r = uart_rx_buffer[uart_rx_buffer_ridx++]; + // Wrap around the index if it exceeds the buffer size if (uart_rx_buffer_ridx >= VSPRINT_MAX_BUF_SIZE) uart_rx_buffer_ridx = 0; + + // Re-enable interrupts el1_interrupt_enable(); - return r; + + return r; // Return the read character } - -// uart_async_putc writes to buffer -// uart_w_irq_handler read from buffer then output +// Write a character asynchronously to UART transmit buffer. void uart_async_putc(char c) { - // if buffer full, wait for uart_w_irq_handler - while( (uart_tx_buffer_widx + 1) % VSPRINT_MAX_BUF_SIZE == uart_tx_buffer_ridx ) *AUX_MU_IER_REG |=2; // enable write interrupt + // Wait if the buffer is full + while((uart_tx_buffer_widx + 1) % VSPRINT_MAX_BUF_SIZE == uart_tx_buffer_ridx) { + *AUX_MU_IER_REG |= 2; // Enable write interrupt + } + + // Disable interrupts to ensure atomic operations el1_interrupt_disable(); + + // Write character to the buffer and increment write index uart_tx_buffer[uart_tx_buffer_widx++] = c; - if(uart_tx_buffer_widx >= VSPRINT_MAX_BUF_SIZE) uart_tx_buffer_widx=0; // cycle pointer + // Wrap around the index if it exceeds the buffer size + if(uart_tx_buffer_widx >= VSPRINT_MAX_BUF_SIZE) uart_tx_buffer_widx = 0; + + // Re-enable interrupts el1_interrupt_enable(); - *AUX_MU_IER_REG |=2; // enable write interrupt + + // Enable write interrupt + *AUX_MU_IER_REG |= 2; } + int uart_puts(char* fmt, ...) { __builtin_va_list args; __builtin_va_start(args, fmt); @@ -147,25 +168,36 @@ void uart_interrupt_disable(){ } -void uart_r_irq_handler(){ - if((uart_rx_buffer_widx + 1) % VSPRINT_MAX_BUF_SIZE == uart_rx_buffer_ridx) - { - *AUX_MU_IER_REG &= ~(1); // disable read interrupt +// UART receive interrupt handler +void uart_r_irq_handler() { + // Check if the buffer is full + if((uart_rx_buffer_widx + 1) % VSPRINT_MAX_BUF_SIZE == uart_rx_buffer_ridx) { + // Disable read interrupt to prevent overflow + *AUX_MU_IER_REG &= ~(1); return; } + // Read data from UART and store it in the buffer uart_rx_buffer[uart_rx_buffer_widx++] = uart_recv(); - if(uart_rx_buffer_widx>=VSPRINT_MAX_BUF_SIZE) uart_rx_buffer_widx=0; - *AUX_MU_IER_REG |=1; + // Wrap the write index if it reaches the buffer size + if(uart_rx_buffer_widx >= VSPRINT_MAX_BUF_SIZE) uart_rx_buffer_widx = 0; + // Re-enable read interrupt + *AUX_MU_IER_REG |= 1; } -void uart_w_irq_handler(){ - if(uart_tx_buffer_ridx == uart_tx_buffer_widx) - { - *AUX_MU_IER_REG &= ~(2); // disable write interrupt - return; // buffer empty +// UART write interrupt handler +void uart_w_irq_handler() { + // Check if the buffer is empty + if(uart_tx_buffer_ridx == uart_tx_buffer_widx) { + // Disable write interrupt to avoid unnecessary interrupts + *AUX_MU_IER_REG &= ~(2); + return; // Exit if nothing to send } + // Send data from the buffer via UART uart_send(uart_tx_buffer[uart_tx_buffer_ridx++]); - if(uart_tx_buffer_ridx>=VSPRINT_MAX_BUF_SIZE) uart_tx_buffer_ridx=0; - *AUX_MU_IER_REG |=2; // enable write interrupt + // Wrap the read index if it reaches the buffer size + if(uart_tx_buffer_ridx >= VSPRINT_MAX_BUF_SIZE) uart_tx_buffer_ridx = 0; + // Re-enable write interrupt + *AUX_MU_IER_REG |= 2; } + diff --git a/lab4/bootloader/bcm2710-rpi-3-b-plus.dtb b/lab4/bootloader/bcm2710-rpi-3-b-plus.dtb new file mode 100644 index 0000000000000000000000000000000000000000..38395a23fc90767680815c7f43bbfb3a290c2af0 GIT binary patch literal 32761 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�D&OoC_~4g9tivONVZxf$G+%wkS(-3$L@6`g_7TDCjX zZ0wGe1kn#$y$N03GHt`At5nL~a;sv6?tVfLDtBzZfvLbSPPlEX)KP=ol3y$FuZ?K# zXq{r6RCi!U&_G1m5U=65R9h>Z>G;rAvqX;HRd$z~6%TKR)pAgjR>?KEc2EoOFI}HT z(Zk+nZg2C&R%k#PL<|DCfDac}0}-x51h)~K?qcnF74kM)Fxcu&T_b z;N~L)VOxvMMmg|KwHr9ZRqhdz%wl+uLlI??rK2!lgi~v-g%I6`f&Mc>*Fc1>5Jg9` z^17#s*d9?dyRD%lOrK+iLQh^iVS_5lE(U?YdK6{9i&rZx;GjZX*QY@bZ2zJ#%`RG- zkJK}Q(H=>QUv1*wgAN>)c8|B*&27)R8E*hT~6VH+RLhvRq~;)h{3J~sayp*djcq?x^z z*=bP$8ODfDCznO<1T0!-efE&~Xu4M?b4?Ws7QJ>Z)|qMrada*+YQ<9qvbpLa3nJ%q zqJM5wVdWq~YHPXb@qjovoJ|L>VpsV3h4W*g84}b?cxp=Ca`=_C$B&co(w^hZu*X+ysto}0S)*bX?FdxfaP>9TytA4wwD77_a_A9Hp#OVEWA!Fl_#JplwLCf-}ERJi*| MwhYsc7a#HeA5G>kdjJ3c literal 0 HcmV?d00001 diff --git a/lab4/bootloader/config.txt b/lab4/bootloader/config.txt new file mode 100644 index 000000000..15654a481 --- /dev/null +++ b/lab4/bootloader/config.txt @@ -0,0 +1,3 @@ +kernel=bootloader.img +arm_64bit=1 +initramfs initramfs.cpio 0x8000000 diff --git a/lab4/bootloader/include/bcm2837/rpi_base.h b/lab4/bootloader/include/bcm2837/rpi_base.h new file mode 100644 index 000000000..e3259e8de --- /dev/null +++ b/lab4/bootloader/include/bcm2837/rpi_base.h @@ -0,0 +1,6 @@ +#ifndef _RPI_BASE_H_ +#define _RPI_BASE_H_ + +#define PERIPHERAL_BASE 0x3F000000 + +#endif /*_RPI_BASE_H_ */ diff --git a/lab4/bootloader/include/bcm2837/rpi_gpio.h b/lab4/bootloader/include/bcm2837/rpi_gpio.h new file mode 100644 index 000000000..e5133708a --- /dev/null +++ b/lab4/bootloader/include/bcm2837/rpi_gpio.h @@ -0,0 +1,25 @@ +#ifndef _RPI_GPIO_H_ +#define _RPI_GPIO_H_ + +#include "bcm2837/rpi_base.h" + +#define GPFSEL0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(PERIPHERAL_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(PERIPHERAL_BASE+0x0020009C)) + +#endif /*_RPI_GPIO_H_*/ diff --git a/lab4/bootloader/include/bcm2837/rpi_uart1.h b/lab4/bootloader/include/bcm2837/rpi_uart1.h new file mode 100644 index 000000000..959130656 --- /dev/null +++ b/lab4/bootloader/include/bcm2837/rpi_uart1.h @@ -0,0 +1,19 @@ +#ifndef _RPI_UART1_H_ +#define _RPI_UART1_H_ + +#include "bcm2837/rpi_base.h" + +#define AUX_ENABLES ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215004)) +#define AUX_MU_IO_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215040)) +#define AUX_MU_IER_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215044)) +#define AUX_MU_IIR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215048)) +#define AUX_MU_LCR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x0021504C)) +#define AUX_MU_MCR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215050)) +#define AUX_MU_LSR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215054)) +#define AUX_MU_MSR_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215058)) +#define AUX_MU_SCRATCH ((volatile unsigned int*)(PERIPHERAL_BASE+0x0021505C)) +#define AUX_MU_CNTL_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215060)) +#define AUX_MU_STAT_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215064)) +#define AUX_MU_BAUD_REG ((volatile unsigned int*)(PERIPHERAL_BASE+0x00215068)) + +#endif /*_RPI_UART1_H_ */ diff --git a/lab4/bootloader/include/power.h b/lab4/bootloader/include/power.h new file mode 100644 index 000000000..baf990974 --- /dev/null +++ b/lab4/bootloader/include/power.h @@ -0,0 +1,8 @@ +#ifndef _POWER_H_ +#define _POWER_H_ + +#define PM_PASSWORD 0x5a000000 +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + +#endif /*_POWER_H_*/ diff --git a/lab4/bootloader/include/shell.h b/lab4/bootloader/include/shell.h new file mode 100644 index 000000000..702f5eb14 --- /dev/null +++ b/lab4/bootloader/include/shell.h @@ -0,0 +1,23 @@ +#ifndef _SHELL_H_ +#define _SHELL_H_ + +#define CLI_MAX_CMD 3 +#define CMD_MAX_LEN 32 +#define MSG_MAX_LEN 128 + +typedef struct CLI_CMDS +{ + char command[CMD_MAX_LEN]; + char help[MSG_MAX_LEN]; +} CLI_CMDS; + +void cli_cmd_clear(char*, int); +void cli_cmd_read(char*); +void cli_cmd_exec(char*); +void cli_print_banner(); + +void do_cmd_help(); +void do_cmd_loadimg(); +void do_cmd_reboot(); + +#endif /* _SHELL_H_ */ diff --git a/lab4/bootloader/include/uart1.h b/lab4/bootloader/include/uart1.h new file mode 100644 index 000000000..329d25c81 --- /dev/null +++ b/lab4/bootloader/include/uart1.h @@ -0,0 +1,11 @@ +#ifndef _UART1_H_ +#define _UART1_H_ + +void uart_init(); +char uart_getc(); +char uart_recv(); +void uart_send(unsigned int c); +int uart_puts(char* fmt, ...); +void uart_2hex(unsigned int d); + +#endif /*_UART1_H_*/ diff --git a/lab4/bootloader/include/utils.h b/lab4/bootloader/include/utils.h new file mode 100644 index 000000000..e65ece675 --- /dev/null +++ b/lab4/bootloader/include/utils.h @@ -0,0 +1,11 @@ +#ifndef _UTILS_H_ +#define _UTILS_H_ + +#define VSPRINT_MAX_BUF_SIZE 128 + +unsigned int sprintf(char *dst, char* fmt, ...); +unsigned int vsprintf(char *dst,char* fmt, __builtin_va_list args); + +int strcmp(const char*, const char*); + +#endif /* _UTILS_H_ */ diff --git a/lab4/bootloader/makefile b/lab4/bootloader/makefile new file mode 100644 index 000000000..b81bad692 --- /dev/null +++ b/lab4/bootloader/makefile @@ -0,0 +1,42 @@ +ARMGNU ?= aarch64-linux-gnu + +CFLAGS = -Wall -nostdlib -nostartfiles -ffreestanding -Iinclude -mgeneral-regs-only +ASMFLAGS = -Iinclude + +BUILD_DIR = build +SRC_DIR = src +#--------------------------------------------------------------------------------------- + +C_FILES = $(wildcard $(SRC_DIR)/*.c) +ASM_FILES = $(wildcard $(SRC_DIR)/*.S) +OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o) +OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o) + +DEP_FILES = $(OBJ_FILES:%.o=%.d) +-include $(DEP_FILES) + +$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c + @mkdir -p $(@D) + $(ARMGNU)-gcc $(CFLAGS) -MMD -c $< -o $@ + +$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S + $(ARMGNU)-gcc $(ASMFLAGS) -MMD -c $< -o $@ + +bootloader.img: $(SRC_DIR)/link.ld $(OBJ_FILES) + $(ARMGNU)-ld -T $(SRC_DIR)/link.ld -o $(BUILD_DIR)/bootloader.elf $(OBJ_FILES) + $(ARMGNU)-objcopy $(BUILD_DIR)/bootloader.elf -O binary bootloader.img + +all: bootloader.img + +clean: + rm -rf $(BUILD_DIR) *.img + +run_std: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -serial null -serial stdio -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +run_pty: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -serial null -serial pty -initrd initramfs.cpio -dtb bcm2710-rpi-3-b-plus.dtb + +debug: + qemu-system-aarch64 -M raspi3b -kernel bootloader.img -display none -S -s + diff --git a/lab4/bootloader/src/boot.S b/lab4/bootloader/src/boot.S new file mode 100644 index 000000000..c872f56a7 --- /dev/null +++ b/lab4/bootloader/src/boot.S @@ -0,0 +1,52 @@ +/* ARMv8 Assembly Instruction */ +/** + +mov x0, x1 + sets: x0 = x1 +ldr x0, + load 32bits from to x0 +ldr w0, + load 64bits from to w0 +cbz x0,