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
0 parents
commit f6824cc
Showing
123 changed files
with
14,747 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,39 @@ | ||
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 | ||
symbol-file obj/user/faultdie | ||
symbol-file obj/user/faultalloc | ||
symbol-file obj/user/forktree | ||
symbol-file obj/user/primes | ||
symbol-file obj/user/pingpong | ||
symbol-file obj/kern/kernel | ||
symbol-file obj/user/testfile | ||
symbol-file obj/user/init | ||
symbol-file obj/user/icode |
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,41 @@ | ||
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(). | ||
|
||
To set up the basic indentation style in Emacs, | ||
|
||
(c-add-style "jos" '("bsd" (indent-tabs-mode . t))) | ||
(add-hook 'c-mode-hook | ||
(lambda () | ||
(when (string-match "/lab/" buffer-file-name) (c-set-style "jos")))) |
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,222 @@ | ||
# | ||
# 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 | ||
|
||
-include conf/lab.mk | ||
|
||
-include conf/env.mk | ||
|
||
ifndef LABSETUP | ||
LABSETUP := ./ | ||
endif | ||
|
||
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) | ||
# QEMU's gdb stub command line changed in 0.11 | ||
QEMUGDB = $(shell if $(QEMU) -nographic -help | grep -q '^-gdb'; \ | ||
then echo "-gdb tcp::$(GDBPORT)"; \ | ||
else echo "-s -p $(GDBPORT)"; fi) | ||
|
||
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 | ||
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 += -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 | ||
|
||
|
||
|
||
|
||
# Include Makefrags for subdirectories | ||
include boot/Makefrag | ||
include kern/Makefrag | ||
include lib/Makefrag | ||
include user/Makefrag | ||
include fs/Makefrag | ||
|
||
|
||
IMAGES = $(OBJDIR)/kern/kernel.img $(OBJDIR)/fs/fs.img | ||
QEMUOPTS = -hda $(OBJDIR)/kern/kernel.img -hdb $(OBJDIR)/fs/fs.img -serial mon:stdio | ||
|
||
.gdbinit: .gdbinit.tmpl | ||
sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ | ||
|
||
qemu: $(IMAGES) | ||
$(QEMU) $(QEMUOPTS) | ||
|
||
qemu-nox: $(IMAGES) | ||
@echo "***" | ||
@echo "*** Use Ctrl-a x to exit qemu" | ||
@echo "***" | ||
$(QEMU) -nographic $(QEMUOPTS) | ||
|
||
qemu-gdb: $(IMAGES) .gdbinit | ||
@echo "***" | ||
@echo "*** Now run 'gdb'." 1>&2 | ||
@echo "***" | ||
$(QEMU) $(QEMUOPTS) -S $(QEMUGDB) | ||
|
||
qemu-nox-gdb: $(IMAGES) .gdbinit | ||
@echo "***" | ||
@echo "*** Now run 'gdb'." 1>&2 | ||
@echo "***" | ||
$(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) | ||
|
||
print-qemu: | ||
@echo $(QEMU) | ||
|
||
print-gdbport: | ||
@echo $(GDBPORT) | ||
|
||
print-qemugdb: | ||
@echo $(QEMUGDB) | ||
|
||
# For deleting the build | ||
clean: | ||
rm -rf $(OBJDIR) .gdbinit jos.in | ||
|
||
realclean: clean | ||
rm -rf lab$(LAB).tar.gz jos.out | ||
|
||
distclean: realclean | ||
rm -rf conf/gcc.mk | ||
|
||
grade: $(LABSETUP)grade-lab$(LAB).sh | ||
@echo $(MAKE) clean | ||
@$(MAKE) clean || \ | ||
(echo "'make clean' failed. HINT: Do you have another running instance of JOS?" && exit 1) | ||
$(MAKE) all | ||
sh $(LABSETUP)grade-lab$(LAB).sh | ||
|
||
handin: tarball | ||
@echo Please visit http://pdos.csail.mit.edu/cgi-bin/828handin | ||
@echo and upload lab$(LAB)-handin.tar.gz. Thanks! | ||
|
||
tarball: realclean | ||
tar cf - `find . -type f | grep -v '^\.*$$' | grep -v '/CVS/' | grep -v '/\.svn/' | grep -v '/\.git/' | grep -v 'lab[0-9].*\.tar\.gz'` | gzip > lab$(LAB)-handin.tar.gz | ||
|
||
# For test runs | ||
prep-%: | ||
$(V)rm -f $(OBJDIR)/kern/init.o $(IMAGES) | ||
$(V)$(MAKE) "DEFS=-DTEST=_binary_obj_user_$*_start -DTESTSIZE=_binary_obj_user_$*_size" $(IMAGES) | ||
$(V)rm -f $(OBJDIR)/kern/init.o | ||
|
||
run-%-nox-gdb: .gdbinit | ||
$(V)$(MAKE) --no-print-directory prep-$* | ||
$(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) | ||
|
||
run-%-gdb: .gdbinit | ||
$(V)$(MAKE) --no-print-directory prep-$* | ||
$(QEMU) $(QEMUOPTS) -S $(QEMUGDB) | ||
|
||
run-%-nox: | ||
$(V)$(MAKE) --no-print-directory prep-$* | ||
$(QEMU) -nographic $(QEMUOPTS) | ||
|
||
run-%: | ||
$(V)$(MAKE) --no-print-directory prep-$* | ||
$(QEMU) $(QEMUOPTS) | ||
|
||
# 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 |
Empty file.
Oops, something went wrong.