From 815750664b50787f47eac2aed0d5f7ea2c6cd92d Mon Sep 17 00:00:00 2001 From: linlianen Date: Mon, 6 Mar 2023 18:50:12 +0800 Subject: [PATCH] Lab0/1 --- Lab1/Makefile | 25 +++++++++++ Lab1/READ.md | 22 +++++++++ Lab1/command.c | 62 +++++++++++++++++++++++++ Lab1/command.h | 12 +++++ Lab1/command.o | Bin 0 -> 3840 bytes Lab1/gpio.h | 50 +++++++++++++++++++++ Lab1/kernel8.elf | Bin 0 -> 70384 bytes Lab1/kernel8.img | Bin 0 -> 2843 bytes Lab1/link.ld | 19 ++++++++ Lab1/main.c | 16 +++++++ Lab1/main.o | Bin 0 -> 1848 bytes Lab1/math.c | 11 +++++ Lab1/math.h | 7 +++ Lab1/math.o | Bin 0 -> 1288 bytes Lab1/shell.c | 112 +++++++++++++++++++++++++++++++++++++++++++++ Lab1/shell.h | 24 ++++++++++ Lab1/shell.o | Bin 0 -> 3504 bytes Lab1/start.S | 30 +++++++++++++ Lab1/start.o | Bin 0 -> 1208 bytes Lab1/string.c | 95 +++++++++++++++++++++++++++++++++++++++ Lab1/string.h | 13 ++++++ Lab1/string.o | Bin 0 -> 2752 bytes Lab1/uart.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ Lab1/uart.h | 65 +++++++++++++++++++++++++++ Lab1/uart.o | Bin 0 -> 1960 bytes 25 files changed, 678 insertions(+) create mode 100755 Lab1/Makefile create mode 100644 Lab1/READ.md create mode 100644 Lab1/command.c create mode 100644 Lab1/command.h create mode 100644 Lab1/command.o create mode 100755 Lab1/gpio.h create mode 100755 Lab1/kernel8.elf create mode 100755 Lab1/kernel8.img create mode 100755 Lab1/link.ld create mode 100755 Lab1/main.c create mode 100644 Lab1/main.o create mode 100644 Lab1/math.c create mode 100644 Lab1/math.h create mode 100644 Lab1/math.o create mode 100755 Lab1/shell.c create mode 100755 Lab1/shell.h create mode 100644 Lab1/shell.o create mode 100755 Lab1/start.S create mode 100644 Lab1/start.o create mode 100644 Lab1/string.c create mode 100644 Lab1/string.h create mode 100644 Lab1/string.o create mode 100755 Lab1/uart.c create mode 100755 Lab1/uart.h create mode 100644 Lab1/uart.o diff --git a/Lab1/Makefile b/Lab1/Makefile new file mode 100755 index 000000000..0174802a0 --- /dev/null +++ b/Lab1/Makefile @@ -0,0 +1,25 @@ +SRCS = $(wildcard *.c) +OBJS = $(SRCS:.c=.o) +CCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfiles +CC = aarch64-linux-gnu-gcc +LINKER = aarch64-linux-gnu-ld +OBJ_CPY = aarch64-linux-gnu-objcopy + +all: clean kernel8.img + +start.o: start.S + $(CC) $(CCFLAGS) -c start.S -o start.o + +%.o: %.c + $(CC) $(CCFLAGS) -c $< -o $@ + +kernel8.img: start.o $(OBJS) + $(LINKER) start.o $(OBJS) -T link.ld -o kernel8.elf + $(OBJ_CPY) -O binary kernel8.elf kernel8.img + +clean: + rm kernel8.elf kernel8.img *.o >/dev/null 2>/dev/null || true + +run: + qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial null -serial stdio + diff --git a/Lab1/READ.md b/Lab1/READ.md new file mode 100644 index 000000000..724016432 --- /dev/null +++ b/Lab1/READ.md @@ -0,0 +1,22 @@ +# OSC2023 + +| Github Account | Student ID | Name | +|----------------|------------|---------------| +| linlianen | 311553047 | Lin Lian En | + +## Requirements + +* a cross-compiler for aarch64 +* (optional) qemu-system-arm + +## Build + +``` +make kernel.img +``` + +## Test With QEMU + +``` +qemu-system-aarch64 -M raspi3b -kernel kernel.img -initrd initramfs.cpio -serial null -serial stdio -dtb bcm2710-rpi-3-b-plus.dtb +``` diff --git a/Lab1/command.c b/Lab1/command.c new file mode 100644 index 000000000..d559135ee --- /dev/null +++ b/Lab1/command.c @@ -0,0 +1,62 @@ +#include "uart.h" +#include "string.h" + +void input_buffer_overflow_message ( char cmd[] ) +{ + uart_puts("Follow command: \""); + uart_puts(cmd); + uart_puts("\"... is too long to process.\n"); + + uart_puts("The maximum length of input is 64."); +} + +void command_help () +{ + uart_puts("\n"); + uart_puts("Valid Command:\n"); + uart_puts("\thelp:\t\tprint this help.\n"); + uart_puts("\thello:\t\tprint \"Hello World!\".\n"); + uart_puts("\ttimestamp:\tget current timestamp.\n"); + uart_puts("\n"); +} + +void command_hello () +{ + uart_puts("Hello World!\n"); +} + +void command_timestamp () +{ + unsigned long int cnt_freq, cnt_tpct; + char str[20]; + + asm volatile( + "mrs %0, cntfrq_el0 \n\t" + "mrs %1, cntpct_el0 \n\t" + : "=r" (cnt_freq), "=r" (cnt_tpct) + : + ); + + ftoa( ((float)cnt_tpct) / cnt_freq, str, 6); + + uart_send('['); + uart_puts(str); + uart_puts("]\n"); +} + +void command_not_found (char * s) +{ + uart_puts("Err: command "); + uart_puts(s); + uart_puts(" not found, try \n"); +} + +void command_reboot () +{ + uart_puts("Start Rebooting...\n"); + + *PM_WDOG = PM_PASSWORD | 0x20; + *PM_RSTC = PM_PASSWORD | 100; + + while(1); +} diff --git a/Lab1/command.h b/Lab1/command.h new file mode 100644 index 000000000..50bf38467 --- /dev/null +++ b/Lab1/command.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_H +#define COMMAND_H + +void input_buffer_overflow_message ( char [] ); + +void command_help (); +void command_hello (); +void command_timestamp (); +void command_not_found ( char * ); +void command_reboot (); + +#endif diff --git a/Lab1/command.o b/Lab1/command.o new file mode 100644 index 0000000000000000000000000000000000000000..72a73c258c17c2fab080bf669e7d44bed7755ca1 GIT binary patch literal 3840 zcmbVOU1%It6h6DNZS&USmLj%`V;D3A3}h zHKJP(^udRO6zPKr0R_|g(l;#>jpBokrBa_%g81lz8XwY!py$kZXe0t65%>}so}d6*?G4-VO$!b~2kb3=8r8dz-#-5vutj6lMAZ7i?FYDZrK6gNppAQQ3uAkxoP6GS zOU*llLaLY^QyAk*ziFB(S5ltisJv5LKtnCM&b(bJnQa&`owZdVRml~~1(mmp3tm<^ z8I>z8mOV;)dc>^pP%O#IseCT2CU}@OXwBOB#j)1bMK@RUl$XUELVRwDr~bTC59mKf zu6o6B^XcRL7}e_K3U7bqlUXaoRnhTO#wi!m zCzR)2R;Q?%=i18L3`&trRr^mwPW*0O%+^y2Dju`y)Z&4}S=eBY|=K{YC6aZ1OGylb+#tiSzdwu_?wkP?O01PNPlyH+>Yq-($2h z*uwZPHNne>6HgcKsQ(@y_5tJP8Mn~)g>MLR9tP4dPyzp_C+EtUjO`|!H*GhA_ec`Y zWGS^^Lm5v^67PZ%a9)zmQ_#sfb+3MAA>%ozT5icMrt1NCHk1C@tRt>}Ah9rcQ@XL< z;9DU3_^^ie@^tzTKg>2M#kP(QFfRO(KghW73x1*r&xpn&>n&$ocm%gN{t>Ot^BT`A z`}AIr2+yqV@!f&8J}>E)d1X01&02T_7p?Q;IbL`w>@R9Of_seXJkl>b*EsGSjYsfm z6Q1`O7oM-!|B$uJOYo1H@O;9!zWy7G3;#CzpRpEx!8aM#d46V`)`9K}k>A-M{D^?4 z{|Mm0_x4Z5r5^GBVO;7Fe76Zt4~|D7JQ6p+xbO%*$hf|bLrw5ejlYF`i?#3zKFPSg zZqpi%Vt+>C5qy?$z0OB#(}e@rA7z`A#kSy+?58z+gZ+wz-(+9jAK{UEc1w$wdlt;n z<${-*L+!aWofXTq^C{D_D;}8Xl$Qc?u2cfkb;zOcxH$?Y-Lv=s1SVdVwt4oYizo5x zX#Nt$QMR2;X53W4=FuNqDNLm$)&Kb{#7LHTy=&h7|D-xr0ISp&IiqpV=fIfj4dcK{)kqG)Gx4wNn{TNlhKZG zK~!H*Bv177*eP}}Zb+XHcj~ckaDMQer%=hi!+D~le(_&LBW(YE;P2{X4kVXyC13WB y>e0vcQ+VHZxnTOP>j=qjMJ#NpyZq<>u}{``=<}z$HY|Up_8|$`MyhY=`TqgPVV0f% literal 0 HcmV?d00001 diff --git a/Lab1/gpio.h b/Lab1/gpio.h new file mode 100755 index 000000000..b89cd98db --- /dev/null +++ b/Lab1/gpio.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2018 bzt (bztsrc@github) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef GPIO_H +#define GPIO_H + +#define MMIO_BASE 0x3F000000 + +#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000)) +#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004)) +#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008)) +#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C)) +#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010)) +#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014)) +#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C)) +#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020)) +#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028)) +#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034)) +#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038)) +#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040)) +#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044)) +#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064)) +#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068)) +#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094)) +#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098)) +#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C)) + +#endif diff --git a/Lab1/kernel8.elf b/Lab1/kernel8.elf new file mode 100755 index 0000000000000000000000000000000000000000..ae3d4f47ef754365d30e4cf3680b2903742d8295 GIT binary patch literal 70384 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 Pwb<7*KU-#8&$a&_%k!Mt literal 0 HcmV?d00001 diff --git a/Lab1/kernel8.img b/Lab1/kernel8.img new file mode 100755 index 0000000000000000000000000000000000000000..1baf8be48654c40e71699d5fca227f2772c4c4d7 GIT binary patch literal 2843 zcmZ`*ZERcR6+ZXAw~3PgrD=eUPVs9uA*oZP+T?)K0dZ0dA%#xE_1Ls(i=D69#Ib9~ z8QT)nn>1x82B~*cDhP?Bl#V9j-!@H=HhM#$nh<|xt=peza{2+CDl|k=w1~Qw=iKX? z1vIX7^Pc;jbDr~@kN0&>Q|OXU3;#M!^!q+3E?Jg!UtFOdbrBi7UMAWxO%&{!q5t-1 z^yKT7)iFYJ@+R!aemwSHS?8?fiMJONq7!97#%dj{uL@d})M9k0bh0G2FFt}54kswq zV(f#wS{GjD@AAYu=cv?Tbg0z87_R?z=*IlJ4fbt!ef3tO&6Ukoqt%teyNza7Hg_9- z$n3{47{3wNPV9iO6S5cimM8wS5sOOSx#Z)QcD+V;mr0MTo*_H7+#wskr_jk*ogTS? zm2qp`Sn~m+8nP4T-E*es`#WPh`2VLKX2AHog0YVEOEsW2V@+|mIsWGt9L{Y9*W_c^ zPicBl7kW{-{N|^GSJm{08vbq0PqZ|3haOQNqX$dyLoLtS`Ax&m&HbN{(Nlcuk@Cc{ z%@;cRxhyCkv5)>|UnGjsq`K3mQFhs~qMVoVO{(|OH*(zyMZ0b(Sray0t(0xrap0Gw z`{wSa`K{a7jubs&ucX&+u7_8nZ^ddTTAui`Q}=_)!m3ag*MwN~O3KE7dviOjcW|6H zwq~WEsCRyAHde*^;q}#n-3#T33pVE%g_peGISOus*~EMrG32d~UOf7~3~~L!iFhdX zv@e7lj5$@g@jPtpnW*5rf?AivJ%OL0Cc4UaYSz>!%KkjZZ0j@IjHgg9Q&4bYuheEd z>FjlkSk|dIm6q66y&LsM{f41qt|;mW=1s9Z2J?Ql67R=uJk;=sbt^iKcpTrh)o7az zy!UX%xONW%|2kyGZ-smf@&*suW9&sNkEA(JOPhNK|l7G-&LUoxUXjt z{h>3sd;E#v&>U5be2lrfh<%IHkrl|**k_E#Z(AMmFUe4esF!P3BGq0Qi{C!X%bl39 z{g@XO{yuQ*AyH5oD1_eMaOd2$S18=6C=?VL{nZCfC7}d(mijSQd>2+`+@5vz!TDL- zg8n~-TrOf>*oXJ8R{ZwEkMlUM&5XRSQuOQeGqk0bb(+~!_|+$Up|AS0{w(H%_0N6c z4Sgu81Jy*G&)sr3x%^Sz05~t61(#Oju=2qRkrv=CfACh0ZO%;kUS;2bTm3H$OdjtY z^oY7QG_CiV5P@SRZ4=3s&_~GkJ=9e(A1L&p_FTUUli`x*bo2oSx`WT@%|ks4*LQ}?TfiwFhk^TjHy)cbjn8QX>An9ahK-gGp62KXa)}F!u5_LpQ~a^z=wQ% zlgE1f9;L2dQ+ux<$8O{kf4Vt@z8V+odN&p3RL!pU6zZ*_-fAUZ++~$|2km-)HHV*~ z?%=qnp$Gq|oHd+bnxffa^&PWC-_QKCewQ zpEK+Ah;Q(&dLL&`6ha{Kp2*{&B=dO4!NkL~&Qjcr`L3Oykgj>kOWh{;?y zuKSxaja-;N`*G}LYwv>!a_0OwKfcGpxIft5_kA+hj%#7Uj$n5h{bpnM2X;KjaIFbi%z zZVty`vyQ$#mPw^D&&Ywy=x97WxKE-+_Tz7FZ+Elk^2Y#?LSS literal 0 HcmV?d00001 diff --git a/Lab1/link.ld b/Lab1/link.ld new file mode 100755 index 000000000..066df7b90 --- /dev/null +++ b/Lab1/link.ld @@ -0,0 +1,19 @@ +SECTIONS +{ + . = 0x80000; + .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } + PROVIDE(_data = .); + .data : { *(.data .data.* .gnu.linkonce.d*) } + .bss (NOLOAD) : { + . = ALIGN(16); + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + __bss_end = .; + } + _end = .; + + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } +} +__bss_size = (__bss_end - __bss_start)>>3; diff --git a/Lab1/main.c b/Lab1/main.c new file mode 100755 index 000000000..155b817a5 --- /dev/null +++ b/Lab1/main.c @@ -0,0 +1,16 @@ +#include "uart.h" +#include "shell.h" + +int main() +{ + // set up serial console + uart_init(); + + // say hello + uart_puts("Hello World!\n"); + + // start shell + shell_start(); + + return 0; +} diff --git a/Lab1/main.o b/Lab1/main.o new file mode 100644 index 0000000000000000000000000000000000000000..1322ca810daf827334af7ab6873486826daed3cf GIT binary patch literal 1848 zcmbu9PiqrV5Wr`%t+m?5Y88a|CxwC$+DDRlD0*2b+8(4xq4XFw$!da0wq)PRYC-)7 z3Ld=Z$wR$))0_GwyeWPKKS0o#-8XdlvbpHM+c)#unfGSio89Mk?%gdo4zM`z363nL z0H56>-Ah#uiZBmbL9Z8<_rhVXy>trs=-|tTkqfU-eU0NK4%X3ru`@dOcKFq8e22}A zjhp4lZZjU}xLm8LHC0`$#i?0)Rso z|7 zh5ddoz^Fl}1GTxmyNa(`kBo27X*?ME{UA%_zn&$G#!}#fwTfriY?7~(B{YcHo$pB} zq1*A)7j&2Z8oz?Ev}PTL6wes4Hwbaxa317Gx?TT$WF*}0nRUDuh~2_LU$KWn%185y zNDQR!m->-()lYvNj%QB!*n1;_U-UqEV-lwCdLD-zPixw}g9s9{=o%S9?E25*yS#YM Lz{et%R6G7JafEM% literal 0 HcmV?d00001 diff --git a/Lab1/math.c b/Lab1/math.c new file mode 100644 index 000000000..eb4c193b1 --- /dev/null +++ b/Lab1/math.c @@ -0,0 +1,11 @@ + + +int pow(int base, int exponent) +{ + int result = 1; + for ( ; exponent > 0; exponent--) + { + result = result * base; + } + return result; +} diff --git a/Lab1/math.h b/Lab1/math.h new file mode 100644 index 000000000..67b900028 --- /dev/null +++ b/Lab1/math.h @@ -0,0 +1,7 @@ + +#ifndef MATH_H +#define MATH_H + +int pow(int base, int exponent); + +#endif diff --git a/Lab1/math.o b/Lab1/math.o new file mode 100644 index 0000000000000000000000000000000000000000..5176c141f8f3f64b77486051f15e2d7a17a863ef GIT binary patch literal 1288 zcmbtTUrPc(5TEl@%pxj!2#h)*=nu81)k`l4Vn##{qR)2Pg;1yEtz;3^2Po*<)T4cg z=($f&pTK6$UEQ|pr3Q3<^PBn2?#}Mr=J$6(h5^zHc!FUhS%BTp5NCaug;9vZy9p~6 z+!eP0&L03ua2-k{!*Kr6>y^4@x5XwxGF-pGiM~m=7G2w!CS)r=4kI>`0NGc&A^iZn4la^5t^9ME#?zJ6QVv5y&Pvm z7KP~_8LE#4u*8Rd@Z-o#Df_o%g=_OVtHDAC7LMSoc_H{&;Ul=!Z>MA4rOWLqFpszT zzAh1WIvm)M&23;+&jVI#x~|heuF>QUD;$*9JZ{%cfVG@cn>qE$am#icxs!kS1gdGO z`b4s#t0la2@}0;yiGcL_jUCDY%~P#vix|+|{#Cz= 0) ) + return UNKNOWN; + + if ( c == 127 ) + return BACK_SPACE; + else if ( c == LINE_FEED || c == CARRIAGE_RETURN ) + return NEW_LINE; + else + return REGULAR_INPUT; +} + +void command_controller ( enum SPECIAL_CHARACTER input_parse, char c, char buffer[], int * counter ) +{ + + + if ( input_parse == UNKNOWN ) + return; + + // Special key + if ( input_parse == BACK_SPACE ) + { + + if ( (*counter) > 0 ) + { + (*counter)--; + buffer[(*counter)] = '\0'; + + // int* end = counter; + for (int i = 0; i < (counter) ; i++) { + buffer[i] = buffer[i+1]; + } + + uart_puts(buffer); + + } + + + + + + } + else if ( input_parse == NEW_LINE ) + { + uart_send(c); + + if ( (*counter) == MAX_BUFFER_LEN ) + { + input_buffer_overflow_message(buffer); + } + else + { + buffer[(*counter)] = '\0'; + + if ( !strcmp(buffer, "help" ) ) command_help(); + else if ( !strcmp(buffer, "hello" ) ) command_hello(); + else if ( !strcmp(buffer, "timestamp" ) ) command_timestamp(); + else if ( !strcmp(buffer, "reboot" ) ) command_reboot(); + else command_not_found(buffer); + } + + (*counter) = 0; + strset (buffer, 0, MAX_BUFFER_LEN); + + // new line head; + uart_puts("# "); + } + else if ( input_parse == REGULAR_INPUT ) + { + uart_send(c); + + if ( *counter < MAX_BUFFER_LEN) + { + buffer[*counter] = c; + (*counter) ++; + } + } +} diff --git a/Lab1/shell.h b/Lab1/shell.h new file mode 100755 index 000000000..60dc89a2d --- /dev/null +++ b/Lab1/shell.h @@ -0,0 +1,24 @@ +#ifndef SHELL_H +#define SHELL_H + +#define MAX_BUFFER_LEN 128 + +enum SPECIAL_CHARACTER +{ + BACK_SPACE = 8, + LINE_FEED = 10, + CARRIAGE_RETURN = 13, + + + REGULAR_INPUT = 1000, + NEW_LINE = 1001, + + UNKNOWN = -1, + +}; + +void shell_start () ; +enum SPECIAL_CHARACTER parse ( char ); +void command_controller ( enum SPECIAL_CHARACTER, char c, char [], int *); + +#endif diff --git a/Lab1/shell.o b/Lab1/shell.o new file mode 100644 index 0000000000000000000000000000000000000000..438761fb28067afe9c6e1a9d59cb3db73c3933db GIT binary patch literal 3504 zcmbuBO-vkh6u{r?EJ!JZ^3~GPxJx7ks~vZ-jT>X)0=C5jO`zMvUff-lp;Y&Cc2=<% zyT(foJwUo79&D)z2O&L>7(a+HAyzNO1F@jJl%U4gL=PI!l%%-6H~W9^@33QxzRk{i z^ZUP#|L4qHINo={r6|Cnz{jwC#}pu4y=@0AGYEU229!h4;DG~1mja<@?kSlCK-~eE z_Lk?*ukN2Z2-oWB7u4{#pyUTE4fzJr9=?C8xnQ1rU3>EbSbu;R)j&N?{YE`O{YHI%J)Fb7jbbQ= z_3~KX@^wRf9`k)!EbcGOAr$VQP5Cjt@DtkhenbGQeysdM+jmlqCA4XNHpf1k;XZGz z#|@aETE)jFI$N1J? zxJI}q{=~X~dt%+v03&)ljsB$LDb(hM0ih$P9~1T^oK)zk z^!Zd=7x|s3Uhd}h-sPTJxVdzDrAzhz z@M2n;Jd!u)(p5XBT-kTE`Ps`&g+>C-LS1sh@5OQ+YT1(upyIEbsF=wvyDUIec8UrW zJ7A4Pc5=chJmBD81x-6z$RBr78Bw8f2dzWWAdQ#TuUYV*h_KcW?GF6&9uQ5I>U7{w zJMbO{-tWL)bl|!Jf7^jiI`C-+{te_xr0As>BMO{#W$)6_MVQr18K&V}5+lQdx#3~m z2&Z1vjp2CewJ;v=Z1n7Qwe2I%8O5RJ+hocN52tcenQDdc`Cyo({+!j#7>*EN(YgX0 z#PQb(o762~w<4!K#PX{!8j;JpZC&tY8^0?!<+*QP;XMiG;T>HiIOkzrBe*?Jlf>&w zDXnXV#2X~;6P)YPekY-q775p79u(X@KfO|Zd45cZ%a5qM#N{)6QE=`L&(XNx+#luz zDGxL1_q!6Ov&}MX%kLEp*KPTk&q;aY{GUjCA16osg~ag%wI#nvT%P~Cg7bKJp6?0H z<7E!6Qc7BPd4GB(zGtf{K)b{bNc@nnD=?36v53#cgW|qmw{L6AnB)lWy>2sIrR0*dRp&u69 z{zkoIt1H~C9Bh-OZwt!#U*r84OZ}qvmMr6<{-ZKPoBPkp97IMo?+-LB`BcR7w-0lU zWBnX9u+2WCfBu)_e@VpK-Fe>U_tZC&m0e*-kmo 0, stop +1: wfe + b 1b +2: // cpu id == 0 + + // set top of stack just before our code (stack grows to a lower address per AAPCS64) + ldr x1, =_start + mov sp, x1 + + // clear bss + ldr x1, =__bss_start + ldr w2, =__bss_size +3: cbz w2, 4f + str xzr, [x1], #8 + sub w2, w2, #1 + cbnz w2, 3b + + // jump to C code, should not return +4: bl main + // for failsafe, halt this core too + b 1b diff --git a/Lab1/start.o b/Lab1/start.o new file mode 100644 index 0000000000000000000000000000000000000000..b8ad155a6f3d6a3bdaa700a4f7237b381b4b80f8 GIT binary patch literal 1208 zcmbW0u}T9$5QhKD9h#_xVqqX42?lKBK!}h+$Ra2f7TVdJ8xk;J4CJ+>30V6Mg55cj+cnGP0+NAaX1<+&GMk&bJ3Kkcc^-^;_`oDH6d2?tu^5K}1?2I9 z`lu3!CkebqWq*_;$%gcB-T;Q|zkuRBP-{Hk=ODn@Ym)4d{P~;eCLRA5`I(aeKCI!a zRz96%nU7!!r+1#_DG9LeC=3@4U!i<8qyOTVJH?c)&)}OgII06wTZp1&97nN|eP!a# zZ5v(LxlVthmO7N^V#_*aXYP?BzGQKsV_t>4#g8psusFi_rmJL=yy~a^(nP8~PzYO6 zNrW^e!hZWohD^g|ucz!TbH^o8@;h5_ItV8>Dc9Oop@f;cA;K=QVpqRSXZ%0StKTIp z_nbBVDV^D7zZ2#=^zaS}dTjgDgI;LJ{khKQi<)y;)>reW&&#?G?=5RxJ@0~hcb2|s Y-4-X7Y5YglD9X~;^-yL{jlk9a0^h|z1ONa4 literal 0 HcmV?d00001 diff --git a/Lab1/string.c b/Lab1/string.c new file mode 100644 index 000000000..307b99317 --- /dev/null +++ b/Lab1/string.c @@ -0,0 +1,95 @@ +#include "string.h" +#include "math.h" + +int strcmp ( char * s1, char * s2 ) +{ + int i; + + for (i = 0; i < strlen(s1); i ++) + { + if ( s1[i] != s2[i]) + { + return s1[i] - s2[i]; + } + } + + return s1[i] - s2[i]; +} + +void strset (char * s1, int c, int size ) +{ + int i; + + for ( i = 0; i < size; i ++) + s1[i] = c; +} + +int strlen ( char * s ) +{ + int i = 0; + while ( 1 ) + { + if ( *(s+i) == '\0' ) + break; + i++; + } + + return i; +} + +// https://www.geeksforgeeks.org/convert-floating-point-number-string/ +void itoa (int x, char str[], int d) +{ + int i = 0; + while (x) { + str[i++] = (x % 10) + '0'; + x = x / 10; + } + + // If number of digits required is more, then + // add 0s at the beginning + while (i < d) + str[i++] = '0'; + + str[i] = '\0'; + reverse(str); +} + +// https://www.geeksforgeeks.org/convert-floating-point-number-string/ +void ftoa(float n, char* res, int afterpoint) +{ + // Extract integer part + int ipart = (int)n; + + // Extract floating part + float fpart = n - (float)ipart; + + // convert integer part to string + itoa(ipart, res, 0); + int i = strlen(res); + + // check for display option after point + if (afterpoint != 0) { + res[i] = '.'; // add dot + + // Get the value of fraction part upto given no. + // of points after dot. The third parameter + // is needed to handle cases like 233.007 + fpart = fpart * pow(10, afterpoint); + + itoa((int)fpart, res + i + 1, afterpoint); + } +} + +void reverse ( char * s ) +{ + int i; + char temp; + + for ( i = 0; i < strlen(s) / 2; i++ ) + { + temp = s[strlen(s) - i - 1]; + s[strlen(s) - i - 1] = s[0]; + s[0] = temp; + } +} diff --git a/Lab1/string.h b/Lab1/string.h new file mode 100644 index 000000000..763fd2b05 --- /dev/null +++ b/Lab1/string.h @@ -0,0 +1,13 @@ + +#ifndef STRING_H +#define STRING_H + +int strcmp ( char * s1, char * s2 ); +void strset ( char * s1, int c, int size ); +int strlen ( char * s ); +void itoa ( int x, char str[], int d); +void ftoa ( float n, char* res, int afterpoint ); +void reverse ( char *s ); + + +#endif diff --git a/Lab1/string.o b/Lab1/string.o new file mode 100644 index 0000000000000000000000000000000000000000..0b4e28fd9fc77c77f3ffc87f06566538b9e06c18 GIT binary patch literal 2752 zcmbtUUrd`-6hGg+UrQa^B9m=KmeO{>u#pC^#E}vkXzU=t?4kcC7Wr3cQFM(~ zhts4!NSMZCnGkUakUg6CVq)i%7_$e|ZP|;aC~PyvI0N%(SkL)-Z}$1EOH91v^}%+ihII~0R>*z-E4R8AHpALAZgblh zcwLCqJNTtF&fI<#rstC}ZN60Ma3u${S+EZM4$!lVcnR3hD(Y2;Q;zPxOC64H2DKtU zu)xEYi@%{iFT!rtP zSW}TJZYRdYl2PqrtcQF7av>S>GxlS_{UPjSnS+;N%6*jM0vJbqe4$PaeaoQdZuTj# z1j(ir8uD-72y1KNTp3UHGb+@O{ltxW?JBQwBgLI3Zk212^&`J-ta<4S*3yhUtX_CG zbO7_7yKr`#eCD&xQxqG&6`P4?-wO8Ic=ac$8eHexeY^lQeDHvF4g38Xc~uHc`7m-% z{GHGGW)y2Kq$KxiakPhl51mEsl!7b&7}kL!uEn{AHcO?wTgN_M+~P2O^C(-~4Vr!9 zh_bkWJZ)l6*Xv-*=5yG4apqUCwj$r{?zfh?Ud9?(w&~P5`uVXwe>N8k*jP1Jd9aB0 zB8K(7nRIG2j{?>g`LZ!zk7pP8eM@-$$q4gx7I1cykM2{HvHV}0Ezy0-;eE>C9J~s2 zY#ixYym{2Wc)iZIwRP;P1)Ak5=GcQV-cre1u;fAx%)82K-99B3qTH*<>l}003s$^C z;Ic;;96=(1V&HxSv0tX$< zy|IbW%!H$@&GWFQwWV!B-?qKh-tKAjJ}6)e1-MuL51_mn0(H`^)NQZVvHJy{6q5WN z5_+=%^9fzr$gf9W?+8hl%rhmh$5Cd5K1B~n*G}JQ+ecOY_tg)$f5v*!60mf${%t?~ zchpp{qLeubl|Ki=dP${8_4G<`rKq0FHl^7ROBHwM_>qy?~U*YIcVmI#LC- zcUZ{Z@Ms$B94v-iStTxa8S0n3?iF}SM93N01wJQmIj2T}uLxYuszu-t(VCoByTI2Z zF61MKQ%!fQbY^^T^m$Jl8YZEkA8;EVNs&k=G9-o*qcEO$DS>+!%#1~0fc~Y%UM^?4 zBJw|gvdmo>?_*_IXTm=<;Kq9T#7NC~_KAWmm`8-_NUI4?i9Ov{TGD?`-vRUqDe)Dt zA2#8V&zuRDe1a$a%19;}Lzx*b%cRuC6T?wYCNY@-Pk%HM1y3xU22Xr!WF#?)*yva$ z;W_+tZ%aB8jSqoGcTXh41LM(=ggEYh3kPPPk(h6`4>4Lv(@)1Z1G3lQN53K;e#Vs& z2_pi$2PK_j6MOj%H3{5w3@n%d5l1*$5+XPtBJdgsR!^vwNpf3YE2Hi%}JpO~g6%;QT*yQ z`+oZ6jmmyx4_n~udEPOanwYp0ADW%3mh5Ugoz^etso`|hH`9+sM)XwXjDU$(um4M= zJVff1lS*HA%*T!k{Hu`6J16w%0A>h1Bji!Y8KK`2@=pSDM9bg3W*n{QO(xPvZAJ&K z9l+atgtHu68nqk%yL_aTxR3DCs5K1vwuTPEs|P?dP`{ib&z13S!a>dwciG1cQL3CL z&z$+T!1rfbHOsc1r{oGH3&cilv9xH{wTe{|*d5Ex*RlImyMkE#B5w=g1*ez_;j+Ff zAzapXGla|fNUuC7+U6XjU9QUosoB_e|Yd$jz6{q9ro@pXh@-k1+fN4H5Ren6EJR--WajP?!?FVZFg2O0wVvOd5p2 zcky5S`5th7`JJHpOXinvQ{u86DMxW2b;)6Q`7i6gCj7&6LjViGpwR2@t^rO$