From 1b040423c3d9348545c9cd7b10fa38d4a16b12ec Mon Sep 17 00:00:00 2001 From: iDunnoDev Date: Tue, 22 Nov 2022 00:38:22 +0000 Subject: [PATCH] Fixed memory lea issue in stage 4 Added Stage 5 polygon and array functions --- stage4/bootasm2.S | 7 +- stage4/bootasm2.o | Bin 4808 -> 4808 bytes stage4/bootblock2 | Bin 1091 -> 1088 bytes stage4/bootblock2.o | Bin 4372 -> 4368 bytes stage4/xv6.img | 2 +- stage5/.vscode/tasks.json | 19 + stage5/Makefile | 102 ++++ stage5/bootasm.S | 101 ++++ stage5/bootasm.d | 1 + stage5/bootasm.o | Bin 0 -> 2032 bytes stage5/bootasm2.S | 1138 +++++++++++++++++++++++++++++++++++++ stage5/bootasm2.d | 1 + stage5/bootasm2.o | Bin 0 -> 6912 bytes stage5/bootblock | Bin 0 -> 512 bytes stage5/bootblock.o | Bin 0 -> 1644 bytes stage5/bootblock2 | Bin 0 -> 1850 bytes stage5/bootblock2.o | Bin 0 -> 6304 bytes stage5/sign.pl | 19 + stage5/xv6.img | 3 + 19 files changed, 1388 insertions(+), 5 deletions(-) create mode 100644 stage5/.vscode/tasks.json create mode 100644 stage5/Makefile create mode 100644 stage5/bootasm.S create mode 100644 stage5/bootasm.d create mode 100644 stage5/bootasm.o create mode 100644 stage5/bootasm2.S create mode 100644 stage5/bootasm2.d create mode 100644 stage5/bootasm2.o create mode 100644 stage5/bootblock create mode 100644 stage5/bootblock.o create mode 100644 stage5/bootblock2 create mode 100644 stage5/bootblock2.o create mode 100644 stage5/sign.pl create mode 100644 stage5/xv6.img diff --git a/stage4/bootasm2.S b/stage4/bootasm2.S index 6d15cf7..ebd077c 100644 --- a/stage4/bootasm2.S +++ b/stage4/bootasm2.S @@ -275,14 +275,14 @@ cons_filled_rect_check_x_dir: cmpw $0, %ax jge cons_filled_rect_check_y_dir add %ax, rectx(%bp) - neg rectwidth(%bp) + negw rectwidth(%bp) cons_filled_rect_check_y_dir: movw rectheight(%bp), %ax # Check if the user has entered a negative height value and swap the direction to a pos cmpw $0, %ax jge cons_filled_rect_check_x_zero add %ax, recty(%bp) - neg rectheight(%bp) + negw rectheight(%bp) cons_filled_rect_check_x_zero: movw rectx(%bp), %ax # Check if the x value is a negative value, set it to 0 and figure out the offset so we @@ -344,8 +344,7 @@ cons_filled_rect_setup: movw (screen_width), %ax # Set ax to 320 so that we can multiply this by y mul %dx # does the (y * 320) part of our math add rectx(%bp), %ax # Add the value of x to register ax - movw %ax, %si - lea %es:(%si), %bx # Load the memory address into the bx register + movw %ax, %bx # Load the memory offset address into the bx register movw rectheight(%bp), %si # Set the counter to our height which should be the number of lines to draw to diff --git a/stage4/bootasm2.o b/stage4/bootasm2.o index 6c43a6435027469cb00e4cd038b85d8f9db49974..3410ea91d011841cf94d64881a216bccd4effe16 100644 GIT binary patch delta 751 zcmYk0OK1~O6o&8VOkQIj35JG>=7DWWz)~p~368M@5)h>dwSvJ?3azF$VrU2<#WJ(V zst$xtb)Fw<4&m=a?g?sqE|D5}%3{{36o`Dmu z!a?YlMRl-PCCk2Z{ZUaJDAvfbdrf9pxX~?(ku7ymNZ2*6%)Wp>9yNlvkdQR5fr=}% z6-r1&#ZHvbq9PF`^o~4zP}Z(n*JSbUj*t*n%35C165T7?+Js&I{X*-N*@Z53>VBh{ zmzw$gX8wRHZT{2D*Lb$W2mDr>e>U^Kc(TKLe4@=ij6BxiJsxI9g}4|H`98ZTcx6wc zShmnUYN3V6tK8Ap*)hEPzgO!N=t(+4-Kocf@7Ad`^_pPMomwUQ8(SA5>IWT9C+Py6 zp-KKmr(LNEX?c=AL!)yzN(z~Zc-k$f5`R`=dUC{xyQbF_poGz_eVgMWLvvqKQ;5v@G%K##_ zs!_&Sk1Y-U(vockKxSX{k2d(HnJZ1+;is8bxG081zRMZVd^0H{PI{#Zv|C3VHZ^Ez!oKMHxuycP%R z8BgdxYD1Y!R=%8>oSL4M$Fh@mr{#!zFT>KJ8(i80F#xvy3)+%>2%yY19HHawgb*8U zLd1GC%P?zkrlC`tcP0T8w&m)87&~xfz{h6X$zm0bCV}({gq&=g#}LSQ^svRRqem^C zMmH>8K=7xk=Y)UcyX#^A diff --git a/stage4/bootblock2 b/stage4/bootblock2 index dda25ec4b9fcbc16d8f1871a68df3e921a9ae2d8..8f6d29a494552108912711425c0721f85dba3aee 100644 GIT binary patch delta 441 zcmX|(Jxjw-6ozk-wxkz75Q@^liXVs>#7!uM4ni{)K@^SHE>hxgs$dYT37Dw{1W6Fw z>?F7eIu%6BBKQY72tubT77>-&mbCGv)h>tUdCz-}!{77l>*zH*%?yjSK4mmeer#bl zVe3(&iSm)6XeF3+U9{t6J;zDB8S_yK3T1(c6e=MUFCXGUIwUwk8o$v(!tW+I33pK& z^1Im3c%;o48b+E>LKi2Fxf&{p_D_YA0tLrZu_^TxUd$BleqEUZqRl*|_Ntk*yuPtk zs9I4rw{qO}RP3oWPpuQJ%io^bB)dJXlWdpYJ@u2wJ^mo6E?510vBw`|-g;q^fpMGE ztQjsQjL?xLz=eM5{~_7&-_l|y KBb(NEVB!~m8^@vm delta 466 zcmYj}O(+Cm7=XW-wbS_Wn@uSpq_#Mq)TT@hCZ(i=j9LfMcrPwYTh`2B4r~*pnf6RM zIUxtyLTyROeU(ysdPNfQ*VysRE}P5O^Stl#y=P)tn%xUelb@7aJ{k~nW$ueUU6$z_RKYglw&cC8A@;Vy@l9;Tzp zVI_`SEMaSuPe$w;uW6kYM5?=ZIT*jM(NO zu_^X=`!zh`D-jYF_L{J7X5s1Jv z1M(YGCA`=JgB%0@FS5JlwlG+&u_6uw+d@gc(M!F!~i_!&NI05H$ z8dei5gy8VZCj;k5S9uA)r5|}8w&!;EE{q3qEw=lZ#_et_<+AoL#xnio@Ze$E?u=p= zedr7)OWE2E<^>qy5IVKk@D*^c#bL1DVijyyoCdpS+u}8_S8w#!Idl{CS_VGA zz>vjX!4np5fjyQD{(=KX7U2i%=6$yKiP_Js3txB~pi6DbxP|&fA2#Te*w=gsZv6m_ bh#mB)C}M@Kiha01KSAfa3!xZ|**pFLlQaBZ delta 820 zcmYk5O=uHA6vt<>+k7l(n@DUFYPvR|C7>u3m1uE^(GXBXC{`N^q1xg)6oV3%h&4fS z(6CgR&f0^QTJWOaLDQS4NI*P@AReqJ2sw>krL@x4x=DQ7^kWC!+yC#qH;){z?j zJ|^P+!cPB|2#=6qHiQrc`z}81?Z7RPmJQ_oqLH@4EnzLYJ-32JJW~=K$9+yo3(aIx zT-2`mB)WvfSl9@}xTv7|44H8UXM#~7m$9QvS1u!<%&zC?!QGPDYn_s`r7{=g^KUvv zTUA9+qt5&{^^{#-c&s)_wBM3FbGuqogqpHgQzuFKQ_YncNHb|5>7LWfS}m6icCPVag<#?*yNO4h zK#Wz0Rh~wW^T-9nKGTm}DEmr>-Ene>BuJb+(}_iXi&i<#9s-d;C?#pgP3Xiy1o;3a z0uk699rR1Iir`pUCyl`CK_(k*p>Q?E;`-0((PT0uo=gr54qX*{QUe!<#4d3-NmX9h z+6uF>fFT6KGu9Z)kv`!?T%zxJKeiX=c`vr?IZ_m?modF&^J0H-)Rw?lqQC8JI7}NI zN$jRK9f@qEP;X(pfP)-DJH|IT1{^eT0=V163UJNDd0;o)+&>BIHSsiXK-fH9D385?N$Aho&PZ;Yz2`&2@ diff --git a/stage4/xv6.img b/stage4/xv6.img index 6ffd19d..1b593b8 100644 --- a/stage4/xv6.img +++ b/stage4/xv6.img @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91937ee0ce0a78815628538f19ff3ee6cf003e740e7815fb11539871c39e068e +oid sha256:465ada267f22651cb6209e385990be1d287f9831c9b4c7c1db2efd0a005e1d6a size 5120000 diff --git a/stage5/.vscode/tasks.json b/stage5/.vscode/tasks.json new file mode 100644 index 0000000..c567be5 --- /dev/null +++ b/stage5/.vscode/tasks.json @@ -0,0 +1,19 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Build and QEMU", + "type": "shell", + "command": "make qemu", + "problemMatcher": [] + }, + { + "label": "Build and QEMU (debug)", + "type": "shell", + "command": "make qemu-gdb", + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/stage5/Makefile b/stage5/Makefile new file mode 100644 index 0000000..e409242 --- /dev/null +++ b/stage5/Makefile @@ -0,0 +1,102 @@ +# Try to infer the correct TOOLPREFIX if not set +ifndef TOOLPREFIX +TOOLPREFIX := $(shell if i386-jos-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \ + then echo 'i386-jos-elf-'; \ + elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \ + then echo ''; \ + else echo "***" 1>&2; \ + echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \ + echo "*** Is the directory with i386-jos-elf-gcc in your PATH?" 1>&2; \ + echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \ + echo "*** prefix other than 'i386-jos-elf-', set your TOOLPREFIX" 1>&2; \ + echo "*** environment variable to that prefix and run 'make' again." 1>&2; \ + echo "*** To turn off this error, run 'gmake TOOLPREFIX= ...'." 1>&2; \ + echo "***" 1>&2; exit 1; fi) +endif + +# If the makefile can't find QEMU, specify its path here +# QEMU = qemu-system-i386 + +# Try to infer the correct QEMU +ifndef QEMU +QEMU = $(shell if which qemu > /dev/null; \ + then echo qemu; exit; \ + elif which qemu-system-i386 > /dev/null; \ + then echo qemu-system-i386; exit; \ + elif which qemu-system-x86_64 > /dev/null; \ + then echo qemu-system-x86_64; exit; \ + else \ + qemu=/Applications/Q.app/Contents/MacOS/i386-softmmu.app/Contents/MacOS/i386-softmmu; \ + if test -x $$qemu; then echo $$qemu; exit; fi; fi; \ + echo "***" 1>&2; \ + echo "*** Error: Couldn't find a working QEMU executable." 1>&2; \ + echo "*** Is the directory containing the qemu binary in your PATH" 1>&2; \ + echo "*** or have you tried setting the QEMU variable in Makefile?" 1>&2; \ + echo "***" 1>&2; exit 1) +endif + +CC = $(TOOLPREFIX)gcc +AS = $(TOOLPREFIX)gas +LD = $(TOOLPREFIX)ld +OBJCOPY = $(TOOLPREFIX)objcopy +OBJDUMP = $(TOOLPREFIX)objdump +CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) +ASFLAGS = -m32 -gdwarf-2 -Wa,-divide +# FreeBSD ld wants ``elf_i386_fbsd'' +LDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2>/dev/null | head -n 1) + +# Disable PIE when possible (for Ubuntu 16.10 toolchain) +ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]no-pie'),) +CFLAGS += -fno-pie -no-pie +endif +ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]nopie'),) +CFLAGS += -fno-pie -nopie +endif + +xv6.img: bootblock bootblock2 + dd if=/dev/zero of=xv6.img count=10000 + dd if=bootblock of=xv6.img conv=notrunc + dd if=bootblock2 of=xv6.img seek=1 conv=notrunc + +bootblock: bootasm.S + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o + $(OBJCOPY) -S -O binary -j .text bootblock.o bootblock + ./sign.pl bootblock + +bootblock2: bootasm2.S + $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm2.S + $(LD) $(LDFLAGS) -N -e start -Ttext 0x9000 -o bootblock2.o bootasm2.o + $(OBJCOPY) -S -O binary -j .text bootblock2.o bootblock2 + + +.PRECIOUS: %.o + +clean: + rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \ + *.o *.d *.asm *.sym vectors.S bootblock bootblock2 entryother \ + initcode initcode.out kernel xv6.img fs.img kernelmemfs \ + xv6memfs.img mkfs \ + syscall.h syscalltable.h usys.S + +# run in emulators + +# try to generate a unique GDB port +GDBPORT = $(shell expr `id -u` % 5000 + 25000) +# QEMU's gdb stub command line changed in 0.11 +QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \ + then echo "-gdb tcp::$(GDBPORT)"; \ + else echo "-s -p $(GDBPORT)"; fi) +ifndef CPUS +CPUS := 1 +endif +QEMUOPTS = -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA) + +qemu: xv6.img + $(QEMU) -vga std -serial mon:stdio $(QEMUOPTS) + +qemu-gdb: xv6.img + @echo "*** Now run 'gdb'." 1>&2 + $(QEMU) -vga std -serial mon:stdio $(QEMUOPTS) -S -gdb tcp::1234 + diff --git a/stage5/bootasm.S b/stage5/bootasm.S new file mode 100644 index 0000000..ebfa7da --- /dev/null +++ b/stage5/bootasm.S @@ -0,0 +1,101 @@ +# When the PC starts, the processor is essentially emulating an 8086 processor, i.e. +# a 16-bit processor. So our initial boot loader code is 16-bit code that will +# eventually switch the processor into 32-bit mode. + +# This code is linked to assume a starting address of 0x7C00 which is where the BIOS +# will load a boot segment. + +.code16 # Assemble for 16-bit mode +.globl start +start: + jmp real_start + +# Write to the console using BIOS. +# +# Input: SI contains the address of the null-terminated string to be displayed + +cons_write: + movb $0x0e, %ah # 0x0e is the INT 10h BIOS call to output the value contained in AL to screen + +cons_write_rpt: + movb (%si), %al # Load the byte at the location contained in the SI register into AL + inc %si # Add 1 to the value in SI + cmp $0, %al # Compare the value in AL with 0 + jz cons_write_done # If it is zero, then we are done + int $0x10 # Output the character in AL to the screen + jmp cons_write_rpt # and continue + +cons_write_done: # Something that is called will never return + ret # until a 'ret' instruction is encountered. Labels do + # not give a program any structure. They just give a + # memory location a name that we can use in our code. + +cons_write_crlf: + movb $0x0e, %ah # Output CR + movb $0x0d, %al + int $0x10 + movb $0x0a, %al # Output LF + int $0x10 + ret + +cons_writeline: + call cons_write + call cons_write_crlf + ret + +real_start: + cli # BIOS enabled interrupts; disable + + # Zero data segment registers DS, ES, and SS. + xorw %ax, %ax # Set %ax to zero + movw %ax, %ds # -> Data Segment + movw %ax, %es # -> Extra Segment + movw %ax, %ss # -> Stack Segment + movw $0, %sp # Set the stack to the top of the segment + + movb %dl, (boot_device) # Boot device number is passed in DL from BIOS. Save it hear since DL might get trashed + + movw $boot_message, %si # Display our boot message + call cons_writeline + + movb $2, %ah # BIOS function 13h, sub-function 2 is read sectors + movb $7, %al # Number of sectors to read = 7 + movw $0x9000, %bx # The 7 sectors will be loaded into memory at ES:BX (0000:9000h) + movb $0, %ch # Use cylinder 0 + movb $0, %dh # Use head 0 + movb (boot_device), %dl # Retrieve the ID of our boot device + movb $2, %cl # Start reading at sector 2 (i.e. one after the boot sector) + int $0x13 + cmpb $7, %al # AL returns the number of sectors read. If this is not 7, report an error + jne read_failed + + movb (0x9000), %al # Check that what we loaded is not empty + cmpb $0, %al + je read_failed + + movb (boot_device), %dl # Pass boot device ID to second stage + movw $0x9000, %ax # Jump to stage 2 + jmp *%ax + +read_failed: # Display error messages + movw $read_failed_msg, %si + call cons_writeline + + mov $cannot_continue, %si + call cons_writeline + +endless_loop: # Loop forever more + jmp endless_loop + +# Program data + +boot_device: + .byte 0 + +boot_message: + .string "Boot Loader V1.0" +read_failed_msg: + .string "Unable to read stage 2 of the boot process" +cannot_continue: + .string "Cannot continue boot process" + diff --git a/stage5/bootasm.d b/stage5/bootasm.d new file mode 100644 index 0000000..59e6ae8 --- /dev/null +++ b/stage5/bootasm.d @@ -0,0 +1 @@ +bootasm.o: bootasm.S diff --git a/stage5/bootasm.o b/stage5/bootasm.o new file mode 100644 index 0000000000000000000000000000000000000000..67f80b721f7dc6bee39ecae96a2d7b2bb282780f GIT binary patch literal 2032 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 literal 0 HcmV?d00001 diff --git a/stage5/bootblock b/stage5/bootblock new file mode 100644 index 0000000000000000000000000000000000000000..95937cb7cd534fc98e8774a40d52622b32d8a199 GIT binary patch literal 512 zcmaE@u!XOS#m$DHgypQj>#v8m@NM8dE3kpwgSR`S~RZKKY3$sYME5hI$4Jp?Qf(IjIUI`3gm;i75)jC5h>&3PuX~ sX$mD7sR~IT%Zw_7$(kS==m~ou9S*nbUE-UP3a_| z6G_i^;>4><=YSK|oaDN6DqKDtg;g2Hbjk|?U^NVqMliD>iIouThT6)@HX>WE3ZWT> z_L8NNYTwj`D6bzW7i!(H2C1-X(AqZ8lOM{D=C}7EI;}e9Xg^n2*020lHrx>kXO9}g zw)WTq_9&vH8tS!qf}VcsaLFBZUAHuf#&t)^<&hC~CML@hu3L89^MJ9kJ9fTYDo>P; z+1D^AuicAV#VK-I(r^tyIve)M_MvSO0L?n!*uq-W#`0{bD((e$p3Zt zJ3fE#KcZHXMRN4Ly9NGUtRxkScEYg@9tP(O9s>^;d>mXb_#$}7U;%C!d;=U9JPQ^E z-v!Sb`~dve;78ya20sD6&A5PH_G$ya0lzcy1+cm=FkDZ1uR_8pZ3=98ln@SLEN(}Q zL>jJ$rp=7-!{DEEHEPz3@@4~R9$onIR->BvE&N>E1D?zmHLuZ>zUhlrT&JqK4MN`r zl7ZhuH_;5kX%eCWH~mZ@eJ}Aypn#|t&$SY-0-Hpsy{^4P&L&j!Wo4!=yvPgcGS=7# zYN7VMN+puFG^y{;I$W<3 zhlh(FAT7F%ZThCAnX3Q?!Og%tGzaDL%G?9hG7EUG0hY&M8HAd3CosTGl}Q_2_XmTa BCcXdw literal 0 HcmV?d00001 diff --git a/stage5/bootblock2 b/stage5/bootblock2 new file mode 100644 index 0000000000000000000000000000000000000000..88f99f45e647f42f581c5c2d1738f979a1d0453c GIT binary patch literal 1850 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 510){ + print STDERR "boot block too large: $n bytes (max 510)\n"; + exit 1; +} + +print STDERR "boot block is $n bytes (max 510)\n"; + +$buf .= "\0" x (510-$n); +$buf .= "\x55\xAA"; + +open(SIG, ">$ARGV[0]") || die "open >$ARGV[0]: $!"; +print SIG $buf; +close SIG; diff --git a/stage5/xv6.img b/stage5/xv6.img new file mode 100644 index 0000000..621fd09 --- /dev/null +++ b/stage5/xv6.img @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:288eb982d8be8d0bae83fd38df2c56107fba15cf66fd1beb675960fa8ab77132 +size 5120000