Commit graph

90 commits

Author SHA1 Message Date
Frans Kaashoek a7ca32e3a3 Change mycpu() to use %gs. 2018-10-09 20:22:48 -04:00
Frans Kaashoek 704775b63d Make names line up with text 2018-10-04 09:21:36 -04:00
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 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 171c2cc6b8 thanks mataness 2018-08-30 13:30:50 -04:00
Robert Morris 4638cabf8c fix runoff complaints about pagination and long lines 2017-08-29 14:11:59 -04:00
Frans Kaashoek 61cb32aa9b Merge branch 'nogs' 2017-08-07 14:35:05 -04:00
Saarett 03b3086327 Free pgdir in setupkvm in case of mappages failure
There is a potential memory leak when mappages() fails inside setupkvm().
A call to freevm() is added in this case so as to reclaim the lost mapping pages.
2017-02-05 12:44:56 +02: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 fbb4c09444 Read curproc from cpu structure, but be careful because after a schedule event
myproc() points to a different thread.

   myproc();
   sched();
   myproc();  // this proc maybe different than the one before sched

Thus, in a function that operates on one thread better to retrieve the
current process once at the start of the function.
2017-01-31 20:21:14 -05:00
Frans Kaashoek abf847a083 Start of an experiment to remove the use of gs for cpu local variables. 2017-01-31 17:47:16 -05:00
Peter Froehlich 8d1f99637a Fix long-standing switchuvm() inconsistency.
switchuvm() is supposed to switch the TSS and page table to the
process p it is passed. Alas, instead of using p to access the
kstack field, it used the global proc. This worked fine because
(a) most uses of switchuvm() pass proc anyway and (b) because in
the schedule, where we call switchuvm with the newly scheduled
process, we actually set the global proc before the call. But I
think it's still a bug, even if it never broke a test case. :-)
2017-01-30 19:31:24 -05:00
Cody Cutler ffe444926e fix possible memory leak in deallocuvm
when a zero PDE is encountered while searching for present PTEs to free,
resume searching at first entry of the next page table instead of the
current entry of the next page table.
2016-09-26 12:34:08 -04:00
Robert Morris 4b2152cc2d curproc -> proc in a comment 2016-09-01 17:21:37 -04:00
Frans Kaashoek 37939f24c2 better comment 2016-08-26 08:46:13 -04:00
Frans Kaashoek aff0c8d5c7 set iomb to forbid i/o instructions from user space
add to test that they indeed trap in user space
thanks to pablogventura@gmail.com and nwolovick@gmail.com
2016-08-26 08:20:11 -04: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 a7c03bd914 p2v -> P2V 2016-08-24 13:40:06 -04:00
Robert Morris 9c65b32d9e nothing much 2016-08-11 15:41:53 -04:00
Robert Morris 858475e4df tiny clarifications to some gdt code. 2016-08-10 10:51:14 -04:00
Robert Morris 0a4a4230a3 shell nits
fix Regehr complaint
2016-08-08 13:06:38 -04:00
Frans Kaashoek 74c77da6f8 Nice layout for a printout of the code 2014-08-29 17:06:49 -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
Robert Morris 792d83cad1 nits 2012-08-28 14:11:23 -04:00
Frans Kaashoek 3fb7eceea7 Runoff still complaints these lines are too long, but it is now ok on printout 2012-08-22 21:24:13 -04:00
Frans Kaashoek 4ce832ddd2 Remove unused argument to setupkvm (thanks to Peter Froehlich) 2012-08-22 20:19:37 -04:00
Robert Morris c092540e39 eliminate enter_alloc -- use kalloc for everything 2011-09-13 13:14:52 -04:00
Robert Morris 7e7cb106d0 more regular kmap[] and description 2011-09-13 12:28:45 -04:00
Austin Clements dd4438b4fe Nuke data.S, since we do have a custom linker script. 2011-09-02 14:51:55 -04:00
Austin Clements 6f3ca059f2 Oops, dropped a paren 2011-09-02 14:37:42 -04:00
Austin Clements 2eb214c9db clear_pte_u -> clearpteu 2011-09-02 14:37:04 -04:00
Austin Clements 91aa0f3296 Move copy_pte_u; fits vm.c in one less column and aligns proc.h 2011-09-02 14:35:58 -04:00
Austin Clements 9e4272c14e Cleanup comments and fit setupkvm on same page as kmap, which aligns lots of other things 2011-09-02 14:34:29 -04:00
Austin Clements 14835ec987 Style 2011-09-02 14:28:44 -04:00
Austin Clements cf7b670293 Make mappages fit on the page 2011-09-02 14:11:16 -04:00
Austin Clements 052e18485d Skip missing page directories in deallocuvm
Previously, deallocuvm scanned from 0 to KERNBASE in one page
increments, which had a noticable effect on boot time.  Now it skips
over missing page directories.
2011-09-01 21:29:09 -04:00
Robert Morris 371ab7fa96 inaccessible page under the user stack page, to help exec deal w/ too-large args 2011-09-01 13:25:34 -04:00
Robert Morris 62e3b8a92c Merge branch 'master' of git+ssh://amsterdam.csail.mit.edu/home/am0/6.828/xv6
Conflicts:
	vm.c
2011-09-01 12:03:49 -04:00
Robert Morris 5a23692444 fix usertests to correctly test what happens when you call
exec() with arguments that don't fit on a single page.
2011-09-01 12:02:49 -04: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 6f2327580f Eliminate USERTOP; no use for it. 2011-08-24 10:24:40 -04:00
Frans Kaashoek 5f069dcf2f Switch back to #define for PHYSTOP. Using the E820 to retrieve the memory map is too complicated (must be done in 16-bit real-mode, probably enlarged bootblock beyond 512 bytes, and a #define requires less explanation). 2011-08-16 20:23:17 -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 d9818bdd7d Make Austin happier
2011
2011-08-15 20:21:14 -04:00
Frans Kaashoek a4b213cf49 Avoid "boot" in xv6 2011-08-15 20:11:13 -04:00