Commit graph

1454 commits

Author SHA1 Message Date
Frans Kaashoek 322990649b x 2018-09-29 08:29:34 -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 b818915f79 Update name
Use generic 6.828 url (without year)
2018-09-02 08:33:55 -04:00
Frans Kaashoek 308a3b88c9 thanks tyfkda 2018-08-31 09:21:19 -04:00
Frans Kaashoek 343255189e thanks Wolfgang Keller 2018-08-31 08:41:23 -04:00
Frans Kaashoek 80f70c46df x 2018-08-30 16:20:16 -04:00
Frans Kaashoek 1d19081efb Allow holding to be called with interrupts enabled (for Mark Morrissey). 2018-08-30 16:14:34 -04:00
Frans Kaashoek 2c73068e82 Delete a patch
Adjust typesetting of code
2018-08-30 15:45:16 -04:00
Frans Kaashoek e559fd2c5a x 2018-08-30 14:47:07 -04:00
Frans Kaashoek f30488793b x 2018-08-30 14:16:29 -04:00
Frans Kaashoek 76d4005f9e thanks mtasm 2018-08-30 14:10:27 -04:00
Frans Kaashoek 6710e5589d thanks wxdao 2018-08-30 13:48:47 -04:00
Frans Kaashoek 96e4e2f4d1 thanks eyalz800 2018-08-30 13:46:48 -04:00
Frans Kaashoek 8f63beaacb vectors.pl is executable and asks shell for perl 2018-08-30 13:36:07 -04:00
Frans Kaashoek 171c2cc6b8 thanks mataness 2018-08-30 13:30:50 -04:00
Frans Kaashoek 26108a3b99 thanks tyfkda 2018-08-30 13:27:57 -04:00
Frans Kaashoek 7f3528bcb3 x 2018-08-30 13:25:54 -04:00
Frans Kaashoek 210a0f0b30 Remove unused flags (thanks Wolfgang Keller) 2018-08-30 13:14:01 -04:00
Frans Kaashoek b2ca8e3e23 x 2018-08-30 13:09:03 -04:00
Frans Kaashoek 960a94fb87 x 2018-08-30 12:12:16 -04:00
Frans Kaashoek 0b86d03767 Because sleeplocks replaced B_BUSY the holding test can
be more specific (thanks Mark Morrissey)
2018-08-30 11:57:46 -04:00
Frans Kaashoek 0b6f4c08b9 x 2018-08-30 11:42:10 -04:00
Robert Morris 0754d21c86 stricter log consumption by write() 2017-10-24 08:49:31 -04:00
Robert Morris 1ab23170a1 improve swtch comment 2017-10-08 07:12:31 -04:00
Robert Morris 4638cabf8c fix runoff complaints about pagination and long lines 2017-08-29 14:11:59 -04:00
Frans Kaashoek 164f4bae54 thx 2017-08-10 07:09:53 -04:00
Frans Kaashoek 3e392c7288 Update comment to reflect xv6 doesn't have per-cpu segments anymore 2017-08-09 15:21:42 -04:00
Robert Morris 6389d9d410 nothing much 2017-08-09 14:16:55 -04:00
Frans Kaashoek 4f14d8d1e5 Commit to running on an SMP (perhaps with only 1 core). Remove most code
from picirq.c and remove timer.c completely.  Update runoff.list.
2017-08-09 07:44:51 -04:00
Robert Morris 70705966ad comment fixes 2017-08-09 06:54:45 -04:00
Frans Kaashoek da3b931ddb Thanks Anton Burtsev <aburtsev@uci.edu> 2017-08-08 19:42:51 -04:00
Robert Morris a4ee6f7de3 fix iput() to more obviously avoid deadlock 2017-08-08 14:19:54 -04:00
Robert Morris 1c7aa96005 a little more lock documentation 2017-08-08 14:12:25 -04:00
Robert Morris 70d912b332 protect ip->valid and ip->nlink with sleep lock in iput() 2017-08-08 13:48:48 -04:00
Robert Morris 3375df5061 change ip->flags&I_VALID to ip->valid 2017-08-08 13:34:13 -04:00
Robert Morris 14270288b7 Merge branch 'master' of g.csail.mit.edu:xv6-dev 2017-08-08 13:27:06 -04:00
Robert Morris aba8423c4a frans' fixes to iput() 2017-08-08 13:26:57 -04:00
Robert Morris 9cec455b17 fs comment nits 2017-08-08 13:24:38 -04:00
Frans Kaashoek 825ce074b1 Remove some debugging statements 2017-08-07 15:15:18 -04:00
Frans Kaashoek 61cb32aa9b Merge branch 'nogs' 2017-08-07 14:35:05 -04:00
Frans Kaashoek 5cbccef811 Merge branch 'patch-1' of https://github.com/aliceinwire/xv6-public 2017-08-07 13:44:03 -04:00
Frans Kaashoek 0249311675 Merge branch 'patch-1' of https://github.com/Saarett/xv6-public 2017-08-07 13:29:11 -04:00
Grant Wu 61f26e3c97 Fix typo in dirlookup 2017-04-26 19:56:51 -07:00
Alice Ferrazzi 1fb2ea8890 Update LICENSE
updated copyright year
2017-02-27 13:12:59 +09: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 c9fa90f7e5 A tiny bit of clean up (e.g., move code searching cpu array from lapic.c into
mycpu() in proc.c.
2017-02-01 20:36:41 -05:00
Frans Kaashoek 2e2d14c235 use panic 2017-02-01 19:21:43 -05:00
Frans Kaashoek 7c00ce8110 shorten comment 2017-02-01 19:18:47 -05: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