diff options
author | Neal H. Walfield <neal@gnu.org> | 2008-11-11 11:24:15 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@gnu.org> | 2008-11-11 11:24:15 +0100 |
commit | 5cb34a418e141404a90a8403a4e1443c9e01dc09 (patch) | |
tree | 085be0c748956a156338fe09e703d8eb71fc67cb | |
parent | bb8872946093818f0766f90cb9cc4af17337ad38 (diff) |
/
2008-11-11 Neal H. Walfield <neal@gnu.org>
* README: Remove reference to patching Pistachio and libl4.
libl4/
2008-11-11 Neal H. Walfield <neal@gnu.org>
* ia32/l4/bits/vregs.h (_L4_utcb): Use %gs:0.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | README | 433 | ||||
-rw-r--r-- | libl4/ChangeLog | 4 | ||||
-rw-r--r-- | libl4/ia32/l4/bits/vregs.h | 2 |
4 files changed, 10 insertions, 433 deletions
@@ -1,5 +1,9 @@ 2008-11-11 Neal H. Walfield <neal@gnu.org> + * README: Remove reference to patching Pistachio and libl4. + +2008-11-11 Neal H. Walfield <neal@gnu.org> + * configure.ac: Generate benchmarks/sqlite/Makefile. 2008-11-11 Neal H. Walfield <neal@gnu.org> @@ -104,7 +104,7 @@ from them. They are relatively silent by default. Here is an example menu.lst file for GNU GRUB: -title The GNU Hurd on L4 +title Viengoos root (hd0,0) kernel /boot/laden -D module /boot/ia32-kernel @@ -113,434 +113,3 @@ module /boot/viengoos -D 3 module /boot/hieronymus -D 3 -Pistachio Patch ---------------- - -The most important patch to get the Hurd running on Pistachio is the -one to change Pistachio to use %gs:4 to store the UTCB pointer on -ia32. If you don't want to apply this and are not building glibc, -then you can use this patch to the libl4 included with this source -code: - -Index: libl4/ia32/l4/bits/vregs.h -=================================================================== -RCS file: /sources/hurd/hurd-l4/libl4/ia32/l4/bits/vregs.h,v -retrieving revision 1.9 -diff -u -r1.9 vregs.h ---- libl4/ia32/l4/bits/vregs.h 15 Feb 2005 18:27:46 -0000 1.9 -+++ libl4/ia32/l4/bits/vregs.h 16 Nov 2007 15:29:58 -0000 -@@ -32,7 +33,7 @@ - #ifndef _L4_TEST_ENVIRONMENT - _L4_word_t *utcb; - -- __asm__ __volatile__ ("movl %%gs:4, %[utcb]" -+ __asm__ __volatile__ ("movl %%gs:0, %[utcb]" - : [utcb] "=r" (utcb)); - - return utcb; - - - -Otherwise, there are a couple of patches you need to apply to the L4 -kernel to be able to use it with the Hurd on L4 servers. These -patches add missing features, or tweak the kernel interfaces to meet -our requirements. - -You can apply all patches in one go by changing your working directory -to the pistachio source tree, and feed this README file through patch: - -$ cd pistachio -$ patch -p1 < /my/path/to/hurd-l4/README - -The following patch fixes a problem with IPC propagation and with -receiving from any local thread. - -2004-10-28 Marcus Brinkmann <marcus@gnu.org> - - * src/api/v4/ipc.cc (SYS_IPC): If receiving from any local - thread, look up the first sending local thread. - -2004-10-23 Marcus Brinkmann <marcus@gnu.org> - - * src/api/v4/ipc.cc (SYS_IPC): If propagating, modify the - originator's partner to wait for the new receiver if the - originator is in a closed wait for the sender. Check if the - receiver is waiting for the current sender, not for the - originator thread. - -Index: kernel/src/api/v4/ipc.cc -=================================================================== -RCS file: /public-cvs/pistachio/kernel/src/api/v4/ipc.cc,v -retrieving revision 1.57.4.6 -diff -u -r1.57.4.6 ipc.cc ---- pistachio/kernel/src/api/v4/ipc.cc 3 Jun 2004 13:58:57 -0000 1.57.4.6 -+++ pistachio/kernel/src/api/v4/ipc.cc 23 Oct 2004 00:33:45 -0000 -@@ -292,6 +292,9 @@ - && (current->get_space() == virt_sender->get_space() || - current->get_space() == to_tcb->get_space())) - { -+ if (virt_sender->get_state().is_waiting() && -+ virt_sender->get_partner() == sender_id) -+ virt_sender->set_partner(to_tid); - sender_id = current->get_virtual_sender(); - } - else -@@ -313,7 +316,7 @@ - // optimized for receive and wait any - if (EXPECT_FALSE( - (!to_tcb->get_state().is_waiting()) || -- ( to_tcb->get_partner() != sender_id && -+ ( to_tcb->get_partner() != current->get_global_id() && - !to_tcb->get_partner().is_anythread() && - !( to_tcb->get_partner().is_anylocalthread() && - to_tcb->get_space() == current->get_space() ) ) )) -@@ -517,9 +520,24 @@ SYS_IPC (threadid_t to_tid, threadid_t f - } - } - else -- { /* anylocal */ --#warning wait_local incorrect -- from_tcb = current->send_head; -+ { -+ /* anylocal */ -+ -+ tcb_t *head = current->send_head; -+ from_tcb = NULL; -+ -+ if (head) -+ { -+ tcb_t *tcb = head; -+ -+ do -+ { -+ if (tcb->get_space () == current->get_space ()) -+ from_tcb = tcb; -+ tcb = tcb->send_list.next; -+ } -+ while (!from_tcb && tcb != head); -+ } - } - - TRACE_IPC("receive phase curr=%t, from=%t\n", current, from_tcb); - - -The following patch adds support for the ELF TLS ABI to -L4Ka::Pistachio. - -This is based on Espen's suggestion to use %gs:4 instead of %gs:0 for -the UTCB, to free %gs:0 for the ELF thread pointer. - -I am not sure this patch helps anybody here. It certainly won't do -the trick for the L4Linux guys. But it opens a compromise path were -L4 still supports the ELF standard (although not the GNU variant) on -ia32. - -I am posting this patch just so that you know what I am up to, and to -define more precisely one of the possible options in the stale-mate -ELF TLS ABI vs L4 ABI discussion. I will also work on alternatives to -this, so this is not the last word. - -I chose to not save/restore the value in %gs:0, but to add a system -call to set it. This is the simplest approach I can think of, and -should also be the fastest for now, as setting the value is rare (if -you have one user thread per kernel thread). I also put the value -into the kernel tcb, not in the UTCB, because I think this matches -existing precedence (ie, on ia64, gr13 is also not preserved across -IPC). - -So, this is a really simple patch. Doesn't do much, but works for me. - -The costs (apart from setting up the desired value) is writing the -value from the ktcb to %gs:0 on every thread switch except fast path -of IPC. That's all. - -I suck at hand-written assembler. So the ordering of the commands -possibly can be further optimized (move the pop %edx down a bit?). - -===File l4-tls-ia32.patch=============== -2004-11-19 Marcus Brinkmann <marcus@gnu.org> - - * kernel/include/glue/v4-ia32/config.h (ARCH_SYSCALL0): New macro. - (user_set_gs0) [!ASSEMBLY && __cplusplus]: Define prototype. - * kernel/include/glue/v4-ia32/ktcb.h (arch_ktcb_t): Add new - member user_gs0. - * kernel/include/glue/v4-ia32/syscalls.h (sys_set_gs0): New - prototype. - * kernel/include/glue/v4-ia32/tcb.h (tcb_t::init_stack): - Initialize ARCH.user_gs0. - (tcb_t::switch_to): Use %gs:4 for the UTCB, and set %gs:0 to - the user-settable value DEST->get_arch()->user_gs0. - * kernel/src/glue/v4-ia32/gs0.cc: New file. - * kernel/src/glue/v4-ia32/init.cc: Make the IA32_UTCB segment - two words large. - * kernel/src/glue/v4-ia32/Makeconf (SOURCES): Add gs0.cc. - * kernel/src/glue/v4-ia32/trap.S: Use %gs:4 for the UTCB. - * kernel/src/glue/v4-ia32/user.cc (SYSCALL_STUB(system_clock)): - Use %gs:4 for the UTCB. - (SYSCALL_STUB(set_gs0)): New syscall stub. - (exc_user_syscall): Handle SYSCALL_STUB(set_gs0). - * user/include/l4/ia32/vregs.h (__L4_X86_Utcb): Use %gs:4 - instead of %gs:0. - -diff -rupN pistachio/kernel/include/glue/v4-ia32/config.h pistachio/kernel/include/glue/v4-ia32/config.h ---- pistachio/kernel/include/glue/v4-ia32/config.h 2005-01-22 01:45:47.000000000 +0100 -+++ pistachio/kernel/include/glue/v4-ia32/config.h 2005-01-22 02:14:14.000000000 +0100 -@@ -54,6 +54,11 @@ - #define KIP_ARCH_PAGEINFO {SHUFFLE2(rwx:6, size_mask:((1 << IA32_PAGE_BITS)) >> 10)} - #endif - #define KIP_SYSCALL(x) ((u8_t*)(x) - (u8_t*)&kip) -+#define ARCH_SYSCALL0 KIP_SYSCALL (user_set_gs0) -+ -+#if !defined(ASSEMBLY) && defined(__cplusplus) -+extern "C" void SECTION (".user.syscall.set_gs0") user_set_gs0 (void); -+#endif - - /* configuration for KTCBs - * make sure the KTCBs fit entirely into the TCB area -@@ -103,7 +108,7 @@ - #define PAGEDIR_STUFF_END (THREAD_COUNT + IA32_PAGEDIR_SIZE) - #endif - --/* V4 UTCB addressed via %gs:0 */ -+/* V4 UTCB addressed via %gs:4 */ - #define MYUTCB_MAPPING __UL(0xDF000000) - - /* trampoline to set up segment registers after sysexit */ -diff -rupN pistachio/kernel/include/glue/v4-ia32/ktcb.h pistachio/kernel/include/glue/v4-ia32/ktcb.h ---- pistachio/kernel/include/glue/v4-ia32/ktcb.h 2004-10-06 21:13:40.000000000 +0200 -+++ pistachio/kernel/include/glue/v4-ia32/ktcb.h 2005-01-22 02:14:14.000000000 +0100 -@@ -34,6 +34,8 @@ - - typedef struct - { -+ /* The value the user wants to see in %gs:0. */ -+ word_t user_gs0; - } arch_ktcb_t; - - -diff -rupN pistachio/kernel/include/glue/v4-ia32/syscalls.h pistachio/kernel/include/glue/v4-ia32/syscalls.h ---- pistachio/kernel/include/glue/v4-ia32/syscalls.h 2003-09-24 21:12:22.000000000 +0200 -+++ pistachio/kernel/include/glue/v4-ia32/syscalls.h 2005-01-22 02:14:14.000000000 +0100 -@@ -184,6 +184,8 @@ - #define return_memory_control() return - - -+void sys_set_gs0 (word_t user_gs0, ia32_exceptionframe_t *__frame); -+ - - /* entry functions for exceptions */ - extern "C" void exc_user_sysipc(void); -diff -rupN pistachio/kernel/include/glue/v4-ia32/tcb.h pistachio/kernel/include/glue/v4-ia32/tcb.h ---- pistachio/kernel/include/glue/v4-ia32/tcb.h 2005-01-22 01:45:47.000000000 +0100 -+++ pistachio/kernel/include/glue/v4-ia32/tcb.h 2005-01-22 02:14:14.000000000 +0100 -@@ -173,6 +173,8 @@ INLINE void tcb_t::init_stack() - { - stack = get_stack_top(); - //TRACE("stack = %p\n", stack); -+ -+ arch.user_gs0 = 0; - } - - -@@ -254,7 +256,7 @@ INLINE void tcb_t::switch_to(tcb_t * des - " jne 1f \n" - " movl $1, __is_small \n" - "1: popl %%eax \n" -- " movl %3, %%gs:0 \n" -+ " movl %3, %%gs:4 \n" - " jmp *%%eax \n" - - "2: /* switch to large space */ \n" -@@ -281,7 +283,10 @@ INLINE void tcb_t::switch_to(tcb_t * des - " movl %%ecx, %%cr3 \n" - - "4: popl %%edx /* activation addr */ \n" -- " movl %3, %%gs:0 /* update current UTCB */ \n" -+ " movl %3, %%gs:4 /* update current UTCB */ \n" -+ -+ " movl %c8(%2), %%ecx /* get dest.arch.user_gs0 */ \n" -+ " movl %%ecx, %%gs:0 /* install it */ \n" - - " jmp *%%edx \n" - "9: movl %2, %1 /* restore 'this' */ \n" -@@ -298,7 +303,8 @@ INLINE void tcb_t::switch_to(tcb_t * des - "i" (OFS_TCB_PDIR_CACHE), // 6 - "a" ((word_t) dest->space - + (CONFIG_SMP_MAX_CPUS * IA32_PAGE_SIZE) -- + (SMALL_SPACE_ID >> IA32_PAGEDIR_BITS) * 4) // 7 -+ + (SMALL_SPACE_ID >> IA32_PAGEDIR_BITS) * 4), // 7 -+ "i" (OFS_TCB_ARCH) // 8 - : - "ecx", "edx", "memory"); - -@@ -330,7 +336,10 @@ INLINE void tcb_t::switch_to(tcb_t * des - "movl %7, %%cr3 \n\t" /* reload pagedir */ - "2: \n\t" - "popl %%edx \n\t" /* load activation addr */ -- "movl %3, %%gs:0 \n\t" /* update current UTCB */ -+ "movl %3, %%gs:4 \n\t" /* update current UTCB */ -+ -+ "movl %c9(%2), %%ecx \n\t" /* get dest.arch.user_gs0 */ -+ "movl %%ecx, %%gs:0 \n\t" /* install it */ - - "jmp *%%edx \n\t" - "3: \n\t" -@@ -348,10 +357,11 @@ INLINE void tcb_t::switch_to(tcb_t * des - "i" (OFS_TCB_PDIR_CACHE), // 6 - "a" (dest->pdir_cache), // 7 - #ifdef CONFIG_CPU_IA32_P4 -- "c" (this->pdir_cache) // 8 -+ "c" (this->pdir_cache), // 8 - #else -- "c" (dest->pdir_cache) // dummy -+ "c" (dest->pdir_cache), // dummy - #endif -+ "i" (OFS_TCB_ARCH) // 9 - : "edx", "memory" - ); - -diff -rupN pistachio/kernel/src/glue/v4-ia32/gs0.cc pistachio/kernel/src/glue/v4-ia32/gs0.cc ---- pistachio/kernel/src/glue/v4-ia32/gs0.cc 1970-01-01 01:00:00.000000000 +0100 -+++ pistachio/kernel/src/glue/v4-ia32/gs0.cc 2005-01-22 02:14:14.000000000 +0100 -@@ -0,0 +1,15 @@ -+#include INC_API(tcb.h) -+#include INC_ARCH(trapgate.h) -+ -+void -+sys_set_gs0 (word_t user_gs0, -+ ia32_exceptionframe_t *__frame) -+{ -+ get_current_tcb()->get_arch()->user_gs0 = user_gs0; -+ -+ asm volatile (" movl %0, %%gs:0 \n" -+ : -+ : "r" (user_gs0)); -+ -+ return; -+} -diff -rupN pistachio/kernel/src/glue/v4-ia32/init.cc pistachio/kernel/src/glue/v4-ia32/init.cc ---- pistachio/kernel/src/glue/v4-ia32/init.cc 2005-01-22 01:45:49.000000000 +0100 -+++ pistachio/kernel/src/glue/v4-ia32/init.cc 2005-01-22 02:14:14.000000000 +0100 -@@ -222,12 +222,13 @@ static void setup_gdt(ia32_tss_t & tss, - gdt[gdt_idx(IA32_UDS)].set_seg(0, ~0, 3, ia32_segdesc_t::data); - - /* MyUTCB pointer, -- * we use a separate page for all processors allocated in space_t -- * and have one UTCB entry per cache line in the SMP case */ -+ * we use a separate page for all processors allocated in space_t -+ * and have one user word and one UTCB entry per cache line in the -+ * SMP case */ - ASSERT(unsigned(cpuid * CACHE_LINE_SIZE) < IA32_PAGE_SIZE); - gdt[gdt_idx(IA32_UTCB)].set_seg((u32_t)MYUTCB_MAPPING + - (cpuid * CACHE_LINE_SIZE), -- sizeof(threadid_t) - 1, -+ sizeof (word_t) + sizeof(threadid_t) - 1, - 3, ia32_segdesc_t::data); - - /* the TSS -diff -rupN pistachio/kernel/src/glue/v4-ia32/Makeconf pistachio/kernel/src/glue/v4-ia32/Makeconf ---- pistachio/kernel/src/glue/v4-ia32/Makeconf 2004-03-16 05:05:06.000000000 +0100 -+++ pistachio/kernel/src/glue/v4-ia32/Makeconf 2005-01-22 02:14:14.000000000 +0100 -@@ -3,7 +3,7 @@ LDSCRIPT = $(SRCDIR)/src/glue/$(API)-$(A - CURDIR = src/glue/v4-ia32 - SOURCES += $(addprefix $(CURDIR)/, init.cc idt.cc exception.cc \ - space.cc debug.cc resources.cc thread.cc user.cc trap.S \ -- ctors.cc smp.cc trampoline.S) -+ ctors.cc smp.cc trampoline.S gs0.cc) - - SOURCES+= src/generic/linear_ptab_walker.cc \ - src/generic/mapping_alloc.cc \ -diff -rupN pistachio/kernel/src/glue/v4-ia32/space.cc pistachio/kernel/src/glue/v4-ia32/space.cc ---- pistachio/kernel/src/glue/v4-ia32/space.cc 2005-01-22 01:45:49.000000000 +0100 -+++ pistachio/kernel/src/glue/v4-ia32/space.cc 2005-01-22 02:14:14.000000000 +0100 -@@ -329,7 +329,7 @@ void SECTION(".init.memory") space_t::in - - /* MYUTCB mapping - * allocate a full page for all myutcb pointers. -- * access must be performed via gs:0, when setting up the gdt -+ * access must be performed via gs:4, when setting up the gdt - * each processor gets a full cache line to avoid bouncing - * page is user-writable and global - */ -diff -rupN pistachio/kernel/src/glue/v4-ia32/trap.S pistachio/kernel/src/glue/v4-ia32/trap.S ---- pistachio/kernel/src/glue/v4-ia32/trap.S 2004-11-17 01:48:13.000000000 +0100 -+++ pistachio/kernel/src/glue/v4-ia32/trap.S 2005-01-22 02:14:14.000000000 +0100 -@@ -175,7 +175,7 @@ fp_save_resources_done: - pushl $fp_ipc_done - movl OFS_TCB_MYSELF_LOCAL(%esi), %edi // local id - movl OFS_TCB_PDIR_CACHE(%esi), %eax // new PDIR -- movl %edi, %gs:0 -+ movl %edi, %gs:4 - movl %esp, OFS_TCB_STACK(%ebx) // store stack ptr - movl OFS_TCB_STACK(%esi), %esp // load stack ptr - popl %ecx // load dest addr -@@ -241,7 +241,7 @@ fp_save_resources_done: - movl %ecx, %gs - movl $1, __is_small - 1: popl %ecx -- movl %edi, %gs:0 -+ movl %edi, %gs:4 - jmp *%ecx - - 2: /* switch to large space */ -@@ -268,7 +268,7 @@ fp_save_resources_done: - movl %ecx, %cr3 - - 9: popl %ecx -- movl %edi, %gs:0 -+ movl %edi, %gs:4 - - #endif /* CONFIG_IA32_SMALL_SPACES */ - -diff -rupN pistachio/kernel/src/glue/v4-ia32/user.cc pistachio/kernel/src/glue/v4-ia32/user.cc ---- pistachio/kernel/src/glue/v4-ia32/user.cc 2005-01-22 01:45:49.000000000 +0100 -+++ pistachio/kernel/src/glue/v4-ia32/user.cc 2005-01-22 02:14:14.000000000 +0100 -@@ -172,7 +172,7 @@ SYSCALL_STUB(system_clock) - "add %c0(%%ecx), %%ecx \n" /* procdesc */ - #ifdef CONFIG_SMP - /* get processor # --> allow for differently clocked CPUs */ -- "mov %%gs:0, %%eax \n" /* myutcb */ -+ "mov %%gs:4, %%eax \n" /* myutcb */ - "mov %c2(%%eax), %%eax \n" - "shl %3, %%eax \n" - "add %%eax, %%ecx \n" -@@ -344,6 +344,14 @@ SYSCALL_STUB(memory_control) - : "i"(SYS_SYSCALL_NUM)); - } - -+SYSCALL_STUB(set_gs0) -+{ -+ __asm__ __volatile__( -+ SYSCALL_LABEL (set_gs0) -+ : -+ : "i"(SYS_SYSCALL_NUM)); -+} -+ - - #define IS_SYSCALL(x) ((frame->eip - (u32_t)get_current_space()->get_kip_page_area().get_base()) == ((u32_t)(&entry_##x) - (u32_t)get_kip() + 2)) - -@@ -399,6 +407,11 @@ IA32_EXC_NO_ERRORCODE(exc_user_syscall, - frame); - } - -+ else if (IS_SYSCALL(set_gs0)) -+ { -+ sys_set_gs0(frame->eax, frame); -+ } -+ - else - printf("unknown syscall\n"); - return; -diff -rupN pistachio/user/include/l4/ia32/vregs.h pistachio/user/include/l4/ia32/vregs.h ---- pistachio/user/include/l4/ia32/vregs.h 2004-11-17 01:48:13.000000000 +0100 -+++ pistachio/user/include/l4/ia32/vregs.h 2005-01-22 02:14:14.000000000 +0100 -@@ -48,7 +48,7 @@ L4_INLINE L4_Word_t * __L4_X86_Utcb (voi - - __asm__ __volatile__ ( - "/* __L4_X86_Utcb() */ \n" -- " mov %%gs:0, %0 \n" -+ " mov %%gs:4, %0 \n" - - : /* outputs */ - "=r"(utcb) - diff --git a/libl4/ChangeLog b/libl4/ChangeLog index 8f0bf77..01d1c79 100644 --- a/libl4/ChangeLog +++ b/libl4/ChangeLog @@ -1,3 +1,7 @@ +2008-11-11 Neal H. Walfield <neal@gnu.org> + + * ia32/l4/bits/vregs.h (_L4_utcb): Use %gs:0. + 2008-08-16 Neal H. Walfield <neal@gnu.org> * l4/ipc.h (_L4_reply_wait_timeout): Use _L4_zero_time, not diff --git a/libl4/ia32/l4/bits/vregs.h b/libl4/ia32/l4/bits/vregs.h index 815b2de..e703603 100644 --- a/libl4/ia32/l4/bits/vregs.h +++ b/libl4/ia32/l4/bits/vregs.h @@ -32,7 +32,7 @@ _L4_utcb (void) #ifndef _L4_TEST_ENVIRONMENT _L4_word_t *utcb; - __asm__ __volatile__ ("movl %%gs:4, %[utcb]" + __asm__ __volatile__ ("movl %%gs:0, %[utcb]" : [utcb] "=r" (utcb)); return utcb; |