diff options
author | Neal H. Walfield <neal@gnu.org> | 2007-12-04 18:12:22 +0000 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gnu.org> | 2009-04-07 23:11:09 +0200 |
commit | 5be781e6a2096dc2011720156c31790b8fac0df6 (patch) | |
tree | 4f0b67f77dcefebd00dee3733188bf7326a84799 | |
parent | d438eed871f875dcf4676b83c3d3ae62f32f491a (diff) |
viengoos/
2007-12-04 Neal H. Walfield <neal@gnu.org>
Remove exception threads. Replace with support for activations.
* thread.h (THREAD_SLOTS): Bump to 3.
(struct thread): Add field exception_page. Remove fields
have_exception and exception.
(thread_exregs): Take additional arguments exception_page and
exception_page_out. Update users.
(thread_raise_exception): New declaration.
* thread.c (THREAD_VERSION): Define.
(thread_init): Remove code related to the exception thread.
(thread_commission): Likewise.
(thread_decommission): Likewise.
(thread_exregs): Likewise. Take additional arguments
EXCEPTION_PAGE and EXCEPTION_PAGE_OUT. If CONTROL contains
HURD_EXREGS_GET_REGS and EXCEPTION_PAGE_OUT is not NULL, return a
capability to THREAD's exception page in *EXCEPTION_PAGE_OUT. If
CONTROL contains HURD_EXREGS_SET_EXCEPTION_PAGE, then set THREAD's
exception page to EXCEPTION_PAGE.
(thread_raise_exception): New function.
* server.c (server_loop): Remove code related to handling the
exception thread. Call thread_raise_exception to propagate
exception. Reimplement the exception_collect method. Update
implementation of the thread_exregs method to support the new
argument passing scheme. Add support for setting and retrieving
the exception page.
(REPLYW): Only clear MSG here.
* rm.h (exception_collect): Take an additional argument, the
principal.
* object.h (object_type): New function.
hurd/
2007-12-04 Neal H. Walfield <neal@gnu.org>
Remove exception threads. Replace with support for activations.
* thread.h: Include <l4/ipc.h>.
(struct exception_page): New structure.
(THREAD_EXCEPTION_PAGE_SLOT): Define.
(HURD_EXREGS_EXCEPTION_THREAD): Don't define.
(HURD_EXREGS_SET_EXCEPTION_PAGE): Define.
(HURD_EXREGS_SET_REGS): Update.
(hurd_exception_handler_t): New definition.
(struct hurd_thread_exregs_in): New structure.
(struct hurd_thread_exregs_out): New structure.
(thread_exregs): Replace the bulk of the arguments with struct
hurd_thread_exregs_in and struct hurd_thread_exregs_out. Update
users.
* exceptions.h (HURD_THREAD_MAIN_VERSION): Remove macro.
(HURD_THREAD_EXCEPTION_VERSION): Likewise.
(hurd_thread_is_exception_thread): Remove function.
(hurd_thread_is_main_thread): Likewise.
(hurd_exception_thread): Likewise.
(hurd_main_thread): Likewise.
(exception_handler_loop): Remove declaration.
(exception_handler): New declaration.
(exception_handler_entry): Likewise.
(exception_handler_end): Likewise.
libhurd-mm/
2007-12-04 Neal H. Walfield <neal@gnu.org>
Remove exception threads. Replace with support for activations.
* Makefile.am (ARCH_SOURCES): New variable.
[ARCH_IA32]: Add ia32-exception-entry.S.
(libhurd_mm_a_SOURCES): Add $(ARCH_SOURCES).
* ia32-exception-entry.S: New file.
* exceptions.c: Include <hurd/storage.h> and <hurd/thread.h>.
(ARG): Don't define.
(ARG64): Likewise.
(ARG_ADDR): Likewise.
(CHECK): Likewise.
(exception_handler_loop): Remove function.
(exception_fetch_exception): New function.
(exception_handler): New function.
(STACK_SIZE): Don't define.
(stack): Don't declare.
(exception_handler_init): Set up the thread's exception page.
libpthread/
2007-12-04 Neal H. Walfield <neal@gnu.org>
Remove exception threads. Replace with support for activations.
* sysdeps/l4/hurd/pt-sysdep.h (PTHREAD_SYSDEP_MEMBERS): Remove
fields exception_handler_stack and exception_handler_sp. Add
field exception_page.
* sysdeps/l4/hurd/pt-thread-alloc.c (__pthread_thread_alloc):
Allocate a page for THREAD->EXCEPTION_PAGE, not
THREAD->EXCEPTION_HANDLER_STACK.
* sysdeps/l4/hurd/ia32/pt-setup.c: Include <hurd/thread.h> and
<hurd/exceptions.h>.
(__pthread_setup): Remove code dealing with the exception thread.
Set up the exception page.
* sysdeps/l4/hurd/pt-thread-start.c (__pthread_thread_start):
Remove code dealing with the exception thread. Update to use new
rm_thread_exregs interface. Also set the thread's exception page.
* sysdeps/l4/hurd/pt-thread-halt.c (__pthread_thread_halt): Remove
code to dealing with the exception thread. Free the
THREAD->EXCEPTION_PAGE.
ruth/
2007-12-04 Neal H. Walfield <neal@gnu.org>
* ruth.c (main): Update to use new rm_thread_exregs interface.
-rw-r--r-- | sysdeps/l4/hurd/ia32/pt-setup.c | 22 | ||||
-rw-r--r-- | sysdeps/l4/hurd/pt-sysdep.h | 3 | ||||
-rw-r--r-- | sysdeps/l4/hurd/pt-thread-alloc.c | 4 | ||||
-rw-r--r-- | sysdeps/l4/hurd/pt-thread-halt.c | 25 | ||||
-rw-r--r-- | sysdeps/l4/hurd/pt-thread-start.c | 41 |
5 files changed, 38 insertions, 57 deletions
diff --git a/sysdeps/l4/hurd/ia32/pt-setup.c b/sysdeps/l4/hurd/ia32/pt-setup.c index a179bdfd..800d5b1b 100644 --- a/sysdeps/l4/hurd/ia32/pt-setup.c +++ b/sysdeps/l4/hurd/ia32/pt-setup.c @@ -20,6 +20,8 @@ #include <l4.h> #include <pt-internal.h> +#include <hurd/thread.h> +#include <hurd/exceptions.h> /* The stack layout used on the i386 is: @@ -63,14 +65,20 @@ __pthread_setup (struct __pthread *thread, thread->mcontext.pc = entry_point; thread->mcontext.sp = stack_setup (thread, start_routine, arg); + if (__pthread_num_threads == 1) + return 0; - if (__pthread_num_threads != 1) - { - assert (! ADDR_IS_VOID (thread->exception_handler_stack.addr)); - thread->exception_handler_sp - = ADDR_TO_PTR (addr_extend (thread->exception_handler_stack.addr, - 0, PAGESIZE_LOG2)); - } + assert (! ADDR_IS_VOID (thread->exception_page.addr)); + + struct exception_page *exception_page + = ADDR_TO_PTR (addr_extend (thread->exception_page.addr, + 0, PAGESIZE_LOG2)); + + /* SP is set to the end of the exception page. */ + exception_page->exception_handler_sp = (l4_word_t) exception_page + PAGESIZE; + + exception_page->exception_handler_ip = (l4_word_t) &exception_handler_entry; + exception_page->exception_handler_end = (l4_word_t) &exception_handler_end; return 0; } diff --git a/sysdeps/l4/hurd/pt-sysdep.h b/sysdeps/l4/hurd/pt-sysdep.h index 1c51731c..5c66330e 100644 --- a/sysdeps/l4/hurd/pt-sysdep.h +++ b/sysdeps/l4/hurd/pt-sysdep.h @@ -33,8 +33,7 @@ #define PTHREAD_SYSDEP_MEMBERS \ struct storage object; \ l4_thread_id_t threadid; \ - struct storage exception_handler_stack; \ - l4_word_t exception_handler_sp; \ + struct storage exception_page; \ l4_word_t my_errno; extern inline struct __pthread * diff --git a/sysdeps/l4/hurd/pt-thread-alloc.c b/sysdeps/l4/hurd/pt-thread-alloc.c index 2a421995..9e2bc2a3 100644 --- a/sysdeps/l4/hurd/pt-thread-alloc.c +++ b/sysdeps/l4/hurd/pt-thread-alloc.c @@ -55,7 +55,7 @@ __pthread_thread_alloc (struct __pthread *thread) if (ADDR_IS_VOID (storage.addr)) return EAGAIN; - thread->exception_handler_stack = storage; + thread->exception_page = storage; storage = storage_alloc (meta_data_activity, cap_thread, @@ -63,7 +63,7 @@ __pthread_thread_alloc (struct __pthread *thread) STORAGE_MEDIUM_LIVED, ADDR_VOID); if (ADDR_IS_VOID (storage.addr)) { - storage_free (thread->exception_handler_stack.addr, false); + storage_free (thread->exception_page.addr, false); return EAGAIN; } diff --git a/sysdeps/l4/hurd/pt-thread-halt.c b/sysdeps/l4/hurd/pt-thread-halt.c index c6ae76f5..4aa112b1 100644 --- a/sysdeps/l4/hurd/pt-thread-halt.c +++ b/sysdeps/l4/hurd/pt-thread-halt.c @@ -30,8 +30,8 @@ static struct storage saved_object; void __pthread_thread_halt (struct __pthread *thread, int need_dealloc) { - struct storage exception_handler_stack = thread->exception_handler_stack; - thread->exception_handler_stack.addr = ADDR_VOID; + struct storage exception_page = thread->exception_page; + thread->exception_page.addr = ADDR_VOID; struct storage object = thread->object; l4_thread_id_t tid = thread->threadid; @@ -46,24 +46,9 @@ __pthread_thread_halt (struct __pthread *thread, int need_dealloc) saved_object.addr = ADDR_VOID; } - /* Stop the exception handler thread. */ - l4_word_t dummy = 0; - error_t err = rm_thread_exregs (ADDR_VOID, object.addr, - HURD_EXREGS_EXCEPTION_THREAD - | HURD_EXREGS_STOP | HURD_EXREGS_ABORT_IPC, - ADDR_VOID, - 0, (struct cap_addr_trans) CAP_ADDR_TRANS_VOID, - ADDR_VOID, - 0, 0, 0, 0, - ADDR_VOID, ADDR_VOID, - &dummy, &dummy, &dummy, &dummy); - if (err) - panic ("Error stopping exception thread."); - - /* Free its stack. */ - assert (! ADDR_IS_VOID (exception_handler_stack.addr)); - storage_free (exception_handler_stack.addr, false); - exception_handler_stack.addr = ADDR_VOID; + /* Free the exception page. */ + assert (! ADDR_IS_VOID (exception_page.addr)); + storage_free (exception_page.addr, false); if (tid == l4_myself ()) /* If we try to storage_free (storage.addr), we will freeze in the diff --git a/sysdeps/l4/hurd/pt-thread-start.c b/sysdeps/l4/hurd/pt-thread-start.c index ae5dfa8c..f2d7ef59 100644 --- a/sysdeps/l4/hurd/pt-thread-start.c +++ b/sysdeps/l4/hurd/pt-thread-start.c @@ -35,45 +35,34 @@ __pthread_thread_start (struct __pthread *thread) { assert (__pthread_total == 1); assert (l4_is_thread_equal (l4_myself (), thread->threadid)); - l4_set_user_defined_handle_of (hurd_exception_thread (l4_myself ()), - (l4_word_t) thread); l4_set_user_defined_handle ((l4_word_t) thread); } else { - struct cap_addr_trans addr_trans = CAP_ADDR_TRANS_VOID; + struct hurd_thread_exregs_in in; + struct hurd_thread_exregs_out out; - /* First, start the exception thread. */ - l4_word_t dummy; - err = rm_thread_exregs (ADDR_VOID, thread->object.addr, - HURD_EXREGS_EXCEPTION_THREAD - | HURD_EXREGS_SET_SP_IP - | HURD_EXREGS_SET_USER_HANDLE - | HURD_EXREGS_START - | HURD_EXREGS_ABORT_IPC, - ADDR_VOID, 0, addr_trans, ADDR_VOID, - (l4_word_t) thread->exception_handler_sp, - (l4_word_t) exception_handler_loop, 0, - thread, - ADDR_VOID, ADDR_VOID, - &dummy, &dummy, &dummy, &dummy); - assert (err == 0); + in.aspace = ADDR (0, 0); + in.aspace_addr_trans = CAP_ADDR_TRANS_VOID; + in.aspace_addr_trans_flags = CAP_COPY_COPY_SOURCE_GUARD; + + in.activity = ADDR_VOID; + + in.exception_page = thread->exception_page.addr; + + in.sp = (l4_word_t) thread->mcontext.sp; + in.ip = (l4_word_t) thread->mcontext.pc; + in.user_handle = (l4_word_t) thread; err = rm_thread_exregs (ADDR_VOID, thread->object.addr, HURD_EXREGS_SET_ASPACE | HURD_EXREGS_SET_ACTIVITY + | HURD_EXREGS_SET_EXCEPTION_PAGE | HURD_EXREGS_SET_SP_IP | HURD_EXREGS_SET_USER_HANDLE | HURD_EXREGS_START | HURD_EXREGS_ABORT_IPC, - ADDR (0, 0), - CAP_COPY_COPY_SOURCE_GUARD, addr_trans, - ADDR_VOID, - (l4_word_t) thread->mcontext.sp, - (l4_word_t) thread->mcontext.pc, 0, - thread, - ADDR_VOID, ADDR_VOID, - &dummy, &dummy, &dummy, &dummy); + in, &out); assert (err == 0); } return 0; |