/* Make a copy of FILENAME.
Otherwise there's a race between the caller and load(). */
- fn_copy = palloc_get (0);
+ fn_copy = palloc_get_page (0);
if (fn_copy == NULL)
return TID_ERROR;
strlcpy (fn_copy, filename, PGSIZE);
/* Create a new thread to execute FILENAME. */
tid = thread_create (filename, PRI_DEFAULT, execute_thread, fn_copy);
if (tid == TID_ERROR)
- palloc_free (fn_copy);
+ palloc_free_page (fn_copy);
return tid;
}
success = load (filename, &if_.eip, &if_.esp);
/* If load failed, quit. */
- palloc_free (filename);
+ palloc_free_page (filename);
if (!success)
thread_exit ();
NOT_REACHED ();
}
-/* Destroys the user address space in T and frees all of its
- resources. */
+/* Free the current process's resources. */
void
-process_destroy (struct thread *t)
+process_exit (void)
{
- ASSERT (t != thread_current ());
-
- if (t->pagedir != NULL)
+ struct thread *cur = thread_current ();
+ uint32_t *pd;
+
+ /* Destroy the current process's page directory and switch back
+ to the kernel-only page directory. We have to set
+ cur->pagedir to NULL before switching page directories, or a
+ timer interrupt might switch back to the process page
+ directory. */
+ pd = cur->pagedir;
+ if (pd != NULL)
{
- pagedir_destroy (t->pagedir);
- t->pagedir = NULL;
+ cur->pagedir = NULL;
+ pagedir_activate (NULL);
+ pagedir_destroy (pd);
}
}
{
struct thread *t = thread_current ();
- /* Activate T's page tables. */
+ /* Activate thread's page tables. */
pagedir_activate (t->pagedir);
- /* Set T's kernel stack for use in processing interrupts. */
+ /* Set thread's kernel stack for use in processing
+ interrupts. */
tss_set_esp0 ((uint8_t *) t + PGSIZE);
}
\f
file into the page and zero the rest. */
size_t read_bytes = filesz_left >= PGSIZE ? PGSIZE : filesz_left;
size_t zero_bytes = PGSIZE - read_bytes;
- uint8_t *kpage = palloc_get (PAL_USER);
+ uint8_t *kpage = palloc_get_page (PAL_USER);
if (kpage == NULL)
return false;
/* Do the reading and zeroing. */
if (file_read (file, kpage, read_bytes) != (int) read_bytes)
{
- palloc_free (kpage);
+ palloc_free_page (kpage);
return false;
}
memset (kpage + read_bytes, 0, zero_bytes);
/* Add the page to the process's address space. */
if (!install_page (upage, kpage))
{
- palloc_free (kpage);
+ palloc_free_page (kpage);
return false;
}
}
uint8_t *kpage;
bool success = false;
- kpage = palloc_get (PAL_USER | PAL_ZERO);
+ kpage = palloc_get_page (PAL_USER | PAL_ZERO);
if (kpage != NULL)
{
success = install_page (((uint8_t *) PHYS_BASE) - PGSIZE, kpage);
if (success)
*esp = PHYS_BASE;
else
- palloc_free (kpage);
+ palloc_free_page (kpage);
}
else
printf ("failed to allocate process stack\n");