diff --git a/code/asm/build.mk b/code/asm/build.mk index 0c1fcc4..d61acaf 100644 --- a/code/asm/build.mk +++ b/code/asm/build.mk @@ -1,3 +1,6 @@ +# Note: The Makefile for each project is just a symbol-link to the build.mk +# under the "asm" folder. + EXEC = test SRC = ${EXEC}.s diff --git a/code/asm/rule.mk b/code/asm/rule.mk index 23e88bd..db197af 100644 --- a/code/asm/rule.mk +++ b/code/asm/rule.mk @@ -1,4 +1,15 @@ -include ../../common.mk +# This file will be included by the build.mk. + +CROSS_COMPILE = riscv64-unknown-elf- +CFLAGS = -nostdlib -fno-builtin -march=rv32g -mabi=ilp32 -g -Wall + +QEMU = qemu-system-riscv32 +QFLAGS = -nographic -smp 1 -machine virt -bios none + +GDB = gdb-multiarch +CC = ${CROSS_COMPILE}gcc +OBJCOPY = ${CROSS_COMPILE}objcopy +OBJDUMP = ${CROSS_COMPILE}objdump .DEFAULT_GOAL := all all: diff --git a/code/common.mk b/code/common.mk deleted file mode 100644 index 3e6cd46..0000000 --- a/code/common.mk +++ /dev/null @@ -1,10 +0,0 @@ -CROSS_COMPILE = riscv64-unknown-elf- -CFLAGS = -nostdlib -fno-builtin -march=rv32g -mabi=ilp32 -g -Wall - -QEMU = qemu-system-riscv32 -QFLAGS = -nographic -smp 1 -machine virt -bios none - -GDB = gdb-multiarch -CC = ${CROSS_COMPILE}gcc -OBJCOPY = ${CROSS_COMPILE}objcopy -OBJDUMP = ${CROSS_COMPILE}objdump \ No newline at end of file diff --git a/code/os/00-bootstrap/Makefile b/code/os/00-bootstrap/Makefile index 92431c5..3ef9ace 100644 --- a/code/os/00-bootstrap/Makefile +++ b/code/os/00-bootstrap/Makefile @@ -1,4 +1,4 @@ -include ../../common.mk +LDFLAGS = -Ttext=0x80000000 SRCS_ASM = \ start.S \ @@ -6,41 +6,4 @@ SRCS_ASM = \ SRCS_C = \ kernel.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -Ttext=0x80000000 -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/01-helloRVOS/Makefile b/code/os/01-helloRVOS/Makefile index b056e9a..a98b28c 100644 --- a/code/os/01-helloRVOS/Makefile +++ b/code/os/01-helloRVOS/Makefile @@ -1,4 +1,4 @@ -include ../../common.mk +LDFLAGS = -Ttext=0x80000000 SRCS_ASM = \ start.S \ @@ -7,41 +7,4 @@ SRCS_C = \ kernel.c \ uart.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -Ttext=0x80000000 -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/02-memanagement/Makefile b/code/os/02-memanagement/Makefile index 259b9ce..7dbfecb 100644 --- a/code/os/02-memanagement/Makefile +++ b/code/os/02-memanagement/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -10,41 +8,4 @@ SRCS_C = \ printf.c \ page.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/03-contextswitch/Makefile b/code/os/03-contextswitch/Makefile index 4d76913..01d18cb 100644 --- a/code/os/03-contextswitch/Makefile +++ b/code/os/03-contextswitch/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -12,41 +10,4 @@ SRCS_C = \ page.c \ sched.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/04-multitask/Makefile b/code/os/04-multitask/Makefile index fef6caf..a3e946d 100644 --- a/code/os/04-multitask/Makefile +++ b/code/os/04-multitask/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -13,41 +11,4 @@ SRCS_C = \ sched.c \ user.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/05-traps/Makefile b/code/os/05-traps/Makefile index 1289de3..270218b 100644 --- a/code/os/05-traps/Makefile +++ b/code/os/05-traps/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -14,41 +12,4 @@ SRCS_C = \ user.c \ trap.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/06-interrupts/Makefile b/code/os/06-interrupts/Makefile index 6c434c0..e3b6326 100644 --- a/code/os/06-interrupts/Makefile +++ b/code/os/06-interrupts/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -15,41 +13,4 @@ SRCS_C = \ trap.c \ plic.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/07-hwtimer/Makefile b/code/os/07-hwtimer/Makefile index d1aedf9..ec933db 100644 --- a/code/os/07-hwtimer/Makefile +++ b/code/os/07-hwtimer/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -16,41 +14,4 @@ SRCS_C = \ plic.c \ timer.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/08-preemptive/Makefile b/code/os/08-preemptive/Makefile index d1aedf9..ec933db 100644 --- a/code/os/08-preemptive/Makefile +++ b/code/os/08-preemptive/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -16,41 +14,4 @@ SRCS_C = \ plic.c \ timer.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/09-lock/Makefile b/code/os/09-lock/Makefile index b5d872a..4dc0582 100644 --- a/code/os/09-lock/Makefile +++ b/code/os/09-lock/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -17,41 +15,4 @@ SRCS_C = \ timer.c \ lock.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/10-swtimer/Makefile b/code/os/10-swtimer/Makefile index b5d872a..4dc0582 100644 --- a/code/os/10-swtimer/Makefile +++ b/code/os/10-swtimer/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SRCS_ASM = \ start.S \ mem.S \ @@ -17,41 +15,4 @@ SRCS_C = \ timer.c \ lock.c \ -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/11-syscall/Makefile b/code/os/11-syscall/Makefile index b933edc..face96f 100644 --- a/code/os/11-syscall/Makefile +++ b/code/os/11-syscall/Makefile @@ -1,5 +1,3 @@ -include ../../common.mk - SYSCALL = y ifeq (${SYSCALL}, y) @@ -25,41 +23,4 @@ SRCS_C = \ lock.c \ syscall.c -OBJS = $(SRCS_ASM:.S=.o) -OBJS += $(SRCS_C:.c=.o) - -.DEFAULT_GOAL := all -all: os.elf - -# start.o must be the first in dependency! -os.elf: ${OBJS} - ${CC} ${CFLAGS} -T os.ld -o os.elf $^ - ${OBJCOPY} -O binary os.elf os.bin - -%.o : %.c - ${CC} ${CFLAGS} -c -o $@ $< - -%.o : %.S - ${CC} ${CFLAGS} -c -o $@ $< - -run: all - @${QEMU} -M ? | grep virt >/dev/null || exit - @echo "Press Ctrl-A and then X to exit QEMU" - @echo "------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf - -.PHONY : debug -debug: all - @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" - @echo "-------------------------------------------------------" - @${QEMU} ${QFLAGS} -kernel os.elf -s -S & - @${GDB} os.elf -q -x ../gdbinit - -.PHONY : code -code: all - @${OBJDUMP} -S os.elf | less - -.PHONY : clean -clean: - rm -rf *.o *.bin *.elf - +include ../common.mk diff --git a/code/os/common.mk b/code/os/common.mk new file mode 100644 index 0000000..ddf2518 --- /dev/null +++ b/code/os/common.mk @@ -0,0 +1,53 @@ +# This file will be included by the Makefile of each project. + +CROSS_COMPILE = riscv64-unknown-elf- +CFLAGS += -nostdlib -fno-builtin -march=rv32g -mabi=ilp32 -g -Wall +LDFLAGS ?= -T os.ld + +QEMU = qemu-system-riscv32 +QFLAGS = -nographic -smp 1 -machine virt -bios none + +GDB = gdb-multiarch +CC = ${CROSS_COMPILE}gcc +OBJCOPY = ${CROSS_COMPILE}objcopy +OBJDUMP = ${CROSS_COMPILE}objdump + +# SRCS_ASM & SRCS_C are defined in the Makefile of each project. +OBJS = $(SRCS_ASM:.S=.o) +OBJS += $(SRCS_C:.c=.o) + +.DEFAULT_GOAL := all +all: os.elf + +# start.o must be the first in dependency! +os.elf: ${OBJS} + ${CC} ${CFLAGS} ${LDFLAGS} -o os.elf $^ + ${OBJCOPY} -O binary os.elf os.bin + +%.o : %.c + ${CC} ${CFLAGS} -c -o $@ $< + +%.o : %.S + ${CC} ${CFLAGS} -c -o $@ $< + +run: all + @${QEMU} -M ? | grep virt >/dev/null || exit + @echo "Press Ctrl-A and then X to exit QEMU" + @echo "------------------------------------" + @${QEMU} ${QFLAGS} -kernel os.elf + +.PHONY : debug +debug: all + @echo "Press Ctrl-C and then input 'quit' to exit GDB and QEMU" + @echo "-------------------------------------------------------" + @${QEMU} ${QFLAGS} -kernel os.elf -s -S & + @${GDB} os.elf -q -x ../gdbinit + +.PHONY : code +code: all + @${OBJDUMP} -S os.elf | less + +.PHONY : clean +clean: + rm -rf *.o *.bin *.elf +