X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=solutions%2Fp3.patch;h=a62adfd8714e7c874f5cef8a180b2ba64d1714ee;hb=86695a3270e3d8c325488934383ba17fec4ce7aa;hp=3e7fb8ba63b619728ac53c63fc6f01574892078e;hpb=4e4e1224e6f9ee05aff0a95ab90ad197aeff9740;p=pintos-anon diff --git a/solutions/p3.patch b/solutions/p3.patch index 3e7fb8b..a62adfd 100644 --- a/solutions/p3.patch +++ b/solutions/p3.patch @@ -36,7 +36,7 @@ diff -u src/devices/timer.c~ src/devices/timer.c } /* Calibrates loops_per_tick, used to implement brief delays. */ -@@ -87,15 +92,36 @@ timer_elapsed (int64_t then) +@@ -93,16 +93,37 @@ return timer_ticks () - then; } @@ -52,7 +52,8 @@ diff -u src/devices/timer.c~ src/devices/timer.c + return a->wakeup_time < b->wakeup_time; +} + - /* Suspends execution for approximately TICKS timer ticks. */ + /* Sleeps for approximately TICKS timer ticks. Interrupts must + be turned on. */ void timer_sleep (int64_t ticks) { @@ -75,7 +76,7 @@ diff -u src/devices/timer.c~ src/devices/timer.c + sema_down (&t->timer_sema); } - /* Suspends execution for approximately MS milliseconds. */ + /* Sleeps for approximately MS milliseconds. Interrupts must be @@ -132,6 +158,16 @@ timer_interrupt (struct intr_frame *args { ticks++; @@ -105,7 +106,7 @@ diff -u src/threads/init.c~ src/threads/init.c +#include "vm/swap.h" /* Amount of physical memory, in 4 kB pages. */ - size_t ram_pages; + size_t init_ram_pages; @@ -124,6 +126,9 @@ main (void) filesys_init (format_filesys); #endif @@ -173,35 +174,27 @@ diff -u src/threads/thread.c~ src/threads/thread.c /* Stack frame for kernel_thread(). */ kf = alloc_frame (t, sizeof *kf); -@@ -253,16 +254,19 @@ thread_tid (void) +@@ -288,10 +289,11 @@ thread_tid (void) void thread_exit (void) { -+ struct thread *t = thread_current (); -+ ASSERT (!intr_context ()); + syscall_exit (); #ifdef USERPROG process_exit (); #endif -- -+ - /* Just set our status to dying and schedule another process. - We will be destroyed during the call to schedule_tail(). */ - intr_disable (); -- thread_current ()->status = THREAD_DYING; -+ t->status = THREAD_DYING; - schedule (); - NOT_REACHED (); - } -@@ -406,17 +410,28 @@ is_thread (struct thread *t) + + /* Remove thread from all threads list, set our status to dying, +@@ -406,23 +410,34 @@ is_thread (struct thread *t) /* Does basic initialization of T as a blocked thread named NAME. */ static void -init_thread (struct thread *t, const char *name, int priority) +init_thread (struct thread *t, const char *name, int priority, tid_t tid) { + enum intr_level old_level; + ASSERT (t != NULL); ASSERT (PRI_MIN <= priority && priority <= PRI_MAX); ASSERT (name != NULL); @@ -223,6 +216,10 @@ diff -u src/threads/thread.c~ src/threads/thread.c + list_init (&t->mappings); + t->next_handle = 2; t->magic = THREAD_MAGIC; + + old_level = intr_disable (); + list_push_back (&all_list, &t->allelem); + intr_set_level (old_level); } Index: src/threads/thread.h @@ -327,7 +324,7 @@ diff -u src/userprog/pagedir.c~ src/userprog/pagedir.c --- src/userprog/pagedir.c~ +++ src/userprog/pagedir.c @@ -35,15 +35,7 @@ pagedir_destroy (uint32_t *pd) - ASSERT (pd != base_page_dir); + ASSERT (pd != init_page_dir); for (pde = pd; pde < pd + pd_no (PHYS_BASE); pde++) if (*pde & PTE_P) - { @@ -818,10 +815,10 @@ diff -u src/userprog/syscall.c~ src/userprog/syscall.c +#include "userprog/process.h" +#include "userprog/pagedir.h" +#include "devices/input.h" ++#include "devices/shutdown.h" +#include "filesys/directory.h" +#include "filesys/filesys.h" +#include "filesys/file.h" -+#include "threads/init.h" #include "threads/interrupt.h" +#include "threads/malloc.h" +#include "threads/palloc.h" @@ -988,7 +985,7 @@ diff -u src/userprog/syscall.c~ src/userprog/syscall.c +static int +sys_halt (void) +{ -+ power_off (); ++ shutdown_power_off (); +} + +/* Exit system call. */ @@ -1452,7 +1449,7 @@ diff -u src/vm/frame.c~ src/vm/frame.c + + lock_init (&scan_lock); + -+ frames = malloc (sizeof *frames * ram_pages); ++ frames = malloc (sizeof *frames * init_ram_pages); + if (frames == NULL) + PANIC ("out of memory allocating page frames"); + @@ -1694,7 +1691,7 @@ diff -u src/vm/page.c~ src/vm/page.c + return false; + + /* Copy data into the frame. */ -+ if (p->sector != (disk_sector_t) -1) ++ if (p->sector != (block_sector_t) -1) + { + /* Get data from swap. */ + swap_in (p); @@ -1832,7 +1829,7 @@ diff -u src/vm/page.c~ src/vm/page.c + + p->frame = NULL; + -+ p->sector = (disk_sector_t) -1; ++ p->sector = (block_sector_t) -1; + + p->file = NULL; + p->file_offset = 0; @@ -1925,7 +1922,7 @@ diff -u src/vm/page.h~ src/vm/page.h +#define VM_PAGE_H + +#include -+#include "devices/disk.h" ++#include "devices/block.h" +#include "filesys/off_t.h" +#include "threads/synch.h" + @@ -1945,7 +1942,7 @@ diff -u src/vm/page.h~ src/vm/page.h + struct frame *frame; /* Page frame. */ + + /* Swap information, protected by frame->frame_lock. */ -+ disk_sector_t sector; /* Starting sector of swap area, or -1. */ ++ block_sector_t sector; /* Starting sector of swap area, or -1. */ + + /* Memory-mapped file information, protected by frame->frame_lock. */ + bool private; /* False to write back to file, @@ -1982,12 +1979,11 @@ diff -u src/vm/swap.c~ src/vm/swap.c +#include +#include "vm/frame.h" +#include "vm/page.h" -+#include "devices/disk.h" +#include "threads/synch.h" +#include "threads/vaddr.h" + -+/* The swap disk. */ -+static struct disk *swap_disk; ++/* The swap device. */ ++static struct block *swap_device; + +/* Used swap pages. */ +static struct bitmap *swap_bitmap; @@ -1996,20 +1992,21 @@ diff -u src/vm/swap.c~ src/vm/swap.c +static struct lock swap_lock; + +/* Number of sectors per page. */ -+#define PAGE_SECTORS (PGSIZE / DISK_SECTOR_SIZE) ++#define PAGE_SECTORS (PGSIZE / BLOCK_SECTOR_SIZE) + +/* Sets up swap. */ +void +swap_init (void) +{ -+ swap_disk = disk_get (1, 1); -+ if (swap_disk == NULL) ++ swap_device = block_get_role (BLOCK_SWAP); ++ if (swap_device == NULL) + { -+ printf ("no swap disk--swap disabled\n"); ++ printf ("no swap device--swap disabled\n"); + swap_bitmap = bitmap_create (0); + } + else -+ swap_bitmap = bitmap_create (disk_size (swap_disk) / PAGE_SECTORS); ++ swap_bitmap = bitmap_create (block_size (swap_device) ++ / PAGE_SECTORS); + if (swap_bitmap == NULL) + PANIC ("couldn't create swap bitmap"); + lock_init (&swap_lock); @@ -2024,13 +2021,13 @@ diff -u src/vm/swap.c~ src/vm/swap.c + + ASSERT (p->frame != NULL); + ASSERT (lock_held_by_current_thread (&p->frame->lock)); -+ ASSERT (p->sector != (disk_sector_t) -1); ++ ASSERT (p->sector != (block_sector_t) -1); + + for (i = 0; i < PAGE_SECTORS; i++) -+ disk_read (swap_disk, p->sector + i, -+ p->frame->base + i * DISK_SECTOR_SIZE); ++ block_read (swap_device, p->sector + i, ++ p->frame->base + i * BLOCK_SECTOR_SIZE); + bitmap_reset (swap_bitmap, p->sector / PAGE_SECTORS); -+ p->sector = (disk_sector_t) -1; ++ p->sector = (block_sector_t) -1; +} + +/* Swaps out page P, which must have a locked frame. */ @@ -2051,8 +2048,8 @@ diff -u src/vm/swap.c~ src/vm/swap.c + + p->sector = slot * PAGE_SECTORS; + for (i = 0; i < PAGE_SECTORS; i++) -+ disk_write (swap_disk, p->sector + i, -+ p->frame->base + i * DISK_SECTOR_SIZE); ++ block_write (swap_device, p->sector + i, ++ p->frame->base + i * BLOCK_SECTOR_SIZE); + + p->private = false; + p->file = NULL;