Commit graph

52 commits

Author SHA1 Message Date
Frans Kaashoek 7ccc5f5f4f Names of text are better. 2018-10-03 20:14:36 -04:00
Frans Kaashoek 343080f7ae Remove unused typedefs 2018-10-02 09:06:41 -04:00
Frans Kaashoek ec110149ed simplify layout pic 2018-10-02 08:50:05 -04:00
Frans Kaashoek a0389f707f Remove now unused PDX 2018-10-02 08:43:25 -04:00
Frans Kaashoek d448fd5e6c Simplify by freeing user part of addres pace in one page increments. This
undoes commit ffe444 and 052e18, which skipped page directories, but was
tailored to two-level page table.  Undoing doesn't seem to affect boottime for
xv6 visibly.
2018-10-02 08:40:01 -04:00
Frans Kaashoek a42b7d5dbb Simplify freeing page table 2018-10-02 08:12:01 -04:00
Frans Kaashoek 155c13b7f8 Avoid repition in walkpgdir 2018-10-02 07:37:49 -04:00
Frans Kaashoek ab0db651af Checkpoint port of xv6 to x86-64. Passed usertests on 2 processors a few times.
The x86-64 doesn't just add two levels to page tables to support 64 bit
addresses, but is a different processor. For example, calling conventions,
system calls, and segmentation are different from 32-bit x86. Segmentation is
basically gone, but gs/fs in combination with MSRs can be used to hold a
per-core pointer. In general, x86-64 is more straightforward than 32-bit
x86. The port uses code from sv6 and the xv6 "rsc-amd64" branch.

A summary of the changes is as follows:

- Booting: switch to grub instead of xv6's bootloader (pass -kernel to qemu),
because xv6's boot loader doesn't understand 64bit ELF files.  And, we don't
care anymore about booting.

- Makefile: use -m64 instead of -m32 flag for gcc, delete boot loader, xv6.img,
bochs, and memfs. For now dont' use -O2, since usertests with -O2 is bigger than
MAXFILE!

- Update gdb.tmpl to be for i386 or x86-64

- Console/printf: use stdarg.h and treat 64-bit addresses different from ints
  (32-bit)

- Update elfhdr to be 64 bit

- entry.S/entryother.S: add code to switch to 64-bit mode: build a simple page
table in 32-bit mode before switching to 64-bit mode, share code for entering
boot processor and APs, and tweak boot gdt.  The boot gdt is the gdt that the
kernel proper also uses. (In 64-bit mode, the gdt/segmentation and task state
mostly disappear.)

- exec.c: fix passing argv (64-bit now instead of 32-bit).

- initcode.c: use syscall instead of int.

- kernel.ld: load kernel very high, in top terabyte.  64 bits is a lot of
address space!

- proc.c: initial return is through new syscall path instead of trapret.

- proc.h: update struct cpu to have some scratch space since syscall saves less
state than int, update struct context to reflect x86-64 calling conventions.

- swtch: simplify for x86-64 calling conventions.

- syscall: add fetcharg to handle x86-64 calling convetions (6 arguments are
passed through registers), and fetchaddr to read a 64-bit value from user space.

- sysfile: update to handle pointers from user space (e.g., sys_exec), which are
64 bits.

- trap.c: no special trap vector for sys calls, because x86-64 has a different
plan for system calls.

- trapasm: one plan for syscalls and one plan for traps (interrupt and
exceptions). On x86-64, the kernel is responsible for switching user/kernel
stacks. To do, xv6 keeps some scratch space in the cpu structure, and uses MSR
GS_KERN_BASE to point to the core's cpu structure (using swapgs).

- types.h: add uint64, and change pde_t to uint64

- usertests: exit() when fork fails, which helped in tracking down one of the
bugs in the switch from 32-bit to 64-bit

- vectors: update to make them 64 bits

- vm.c: use bootgdt in kernel too, program MSRs for syscalls and core-local
state (for swapgs), walk 4 levels in walkpgdir, add DEVSPACETOP, use task
segment to set kernel stack for interrupts (but simpler than in 32-bit mode),
add an extra argument to freevm (size of user part of address space) to avoid
checking all entries till KERNBASE (there are MANY TB before the top 1TB).

- x86: update trapframe to have 64-bit entries, which is what the processor
pushes on syscalls and traps.  simplify lgdt and lidt, using struct desctr,
which needs the gcc directives packed and aligned.

TODO:
- use int32 instead of int?
- simplify curproc(). xv6 has per-cpu state again, but this time it must have it.
- avoid repetition in walkpgdir
- fix validateint() in usertests.c
- fix bugs (e.g., observed one a case of entering kernel with invalid gs or proc
2018-09-23 08:35:30 -04:00
Frans Kaashoek 2c73068e82 Delete a patch
Adjust typesetting of code
2018-08-30 15:45:16 -04:00
Frans Kaashoek 76d4005f9e thanks mtasm 2018-08-30 14:10:27 -04:00
Frans Kaashoek 210a0f0b30 Remove unused flags (thanks Wolfgang Keller) 2018-08-30 13:14:01 -04:00
Robert Morris 4638cabf8c fix runoff complaints about pagination and long lines 2017-08-29 14:11:59 -04:00
Frans Kaashoek ed396c068b Eliminate code for gs trick to track per-cpu state. We rely on lapiccpunum()
to find a per-cpu id with which we locate a cpu's cpu struct.
2017-02-01 18:04:13 -05:00
Frans Kaashoek 7894fcd217 Remove trailing white space with:
for f in *.{h,c}; do sed -i .sed 's/[[:blank:]]*$//' $f; done
(Thanks to Nicolás Wolovick)
2016-08-25 09:13:00 -04:00
Robert Morris 858475e4df tiny clarifications to some gdt code. 2016-08-10 10:51:14 -04:00
Stephen Tu ff2783442e Correct a security bug in copyuvm()
copyuvm() should not allow new copied pages to inherit more
permissions than the original pages.
2013-03-04 16:16:54 -05:00
Frans Kaashoek e25b74ca80 Fix layout issues for printed version 2011-09-01 10:25:20 -04:00
Austin Clements a7061b4f97 Style nits; indentation and tabs 2011-08-29 16:12:01 -04:00
Frans Kaashoek c3dcf47966 Clean up memlayout.h
Get rid of last instances of linear address and "la"
Get ready for detecting physical memory dynamically
2011-08-16 15:47:22 -04:00
Frans Kaashoek 9449646853 Use 4Mbyte pages during boot 2011-08-15 17:41:58 -04:00
Frans Kaashoek a56c8d609b One definition of several macros and constants 2011-08-08 13:30:08 -04:00
Frans Kaashoek 9aa0337dc1 Map kernel high
Very important to give qemu memory through PHYSTOP :(
2011-07-29 07:31:27 -04:00
Russ Cox 1a81e38b17 make new code like old code
Variable declarations at top of function,
separate from initialization.

Use == 0 instead of ! for checking pointers.

Consistent spacing around {, *, casts.

Declare 0-parameter functions as (void) not ().

Integer valued functions return -1 on failure, 0 on success.
2011-01-11 13:01:13 -05:00
Austin Clements 7914ab7214 Page breaking of mmu.h 2010-08-31 16:54:50 -04:00
Austin Clements b5592b4d2f Start PDE defs on new page 2010-08-31 16:47:50 -04:00
Robert Morris 7d7dc9331b kalloc/kfree now only a page at a time
do not keep sorted contiguous free list
2010-08-31 12:54:47 -04:00
Robert Morris c4cc10da7e fix corner cases in exec of ELF
put an invalid page below the stack
have fork() handle invalid pages
2010-08-06 11:12:18 -04:00
Robert Morris c99599784e remove some unused vm #defines
fix corner cases with alignment when mapping kernel ELF file
2010-08-05 16:00:59 -04:00
Robert Morris eb18645f17 fix allocuvm() to handle sbrk() with non-page-granularity argument
(maybe this never worked, but it works now)
2010-08-05 12:10:54 -04:00
Frans Kaashoek 30f5bf0548 some cleanup 2010-07-25 20:30:21 -04:00
Frans Kaashoek 40889627ba Initial version of single-cpu xv6 with page tables 2010-07-02 14:51:53 -04:00
Russ Cox 48755214c9 assorted fixes:
* rename c/cp to cpu/proc
 * rename cpu.context to cpu.scheduler
 * fix some comments
 * formatting for printout
2009-08-30 23:02:08 -07:00
Russ Cox b8912d999f mmu.h: unused SEG_NULL 2009-07-11 19:26:29 -07:00
rsc 0fe118f3f6 don't call it ss - that's the stack segment 2007-09-27 16:47:50 +00:00
rsc cce27ba9fb formatting 2007-08-14 19:41:38 +00:00
rsc 3fd50978a8 spacing 2007-08-08 09:12:53 +00:00
rsc b6dc6187f7 add DPL_USER constant 2007-08-08 09:02:42 +00:00
rsc 3c821bf9ae better comment 2006-09-07 16:54:15 +00:00
rsc 0cfc7290e8 wrap long lines 2006-09-06 19:08:14 +00:00
rsc f552738889 no /* */ comments 2006-09-06 17:50:20 +00:00
rsc 9e9bcaf143 standardize various * conventions 2006-09-06 17:27:19 +00:00
rsc a650c606fe spacing fixes: no tabs, 2-space indents (for rtm) 2006-09-06 17:04:06 +00:00
kaashoek 801affcd14 centralize credits 2006-09-03 15:10:33 +00:00
rtm dfcc5b997c prune unneeded panics and debug output 2006-08-29 19:06:37 +00:00
rtm 5be0039ce9 interrupts could be recursive since lapic_eoi() called before rti
so fast interrupts overflow the kernel stack
fix: cli() before lapic_eoi()
2006-08-10 22:08:14 +00:00
rtm 11a9947f1a bread
iget
mkfs makes a file system image
put this in your .bochsrc:
ata0-slave: type=disk, mode=flat, path="fs.img", cylinders=1024, heads=1, spt=1
2006-07-21 13:18:04 +00:00
rtm 2927081628 uint32_t -> uint &c 2006-07-20 09:07:53 +00:00
rsc b5f17007f4 standarize on unix-like lowercase struct names 2006-07-17 01:58:13 +00:00
rsc b5ee516575 add uint and standardize on typedefs instead of unsigned 2006-07-17 01:52:13 +00:00
rsc 564f787e91 Eliminate annoying Pseudodesc structure.
Eliminate unnecessary parts of mmu.h.
2006-07-16 16:55:52 +00:00