forked from phlalx/jos
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
44 changed files
with
5,740 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
((nil | ||
(indent-tabs-mode . t) | ||
(tab-width . 8)) | ||
(c-mode | ||
(c-file-style . "bsd") | ||
(c-basic-offset . 8)) | ||
(shell-mode | ||
(sh-basic-offset . 8) | ||
(sh-indentation . 8)) | ||
(python-mode | ||
(indent-tabs-mode . nil)) | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
set $lastcs = -1 | ||
|
||
define hook-stop | ||
# There doesn't seem to be a good way to detect if we're in 16- or | ||
# 32-bit mode, but we always run with CS == 8 in 32-bit mode. | ||
if $cs == 8 || $cs == 27 | ||
if $lastcs != 8 && $lastcs != 27 | ||
set architecture i386 | ||
end | ||
x/i $pc | ||
else | ||
if $lastcs == -1 || $lastcs == 8 || $lastcs == 27 | ||
set architecture i8086 | ||
end | ||
# Translate the segment:offset into a physical address | ||
printf "[%4x:%4x] ", $cs, $eip | ||
x/i $cs*16+$eip | ||
end | ||
set $lastcs = $cs | ||
end | ||
|
||
echo + target remote localhost:1234\n | ||
target remote localhost:1234 | ||
|
||
# If this fails, it's probably because your GDB doesn't support ELF. | ||
# Look at the tools page at | ||
# http://pdos.csail.mit.edu/6.828/2009/tools.html | ||
# for instructions on building GDB with ELF support. | ||
echo + symbol-file obj/kern/kernel\n | ||
symbol-file obj/kern/kernel |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
/obj | ||
/jos.in | ||
/jos.log | ||
/jos.out | ||
/jos.out.* | ||
/jos.cmd | ||
/.gdbinit | ||
/wget.log | ||
/qemu.pcap | ||
/qemu.pcap.* | ||
/qemu.out | ||
/qemu.log | ||
/gradelib.pyc | ||
/lab?-handin.tar.gz | ||
/lab?/ | ||
/sol?/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
JOS CODING STANDARDS | ||
|
||
It's easier on everyone if all authors working on a shared | ||
code base are consistent in the way they write their programs. | ||
We have the following conventions in our code: | ||
|
||
* No space after the name of a function in a call | ||
For example, printf("hello") not printf ("hello"). | ||
|
||
* One space after keywords "if", "for", "while", "switch". | ||
For example, if (x) not if(x). | ||
|
||
* Space before braces. | ||
For example, if (x) { not if (x){. | ||
|
||
* Function names are all lower-case separated by underscores. | ||
|
||
* Beginning-of-line indentation via tabs, not spaces. | ||
|
||
* Preprocessor macros are always UPPERCASE. | ||
There are a few grandfathered exceptions: assert, panic, | ||
static_assert, offsetof. | ||
|
||
* Pointer types have spaces: (uint16_t *) not (uint16_t*). | ||
|
||
* Multi-word names are lower_case_with_underscores. | ||
|
||
* Comments in imported code are usually C /* ... */ comments. | ||
Comments in new code are C++ style //. | ||
|
||
* In a function definition, the function name starts a new line. | ||
Then you can grep -n '^foo' */*.c to find the definition of foo. | ||
|
||
* Functions that take no arguments are declared f(void) not f(). | ||
|
||
The included .dir-locals.el file will automatically set up the basic | ||
indentation style in Emacs. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,250 @@ | ||
# | ||
# This makefile system follows the structuring conventions | ||
# recommended by Peter Miller in his excellent paper: | ||
# | ||
# Recursive Make Considered Harmful | ||
# http://aegis.sourceforge.net/auug97.pdf | ||
# | ||
OBJDIR := obj | ||
|
||
# Run 'make V=1' to turn on verbose commands, or 'make V=0' to turn them off. | ||
ifeq ($(V),1) | ||
override V = | ||
endif | ||
ifeq ($(V),0) | ||
override V = @ | ||
endif | ||
|
||
-include conf/lab.mk | ||
|
||
-include conf/env.mk | ||
|
||
LABSETUP ?= ./ | ||
|
||
TOP = . | ||
|
||
# Cross-compiler jos toolchain | ||
# | ||
# This Makefile will automatically use the cross-compiler toolchain | ||
# installed as 'i386-jos-elf-*', if one exists. If the host tools ('gcc', | ||
# 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will | ||
# be detected as well. If you have the right compiler toolchain installed | ||
# using a different name, set GCCPREFIX explicitly in conf/env.mk | ||
|
||
# try to infer the correct GCCPREFIX | ||
ifndef GCCPREFIX | ||
GCCPREFIX := $(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 GCCPREFIX" 1>&2; \ | ||
echo "*** environment variable to that prefix and run 'make' again." 1>&2; \ | ||
echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \ | ||
echo "***" 1>&2; exit 1; fi) | ||
endif | ||
|
||
# try to infer the correct QEMU | ||
ifndef QEMU | ||
QEMU := $(shell if which qemu > /dev/null; \ | ||
then echo qemu; 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 conf/env.mk?" 1>&2; \ | ||
echo "***" 1>&2; exit 1) | ||
endif | ||
|
||
# try to generate a unique GDB port | ||
GDBPORT := $(shell expr `id -u` % 5000 + 25000) | ||
|
||
CC := $(GCCPREFIX)gcc -pipe | ||
AS := $(GCCPREFIX)as | ||
AR := $(GCCPREFIX)ar | ||
LD := $(GCCPREFIX)ld | ||
OBJCOPY := $(GCCPREFIX)objcopy | ||
OBJDUMP := $(GCCPREFIX)objdump | ||
NM := $(GCCPREFIX)nm | ||
|
||
# Native commands | ||
NCC := gcc $(CC_VER) -pipe | ||
NATIVE_CFLAGS := $(CFLAGS) $(DEFS) $(LABDEFS) -I$(TOP) -MD -Wall | ||
TAR := gtar | ||
PERL := perl | ||
|
||
# Compiler flags | ||
# -fno-builtin is required to avoid refs to undefined functions in the kernel. | ||
# Only optimize to -O1 to discourage inlining, which complicates backtraces. | ||
CFLAGS := $(CFLAGS) $(DEFS) $(LABDEFS) -O1 -fno-builtin -I$(TOP) -MD | ||
CFLAGS += -fno-omit-frame-pointer | ||
CFLAGS += -Wall -Wno-format -Wno-unused -Werror -gstabs -m32 | ||
|
||
# Add -fno-stack-protector if the option exists. | ||
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) | ||
|
||
# Common linker flags | ||
LDFLAGS := -m elf_i386 | ||
|
||
# Linker flags for JOS user programs | ||
ULDFLAGS := -T user/user.ld | ||
|
||
GCC_LIB := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) | ||
|
||
# Lists that the */Makefrag makefile fragments will add to | ||
OBJDIRS := | ||
|
||
# Make sure that 'all' is the first target | ||
all: | ||
|
||
# Eliminate default suffix rules | ||
.SUFFIXES: | ||
|
||
# Delete target files if there is an error (or make is interrupted) | ||
.DELETE_ON_ERROR: | ||
|
||
# make it so that no intermediate .o files are ever deleted | ||
.PRECIOUS: %.o $(OBJDIR)/boot/%.o $(OBJDIR)/kern/%.o \ | ||
$(OBJDIR)/lib/%.o $(OBJDIR)/fs/%.o $(OBJDIR)/net/%.o \ | ||
$(OBJDIR)/user/%.o | ||
|
||
KERN_CFLAGS := $(CFLAGS) -DJOS_KERNEL -gstabs | ||
USER_CFLAGS := $(CFLAGS) -DJOS_USER -gstabs | ||
|
||
# Update .vars.X if variable X has changed since the last make run. | ||
# | ||
# Rules that use variable X should depend on $(OBJDIR)/.vars.X. If | ||
# the variable's value has changed, this will update the vars file and | ||
# force a rebuild of the rule that depends on it. | ||
$(OBJDIR)/.vars.%: FORCE | ||
$(V)echo "$($*)" | cmp -s $@ || echo "$($*)" > $@ | ||
.PRECIOUS: $(OBJDIR)/.vars.% | ||
.PHONY: FORCE | ||
|
||
|
||
# Include Makefrags for subdirectories | ||
include boot/Makefrag | ||
include kern/Makefrag | ||
|
||
|
||
QEMUOPTS = -hda $(OBJDIR)/kern/kernel.img -serial mon:stdio -gdb tcp::$(GDBPORT) | ||
QEMUOPTS += $(shell if $(QEMU) -nographic -help | grep -q '^-D '; then echo '-D qemu.log'; fi) | ||
IMAGES = $(OBJDIR)/kern/kernel.img | ||
QEMUOPTS += $(QEMUEXTRA) | ||
|
||
.gdbinit: .gdbinit.tmpl | ||
sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ | ||
|
||
pre-qemu: .gdbinit | ||
|
||
qemu: $(IMAGES) pre-qemu | ||
$(QEMU) $(QEMUOPTS) | ||
|
||
qemu-nox: $(IMAGES) pre-qemu | ||
@echo "***" | ||
@echo "*** Use Ctrl-a x to exit qemu" | ||
@echo "***" | ||
$(QEMU) -nographic $(QEMUOPTS) | ||
|
||
qemu-gdb: $(IMAGES) pre-qemu | ||
@echo "***" | ||
@echo "*** Now run 'gdb'." 1>&2 | ||
@echo "***" | ||
$(QEMU) $(QEMUOPTS) -S | ||
|
||
qemu-nox-gdb: $(IMAGES) pre-qemu | ||
@echo "***" | ||
@echo "*** Now run 'gdb'." 1>&2 | ||
@echo "***" | ||
$(QEMU) -nographic $(QEMUOPTS) -S | ||
|
||
print-qemu: | ||
@echo $(QEMU) | ||
|
||
print-gdbport: | ||
@echo $(GDBPORT) | ||
|
||
# For deleting the build | ||
clean: | ||
rm -rf $(OBJDIR) .gdbinit jos.in qemu.log | ||
|
||
realclean: clean | ||
rm -rf lab$(LAB).tar.gz \ | ||
jos.out $(wildcard jos.out.*) \ | ||
qemu.pcap $(wildcard qemu.pcap.*) | ||
|
||
distclean: realclean | ||
rm -rf conf/gcc.mk | ||
|
||
ifneq ($(V),@) | ||
GRADEFLAGS += -v | ||
endif | ||
|
||
grade: | ||
@echo $(MAKE) clean | ||
@$(MAKE) clean || \ | ||
(echo "'make clean' failed. HINT: Do you have another running instance of JOS?" && exit 1) | ||
./grade-lab$(LAB) $(GRADEFLAGS) | ||
|
||
handin: | ||
@if test -n "`git config remote.handin.url`"; then \ | ||
echo "Hand in to remote repository using 'git push handin HEAD' ..."; \ | ||
if ! git push -f handin HEAD; then \ | ||
echo ; \ | ||
echo "Hand in failed."; \ | ||
echo "As an alternative, please run 'make tarball'"; \ | ||
echo "and visit http://pdos.csail.mit.edu/6.828/submit/"; \ | ||
echo "to upload lab$(LAB)-handin.tar.gz. Thanks!"; \ | ||
false; \ | ||
fi; \ | ||
else \ | ||
echo "Hand-in repository is not configured."; \ | ||
echo "Please run 'make handin-prep' first. Thanks!"; \ | ||
false; \ | ||
fi | ||
|
||
handin-check: | ||
@if test "$$(git symbolic-ref HEAD)" != refs/heads/lab$(LAB); then \ | ||
git branch; \ | ||
read -p "You are not on the lab$(LAB) branch. Hand-in the current branch? [y/N] " r; \ | ||
test "$$r" = y; \ | ||
fi | ||
@if ! git diff-files --quiet || ! git diff-index --quiet --cached HEAD; then \ | ||
git status; \ | ||
echo; \ | ||
echo "You have uncomitted changes. Please commit or stash them."; \ | ||
false; \ | ||
fi | ||
@if test -n "`git ls-files -o --exclude-standard`"; then \ | ||
git status; \ | ||
read -p "Untracked files will not be handed in. Continue? [y/N] " r; \ | ||
test "$$r" = y; \ | ||
fi | ||
|
||
tarball: handin-check | ||
git archive --format=tar HEAD | gzip > lab$(LAB)-handin.tar.gz | ||
|
||
handin-prep: | ||
@./handin-prep | ||
|
||
|
||
# This magic automatically generates makefile dependencies | ||
# for header files included from C source files we compile, | ||
# and keeps those dependencies up-to-date every time we recompile. | ||
# See 'mergedep.pl' for more information. | ||
$(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d)) | ||
@mkdir -p $(@D) | ||
@$(PERL) mergedep.pl $@ $^ | ||
|
||
-include $(OBJDIR)/.deps | ||
|
||
always: | ||
@: | ||
|
||
.PHONY: all always \ | ||
handin tarball clean realclean distclean grade handin-prep handin-check |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# | ||
# Makefile fragment for the JOS kernel. | ||
# This is NOT a complete makefile; | ||
# you must run GNU make in the top-level directory | ||
# where the GNUmakefile is located. | ||
# | ||
|
||
OBJDIRS += boot | ||
|
||
BOOT_OBJS := $(OBJDIR)/boot/boot.o $(OBJDIR)/boot/main.o | ||
|
||
$(OBJDIR)/boot/%.o: boot/%.c | ||
@echo + cc -Os $< | ||
@mkdir -p $(@D) | ||
$(V)$(CC) -nostdinc $(KERN_CFLAGS) -Os -c -o $@ $< | ||
|
||
$(OBJDIR)/boot/%.o: boot/%.S | ||
@echo + as $< | ||
@mkdir -p $(@D) | ||
$(V)$(CC) -nostdinc $(KERN_CFLAGS) -c -o $@ $< | ||
|
||
$(OBJDIR)/boot/main.o: boot/main.c | ||
@echo + cc -Os $< | ||
$(V)$(CC) -nostdinc $(KERN_CFLAGS) -Os -c -o $(OBJDIR)/boot/main.o boot/main.c | ||
|
||
$(OBJDIR)/boot/boot: $(BOOT_OBJS) | ||
@echo + ld boot/boot | ||
$(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o [email protected] $^ | ||
$(V)$(OBJDUMP) -S [email protected] >[email protected] | ||
$(V)$(OBJCOPY) -S -O binary -j .text [email protected] $@ | ||
$(V)perl boot/sign.pl $(OBJDIR)/boot/boot | ||
|
Oops, something went wrong.