Index: arch/l4/Makefile =================================================================== --- arch/l4/Makefile (revision 25) +++ arch/l4/Makefile (working copy) @@ -163,6 +163,14 @@ KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) KBUILD_CFLAGS += $(call cc-option,-mno-avx,) +# +# Prevent the gcc from linking Linux functions into compiler-generated +# Genode stuff. +# +KBUILD_CFLAGS += -Dmemmove=lx_memmove -Dmemset=lx_memset -Dmemcpy=lx_memcpy +KBUILD_CFLAGS += -Dstrlen=lx_strlen -Dabort=lx_abort + + endif ifeq ($(BASEARCH),arm) @@ -243,6 +251,8 @@ endif +# Genode compiler is build without Linux defines. +KBUILD_CFLAGS +=-D__linux__ -Dlinux # ----------------------------------------------- @@ -265,14 +275,15 @@ L4LX_E_L-$(CONFIG_L4_TCG_STPM) += stpm-client L4LX_E_L-$(CONFIG_L4_FERRET) += ferret -L4INC = -I$(L4OBJ)/include/$(L4_MK_ARCH)/$(L4_MK_API) \ - -I$(L4OBJ)/include/$(L4_MK_ARCH) \ - -I$(L4OBJ)/include/$(L4_MK_API) \ - -I$(L4OBJ)/include +#L4INC = -I$(L4OBJ)/include/$(L4_MK_ARCH)/$(L4_MK_API) \ +# -I$(L4OBJ)/include/$(L4_MK_ARCH) \ +# -I$(L4OBJ)/include/$(L4_MK_API) \ +# -I$(L4OBJ)/include head-y := arch/l4/kernel/head.o -libs-y += arch/l4/lib/arch-$(BASEARCH)/ \ +libs-y += arch/l4/lib/arch-$(BASEARCH)/ +#\ arch/l4/l4lxlib/generic/ \ arch/l4/l4lxlib/$(BASEENV)/ @@ -291,7 +302,7 @@ core-y += arch/l4/ --include $(L4OBJ)/l4defs.mk.inc +#-include $(L4OBJ)/l4defs.mk.inc L4_REQUIRED_MODS := libc_be_minimal_log_io \ libc_minimal libc_minimal_l4re \ @@ -307,15 +318,17 @@ $(error Aborting.) endif -libs-y += -Bstatic $(L4_LIBDIRS) -ll4sys -ll4sys-direct -lgcc-l4 +libs-y += -Bstatic $(L4_LIBDIRS) +#-ll4sys -ll4sys-direct -lgcc-l4 +libs-y += $(GENODE_LIBS) export L4INC L4_REQUIRED_MODS -LDFLAGS_vmlinux = \ - --defsym __L4_KIP_ADDR__=$(L4_BID_KIP_ADDR) \ +LDFLAGS_vmlinux = -nostdlib +# --defsym __L4_KIP_ADDR__=$(L4_BID_KIP_ADDR) \ --defsym __l4sys_invoke_direct=$(L4_BID_KIP_ADDR)+$(L4_BID_KIP_OFFS_SYS_INVOKE) \ --defsym __l4sys_debugger_direct=$(L4_BID_KIP_ADDR)+$(L4_BID_KIP_OFFS_SYS_DEBUGGER) -KBUILD_CPPFLAGS += -Iarch/l4/include/asm/l4-arch \ +KBUILD_CPPFLAGS += $(GENODE_INCLUDES) -Iarch/l4/include/asm/l4-arch \ -Iarch/$(LINSRCARCH)/include/generated \ $(if $(PLATFORMNAME),-I$(src)/arch/l4/include/asm/mach-$(LINSRCARCH)/$(PLATFORMNAME)) \ $(if $(PLATFORMNAME),-I$(src)/arch/l4/include/asm/plat-$(LINSRCARCH)/$(PLATFORMNAME)) \ @@ -337,6 +350,8 @@ KBUILD_CPPFLAGS += -DTEXT_OFFSET=0x01000000 endif +drivers-y += arch/l4/drivers/ + all: lImage boot := arch/l4/boot @@ -345,11 +360,11 @@ $(Q)$(MAKE) $(build)=$(boot) $@ check_for_l4defs: - $(Q)if [ ! -e $(L4OBJ)/l4defs.mk.inc ]; then \ - echo "No $(L4OBJ)/l4defs.mk.inc available."; \ - echo "Did you run 'make' in $(L4OBJ) to a successful end?"; \ - exit 1; \ - fi +# $(Q)if [ ! -e $(L4OBJ)/l4defs.mk.inc ]; then \ +# echo "No $(L4OBJ)/l4defs.mk.inc available."; \ +# echo "Did you run 'make' in $(L4OBJ) to a successful end?"; \ +# exit 1; \ +# fi server: $(Q)$(MAKE) $(build)=arch/l4/server Index: arch/l4/Kconfig =================================================================== --- arch/l4/Kconfig (revision 25) +++ arch/l4/Kconfig (working copy) @@ -235,6 +235,20 @@ help Support for (virtual) TPMs provided by the L4 service STPM of TUD:OS. +config SCREEN_GENODE + bool + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT + default y + +config SERIAL_GENODE + bool + default y + select SERIAL_CORE + select SERIAL_CORE_CONSOLE + + endmenu # stub drivers menu "Debugging options" Index: arch/l4/kernel/arch-arm/traps.c =================================================================== --- arch/l4/kernel/arch-arm/traps.c (revision 25) +++ arch/l4/kernel/arch-arm/traps.c (working copy) @@ -68,6 +68,7 @@ dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs)); } +#if 0 #ifndef CONFIG_ARM_UNWIND /* * Stack pointers should always be within the kernels view of @@ -83,6 +84,7 @@ return 0; } #endif +#endif /* * Dump out the contents of some memory nicely... @@ -172,6 +174,7 @@ #else static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) { +#if 0 unsigned int fp, mode; int ok = 1; @@ -203,6 +206,7 @@ if (ok) c_backtrace(fp, mode); +#endif } #endif Index: arch/l4/kernel/arch-arm/vmlinux.lds.S =================================================================== --- arch/l4/kernel/arch-arm/vmlinux.lds.S (revision 25) +++ arch/l4/kernel/arch-arm/vmlinux.lds.S (working copy) @@ -47,6 +47,12 @@ jiffies = jiffies_64 + 4; #endif +PHDRS +{ + ro PT_LOAD; + rw PT_LOAD; +} + SECTIONS { /* @@ -82,14 +88,32 @@ } #ifdef CONFIG_XIP_KERNEL - . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR); + . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) - 4096; #else - . = PAGE_OFFSET + TEXT_OFFSET; + . = PAGE_OFFSET + TEXT_OFFSET - 4096; #endif + + .parent : { + /* + * Leave space for parent capability parameters at start of data + * section. The protection domain creator is reponsible for storing + * sane values here. + */ + _parent_cap = .; + _parent_cap_thread_id = .; + LONG(0xffffffff); + _parent_cap_local_name = .; + LONG(0xffffffff); + } : rw + + . = ALIGN(4096); + .head.text : { + _prog_img_beg = .; _text = .; HEAD_TEXT } + .text : { /* Real text segment */ _stext = .; /* Text and read-only data */ __exception_text_start = .; @@ -104,6 +128,7 @@ #ifdef CONFIG_MMU *(.fixup) #endif + *(.text.*) /* put all Genode .text entries in here */ *(.gnu.warning) *(.glue_7) *(.glue_7t) @@ -136,6 +161,42 @@ } #endif + /* + * When building L4Linux for Genode, the 'CONFIG_ARM_UNWIND' option is + * disabled to avoid conflicts between unwinding-related symbols provided + * by the Linux kernel and the C++ compiler's libsupc++. Hence, the linker + * script section above is not used. Instead, the '.ARM.exidx' entries are + * handled as follows (taken from the Genode linker script. + */ + /* .ARM.exidx is sorted, so has to go in its own output section */ + __exidx_start = .; + .ARM.exidx : { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } + __exidx_end = .; + + .ARM.extab : { + *(.ARM.extab*) + } : rw + + /* exception frames for C++ */ + .eh_frame : { + __eh_frame_start__ = .; + KEEP (*(.eh_frame)) + LONG(0) + } : rw + + .init_array : { + __init_array_start = .; + _ctors_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + _ctors_end = .; + _dtors_start = .; + _dtors_end = .; + } + _etext = .; /* End of text and rodata section */ #ifndef CONFIG_XIP_KERNEL @@ -240,8 +301,10 @@ DATA_DATA CONSTRUCTORS + *(.data.*) /* put all Genode .data entries in here */ + _edata = .; - } + } : rw _edata_loc = __data_loc + SIZEOF(.data); #ifdef CONFIG_HAVE_TCM @@ -303,10 +366,20 @@ NOTES - BSS_SECTION(0, 0, 0) + /* BSS */ + . = ALIGN(PAGE_SIZE); + .bss : AT(ADDR(.bss) - LOAD_OFFSET) { + __bss_start = .; + *(.bss..page_aligned) + *(.bss) + *(.bss.*) /* put all Genode .bss entries in here */ + . = ALIGN(4); + __bss_stop = .; + } /* L4: Align to full superpage */ . = ALIGN(1048576); + _prog_img_end = .; _end = .; STABS_DEBUG Index: arch/l4/kernel/arch-x86/rtc.c =================================================================== --- arch/l4/kernel/arch-x86/rtc.c (revision 25) +++ arch/l4/kernel/arch-x86/rtc.c (working copy) @@ -163,6 +163,7 @@ /* Routines for accessing the CMOS RAM/RTC. */ unsigned char rtc_cmos_read(unsigned char addr) { +#ifdef NOT_GENODE #ifndef CONFIG_L4_EXTERNAL_RTC unsigned char val; @@ -175,17 +176,22 @@ #else return 0; #endif +#else /* NOT_GENODE */ + return 0; +#endif /* NOT_GENODE */ } EXPORT_SYMBOL(rtc_cmos_read); void rtc_cmos_write(unsigned char val, unsigned char addr) { +#ifdef NOT_GENODE #ifndef CONFIG_L4_EXTERNAL_RTC lock_cmos_prefix(addr); outb(addr, RTC_PORT(0)); outb(val, RTC_PORT(1)); lock_cmos_suffix(addr); #endif +#endif /* NOT_GENODE */ } EXPORT_SYMBOL(rtc_cmos_write); Index: arch/l4/kernel/arch-x86/dispatch.c =================================================================== --- arch/l4/kernel/arch-x86/dispatch.c (revision 25) +++ arch/l4/kernel/arch-x86/dispatch.c (working copy) @@ -749,6 +749,7 @@ TBUF_LOG_EXCP(fiasco_tbuf_log_3val("except ", TBUF_TID(t->user_thread_id), t->trap_nr, t->error_code)); + fiasco_tbuf_log_3val("except ", t->trap_nr, regs->ip, 0); if (l4x_deliver_signal(r_trapno(t, v), r_err(t, v))) return 0; /* handled signal, reply */ Index: arch/l4/kernel/arch-x86/vmlinux.lds.S =================================================================== --- arch/l4/kernel/arch-x86/vmlinux.lds.S (revision 25) +++ arch/l4/kernel/arch-x86/vmlinux.lds.S (working copy) @@ -33,7 +33,7 @@ #ifdef CONFIG_X86_32 OUTPUT_ARCH(i386) -ENTRY(phys_startup_32) +ENTRY(_start) jiffies = jiffies_64; #else OUTPUT_ARCH(i386:x86-64) @@ -68,15 +68,8 @@ #endif PHDRS { - text PT_LOAD FLAGS(5); /* R_E */ - data PT_LOAD FLAGS(6); /* RW_ */ -#ifdef CONFIG_X86_64 -#ifdef CONFIG_SMP - percpu PT_LOAD FLAGS(6); /* RW_ */ -#endif - init PT_LOAD FLAGS(7); /* RWE */ -#endif - note PT_NOTE FLAGS(0); /* ___ */ + ro PT_LOAD; + rw PT_LOAD; } SECTIONS @@ -96,6 +89,29 @@ /*_stext = .;*/ .text : AT(ADDR(.text) - LOAD_OFFSET) { _text = .; + _prog_img_beg = .; + + /* + * Leave space for parent capability parameters at start of data + * section. The protection domain creator is reponsible for storing + * sane values here. + */ + _parent_cap = .; + _parent_cap_thread_id = .; + LONG(0xffffffff); + _parent_cap_local_name = .; + LONG(0xffffffff); + + /* + * Platform-specific entry for Fiasco.OC. + * + * PIC-code compiled for Fiasco.OC, needs some PIC-compatible + * way to enter the kernel, the fixed address of the kernel + * entry code address needs to be found here. + */ + __l4sys_invoke_indirect = .; + LONG(0xeacff000); + /* bootstrapping code */ HEAD_TEXT #ifdef CONFIG_X86_32 @@ -111,19 +127,55 @@ ENTRY_TEXT IRQENTRY_TEXT *(.fixup) + *(.text.*) /* put all Genode .text entries in here */ *(.gnu.warning) + + . = ALIGN(0x08); + + _ctors_start = .; + KEEP (*(.ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.init_array)) /* list of constructors specific for ARM eabi */ + _ctors_end = .; + _dtors_start = .; + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + _dtors_end = .; + /* End of text section */ _etext = .; - } :text = 0x9090 + } : rw - NOTES :text :note + NOTES :rw - EXCEPTION_TABLE(16) :text = 0x9090 + .eh_frame_hdr : { *(.eh_frame_hdr) } #if defined(CONFIG_DEBUG_RODATA) /* .text should occupy whole number of pages */ . = ALIGN(PAGE_SIZE); #endif + + /* + * because in Genode we collect all data.* entries in the data section + * we have to put the per_cpu section before defining the data section + * otherwise it's symbols would end up in the data section too. + */ +#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) + PERCPU_SECTION(INTERNODE_CACHE_BYTES) +#endif + + /* + * smp_locks might be freed after init + * start/end must be page aligned + */ + . = ALIGN(PAGE_SIZE); + .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { + __smp_locks = .; + *(.smp_locks) + . = ALIGN(PAGE_SIZE); + __smp_locks_end = .; + } + X64_ALIGN_DEBUG_RODATA_BEGIN RO_DATA(PAGE_SIZE) X64_ALIGN_DEBUG_RODATA_END @@ -151,10 +203,34 @@ /* rarely changed data like cpu maps */ READ_MOSTLY_DATA(INTERNODE_CACHE_BYTES) + *(.data.*) /* put all Genode .data entries in here */ + + /* End of data section */ _edata = .; - } :data + } : rw + EXCEPTION_TABLE(16) : rw + + /* exception frames for C++ */ + .eh_frame : { + __eh_frame_start__ = .; + KEEP (*(.eh_frame)) + LONG(0) + } : rw + + .init_array : { + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + } + + .gcc_except_table : { + KEEP(*(.gcc_except_table)) + KEEP(*(.gcc_except_table.*)) + } + #ifdef CONFIG_X86_64 . = ALIGN(PAGE_SIZE); @@ -273,10 +349,6 @@ EXIT_DATA } -#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) - PERCPU_SECTION(INTERNODE_CACHE_BYTES) -#endif - . = ALIGN(PAGE_SIZE); /* freed after init ends here */ @@ -284,18 +356,6 @@ __init_end = .; } - /* - * smp_locks might be freed after init - * start/end must be page aligned - */ - . = ALIGN(PAGE_SIZE); - .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { - __smp_locks = .; - *(.smp_locks) - . = ALIGN(PAGE_SIZE); - __smp_locks_end = .; - } - #ifdef CONFIG_X86_64 .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { NOSAVE_DATA @@ -308,6 +368,7 @@ __bss_start = .; *(.bss..page_aligned) *(.bss) + *(.bss.*) /* put all Genode .bss entries in here */ . = ALIGN(PAGE_SIZE); __bss_stop = .; } @@ -320,6 +381,7 @@ __brk_limit = .; } + _prog_img_end = .; _end = .; STABS_DEBUG Index: arch/l4/kernel/arch-x86/x86_init.c =================================================================== --- arch/l4/kernel/arch-x86/x86_init.c (revision 25) +++ arch/l4/kernel/arch-x86/x86_init.c (working copy) @@ -42,7 +42,7 @@ struct x86_init_ops x86_init __initdata = { .resources = { - .probe_roms = probe_roms, + .probe_roms = x86_init_noop, .reserve_resources = reserve_standard_io_resources, .memory_setup = l4x_memory_setup, }, Index: arch/l4/kernel/timer.c =================================================================== --- arch/l4/kernel/timer.c (revision 25) +++ arch/l4/kernel/timer.c (working copy) @@ -225,12 +225,16 @@ return -ENOMEM; } +#if 0 r = L4XV_FN_i(l4_error(l4_factory_create_irq(l4re_env()->factory, timer_irq_cap))); if (r) { printk(KERN_ERR "l4timer: Failed to create irq: %d\n", r); goto out1; } +#else + l4lx_thread_alloc_irq(timer_irq_cap); +#endif if ((irq = l4x_register_irq(timer_irq_cap)) < 0) { r = -ENOMEM; @@ -238,6 +242,7 @@ } printk("l4timer: Using IRQ%d\n", irq); + LOG_printf("l4timer: Using IRQ%d\n", irq); setup_irq(irq, &l4timer_irq); @@ -279,7 +284,9 @@ l4x_unregister_irq(irq); out2: L4XV_FN_v(l4re_util_cap_release(timer_irq_cap)); +#if 0 out1: +#endif l4x_cap_free(timer_irq_cap); return r; } Index: arch/l4/kernel/head.S =================================================================== --- arch/l4/kernel/head.S (revision 25) +++ arch/l4/kernel/head.S (working copy) @@ -53,6 +53,7 @@ .previous #endif +#ifdef NOT_GENODE #ifdef ARCH_arm .section ".text" .globl _start @@ -82,6 +83,10 @@ __address_l4lx_kinfo: .long l4lx_kinfo .previous +#endif +#endif /* NOT_GENODE */ + +#ifdef ARCH_arm .section .data.head, "wa" .p2align 12 ENTRY(swapper_pg_dir) Index: arch/l4/kernel/main.c =================================================================== --- arch/l4/kernel/main.c (revision 25) +++ arch/l4/kernel/main.c (working copy) @@ -209,6 +209,7 @@ static void *l4x_main_memory_start; static void *l4x_isa_dma_memory_start; unsigned long l4x_vmalloc_memory_start; +unsigned long l4x_vmalloc_memory_size; l4_kernel_info_t *l4lx_kinfo; l4_cap_idx_t l4x_user_gate[NR_CPUS]; @@ -381,6 +382,28 @@ } +static spinlock_t migrate_lock; + +void l4x_irq_save(unsigned long *flags) { local_irq_save(*flags); } +void l4x_irq_restore(unsigned long flags) { local_irq_restore(flags); } +unsigned long l4x_hz(void) { return HZ; } +int l4x_nr_irqs(void) { return NR_IRQS; } +void l4x_migrate_lock(unsigned long *flags) { spin_lock_irqsave(&migrate_lock, *flags); } +void l4x_migrate_unlock(unsigned long flags) { spin_unlock_irqrestore(&migrate_lock, flags);} +unsigned l4x_smp_processor_id() { return smp_processor_id(); } + + +unsigned l4x_target_cpu(const struct cpumask *dest) +{ + if (!cpumask_intersects(dest, cpu_online_mask)) + return (unsigned) -1; + return cpumask_any_and(dest, cpu_online_mask); +} + +void l4x_cpumask_copy(struct irq_data *data, const struct cpumask *dest) { + cpumask_copy(data->affinity, dest); } + + unsigned long l4x_virt_to_phys(volatile void * address) { int i; @@ -405,10 +428,10 @@ /* Debugging check: don't miss a translation, can give nasty * DMA problems */ - l4x_printf("%s: Could not translate virt. address %p\n", + LOG_printf("%s: Could not translate virt. address %p\n", __func__, address); - l4x_virt_to_phys_show(); - WARN_ON(1); + //l4x_virt_to_phys_show(); + //WARN_ON(1); return __pa(address); } @@ -439,7 +462,7 @@ /* Debugging check: don't miss a translation, can give nasty * DMA problems */ - l4x_printf("%s: Could not translate phys. address 0x%lx\n", + LOG_printf("%s: Could not translate phys. address 0x%lx\n", __func__, address); l4x_virt_to_phys_show(); WARN_ON(1); @@ -558,7 +581,7 @@ r = l4re_ns_query_srv(entry->cap, n + 1, *cap); if (r) { - l4x_printf("Failed to query name '%s': %s(%d)\n", + LOG_printf("Failed to query name '%s': %s(%d)\n", name, l4sys_errtostr(r), r); L4XV_U(f); return -ENOENT; @@ -742,6 +765,7 @@ = sizeof(at_exit_functions) / sizeof(at_exit_functions[0]); static int __current_exititem; +#if 0 static struct cxa_atexit_item *__next_atexit(void) { if (__current_exititem >= at_exit_nr_of_functions) { @@ -750,21 +774,10 @@ } return &at_exit_functions[__current_exititem++]; } +#endif -int __cxa_atexit(void (*f)(void *), void *arg, void *dso_handle) -{ - struct cxa_atexit_item *h = __next_atexit(); +extern int __cxa_atexit(void (*f)(void *), void *arg, void *dso_handle); - if (!h) - return -1; - - h->f = f; - h->arg = arg; - h->dso_handle = dso_handle; - - return 0; -} - void __cxa_finalize(void *dso_handle) { const int verbose = 0; @@ -819,10 +832,20 @@ } static int l4x_forward_pf(l4_umword_t addr, l4_umword_t pc, int extra_write) { +#if 0 l4_msgtag_t tag; l4_umword_t err; l4_utcb_t *u = l4_utcb(); +#endif + if (!extra_write) + l4_touch_ro((void*)l4_trunc_page(addr), L4_LOG2_PAGESIZE); + else + l4_touch_rw((void*)l4_trunc_page(addr), L4_LOG2_PAGESIZE); + + // TODO: Reenable this part +#if 0 + do { l4_msg_regs_t *mr = l4_utcb_mr_u(u); mr->mr[0] = addr | (extra_write ? 2 : 0); @@ -844,6 +867,7 @@ // unresolvable page fault, we're supposed to trigger an // exception return 0; +#endif return 1; } @@ -1283,16 +1307,19 @@ 0, "Main memory"); /* Reserve some part of the virtual address space for vmalloc */ - l4x_vmalloc_memory_start = (unsigned long)l4x_main_memory_start; - if (l4re_rm_reserve_area(&l4x_vmalloc_memory_start, + l4x_vmalloc_memory_start = ((((unsigned long)l4x_main_memory_start + l4x_mainmem_size) + + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET - 1)); #ifdef CONFIG_X86_32 - __VMALLOC_RESERVE, + l4x_vmalloc_memory_size = __VMALLOC_RESERVE; #elif defined(CONFIG_X86_64) - VMALLOC_END - VMALLOC_START + 1, + l4x_vmalloc_memory_size = VMALLOC_END - VMALLOC_START + 1; #else - VMALLOC_SIZE << 20, + l4x_vmalloc_memory_size = VMALLOC_SIZE << 20; #endif - L4RE_RM_SEARCH_ADDR, PGDIR_SHIFT)) { + + if (l4re_rm_reserve_area(&l4x_vmalloc_memory_start, + l4x_vmalloc_memory_size, + L4RE_RM_SEARCH_ADDR, ilog2(VMALLOC_OFFSET))) { LOG_printf("%s: Error reserving vmalloc memory area!\n", __func__); l4x_exit_l4linux(); } @@ -1305,7 +1332,7 @@ #ifdef ARCH_x86 // fixmap area - l4x_fixmap_space_start = (unsigned long)l4x_main_memory_start; + l4x_fixmap_space_start = (unsigned long)l4x_vmalloc_memory_start + l4x_vmalloc_memory_size; if (l4re_rm_reserve_area(&l4x_fixmap_space_start, __end_of_fixed_addresses * PAGE_SIZE, L4RE_RM_SEARCH_ADDR, PAGE_SHIFT) < 0) { @@ -1416,6 +1443,10 @@ static void l4x_create_ugate(l4_cap_idx_t forthread, unsigned cpu) { + LOG_printf("thread=%lx cpu=%x\n", forthread, cpu); + l4x_user_gate[cpu] = forthread; + +#if 0 l4_msgtag_t r; l4x_user_gate[cpu] = l4x_cap_alloc_noctx(); @@ -1436,6 +1467,7 @@ l4_debugger_set_object_name(l4x_user_gate[cpu], n); #endif } +#endif } #ifdef CONFIG_HOTPLUG_CPU @@ -1641,11 +1673,15 @@ l4x_exit_l4linux(); } +#if 0 t = l4_factory_create_irq(l4re_env()->factory, c); if (l4_error(t)) { LOG_printf("Failed to create IRQ\n"); l4x_exit_l4linux(); } +#else + l4lx_thread_alloc_irq(c); +#endif #ifdef CONFIG_L4_DEBUG_REGISTER_NAMES l4_debugger_set_object_name(c, s); @@ -1906,8 +1942,12 @@ static int l4x_cpu_virt_phys_map_init(const char *boot_command_line) { +#ifdef CONFIG_SMP l4_umword_t max_cpus = 1; +#if 0 l4_sched_cpu_set_t cs = l4_sched_cpu_set(0, 0, 0); +#endif +#endif unsigned i; #ifdef CONFIG_SMP @@ -1923,9 +1963,10 @@ } } - +#if 0 if (l4_error(l4_scheduler_info(l4re_env()->scheduler, &max_cpus, &cs)) == L4_EOK) { +#endif if ((p = strstr(boot_command_line, "l4x_cpus_map="))) { // l4x_cpus_map=0,1,2,3,4,... // the list specifies the physical CPU for each @@ -1947,10 +1988,12 @@ LOG_printf("ERROR: Error parsing l4x_cpus_map option\n"); return 1; } +#if 0 if (!l4x_cpu_check_pcpu(pcpu, max_cpus)) { LOG_printf("ERROR: pCPU%d not found\n", pcpu); return 1; } +#endif l4x_cpu_physmap[l4x_nr_cpus].phys_id = pcpu; for (i = 0; i < l4x_nr_cpus; ++i) overbooking |= @@ -1974,12 +2017,16 @@ l4x_nr_cpus = v; } +#if 0 } +#endif #ifndef CONFIG_L4_VCPU l4x_tamed_set_mapping(0, l4x_cpu_physmap_get_id(0)); #endif #else /* UP */ + +#if 0 if (l4_error(l4_scheduler_info(l4re_env()->scheduler, &max_cpus, &cs)) == L4_EOK) { @@ -1989,6 +2036,8 @@ l4x_cpu_physmap[0].phys_id = p; } #endif + l4x_cpu_physmap[0].phys_id = 0; +#endif LOG_printf("CPU mapping (l:p)[%d]: ", l4x_nr_cpus); for (i = 0; i < l4x_nr_cpus; i++) @@ -2034,6 +2083,7 @@ printk("panic: going to sleep forever, bye\n"); L4XV_L(f); LOG_printf("panic: going to sleep forever, bye\n"); + enter_kdebug("PANIC"); l4_sleep_forever(); return 0; } @@ -2302,7 +2352,7 @@ LOG_printf("Device scan done.\n"); } -int __init_refok L4_CV main(int argc, char **argv) +int __init_refok L4_CV linux_main(int argc, char **argv) { l4lx_thread_t main_id; struct l4lx_thread_start_info_t si; @@ -2414,10 +2464,13 @@ l4x_start_thread_id = l4re_env()->main_thread; +#if 0 l4_thread_control_start(); l4_thread_control_commit(l4x_start_thread_id); l4x_start_thread_pager_id = l4_utcb_mr()->mr[L4_THREAD_CONTROL_MR_IDX_PAGER]; +#endif + l4x_start_thread_pager_id = l4re_env()->rm; #ifndef CONFIG_L4_VCPU #ifdef CONFIG_L4_TAMED @@ -3223,6 +3276,10 @@ /* Not resolvable: Ooops */ LOG_printf("Non-resolvable page fault at %lx, ip %lx.\n", pfa, ip); // will trigger an oops in caller + +#ifdef CONFIG_L4_DEBUG_SEGFAULTS + enter_kdebug("PF"); +#endif return 0; } @@ -3419,7 +3476,9 @@ void exit(int code) { __cxa_finalize(0); +#if 0 l4x_external_exit(code); +#endif LOG_printf("Still alive, going zombie???\n"); l4_sleep_forever(); } Index: arch/l4/kernel/tamed.c =================================================================== --- arch/l4/kernel/tamed.c (revision 25) +++ arch/l4/kernel/tamed.c (working copy) @@ -366,8 +366,12 @@ #ifdef CONFIG_L4_VCPU void l4x_global_halt(void) { - l4vcpu_halt(l4x_vcpu_state_current(), l4x_utcb_current(), - do_vcpu_irq, l4x_srv_setup_recv_wrap); + l4vcpu_wait_for_event(l4x_vcpu_state_current(), l4x_utcb_current(), + do_vcpu_irq, l4x_srv_setup_recv_wrap); +#ifdef CONFIG_X86 + // on x86, interrupts are enabled after hlt + l4x_global_sti(); +#endif } EXPORT_SYMBOL(l4x_global_halt); Index: arch/l4/kernel/dispatch.c =================================================================== --- arch/l4/kernel/dispatch.c (revision 25) +++ arch/l4/kernel/dispatch.c (working copy) @@ -121,6 +121,9 @@ { unsigned long devmem; + printk("l4x_handle_dev_mem(%lx) called - currently not supported on Genode.\n", phy); + return 0; + #ifdef CONFIG_X86 if (phy > 0x80000000U) { if (!(devmem = find_ioremap_entry(phy)) @@ -271,7 +274,7 @@ return 0; if (l4_msgtag_is_page_fault(tag)) { - l4x_printf("HYBRID PF!!\n"); + LOG_printf("HYBRID PF!!\n"); /* No exception IPC, it's a page fault, but shouldn't happen */ goto out_fail; } @@ -695,7 +698,7 @@ enter_kdebug("non hybrid in idle?!"); } else { if (unlikely(l4x_handle_async_event(label, utcb, tag))) - l4x_printf("Async return with error\n"); + LOG_printf("Async return with error\n"); } } } Index: arch/l4/include/asm/arch-arm/pgtable.h =================================================================== --- arch/l4/include/asm/arch-arm/pgtable.h (revision 25) +++ arch/l4/include/asm/arch-arm/pgtable.h (working copy) @@ -42,6 +42,7 @@ #include +#define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_SIZE 128 #define VMALLOC_START l4x_vmalloc_memory_start Index: arch/l4/include/asm/generic/l4lib.h =================================================================== --- arch/l4/include/asm/generic/l4lib.h (revision 25) +++ arch/l4/include/asm/generic/l4lib.h (working copy) @@ -3,6 +3,7 @@ #include +#if 0 #ifdef ARCH_arm #define L4_EXTERNAL_FUNC(func) \ asm(".section \".data.l4externals.str\" \n" \ @@ -58,5 +59,8 @@ ".previous \n" \ ) #endif +#endif +#define L4_EXTERNAL_FUNC(func) ; + #endif /* __INCLUDE__ASM_L4__GENERIC__L4LIB_H__ */ Index: arch/l4/include/asm/l4lxapi/thread.h =================================================================== --- arch/l4/include/asm/l4lxapi/thread.h (revision 25) +++ arch/l4/include/asm/l4lxapi/thread.h (working copy) @@ -32,6 +32,8 @@ */ void l4lx_thread_init(void); +void l4lx_thread_alloc_irq(l4_cap_idx_t c); + /** * \brief Create a thread. * \ingroup thread Index: arch/l4/boot/Makefile =================================================================== --- arch/l4/boot/Makefile (revision 25) +++ arch/l4/boot/Makefile (working copy) @@ -10,7 +10,7 @@ $(call if_changed,objcopy) @echo ' Kernel: $@ is ready' -lImage: $(obj)/Image vmlinuz$(VMLINUZ_SUFFIX) l4linux$(VMLINUZ_SUFFIX) +lImage: $(obj)/Image vmlinuz$(VMLINUZ_SUFFIX): ldrImage FORCE $(call if_changed,gzip) @@ -21,8 +21,8 @@ objects-y := ldr.o res.o image.o -include $(L4OBJ)/l4defs.mk.inc - +#include $(L4OBJ)/l4defs.mk.inc +KBUILD_CFLAGS_i386 = -m32 KBUILD_CFLAGS := $(filter-out -mregparm=3,$(KBUILD_CFLAGS)) \ $(L4INC) -I$(L4OBJ)/include/uclibc \ -Wall -fno-strict-aliasing -O2 -pipe \ Index: arch/l4/lib/pte.c =================================================================== --- arch/l4/lib/pte.c (revision 25) +++ arch/l4/lib/pte.c (working copy) @@ -18,7 +18,10 @@ #include #include #include +#include +extern void l4lx_memory_map_physical_page(unsigned long address); + static void l4x_flush_page(struct mm_struct *mm, unsigned long address, unsigned long vaddr, @@ -45,6 +48,12 @@ } } else #endif +#ifdef NOT_GENODE + /* + * Device memory is currently not supported on Genode. If this changes, + * a check for overlapping 'low memory' and 'device memory' regions + * must get added. + */ if (address > 0x80000000UL) { unsigned long remap; remap = find_ioremap_entry(address); @@ -57,8 +66,10 @@ return; address = remap; + } else +#endif /* NOT_GENODE */ - } else if ((address & PAGE_MASK) == 0) + if ((address & PAGE_MASK) == 0) address = PAGE0_PAGE_ADDRESS; #if 0 @@ -77,7 +88,7 @@ if (mm && !l4_is_invalid_cap(mm->context.task)) { L4XV_V(f); if (!mm->context.task) - l4x_printf("%s: Ups, task == 0\n", __func__); + LOG_printf("%s: Ups, task == 0\n", __func__); /* Direct flush in the child, use virtual address in the * child address space */ L4XV_L(f); @@ -93,10 +104,11 @@ tag = l4_task_unmap(L4RE_THIS_TASK_CAP, l4_fpage(address & PAGE_MASK, size, flush_rights), L4_FP_OTHER_SPACES); + l4lx_memory_map_physical_page(address); L4XV_U(f); } if (l4_error(tag)) - l4x_printf("l4_task_unmap error %ld\n", l4_error(tag)); + LOG_printf("l4_task_unmap error %ld\n", l4_error(tag)); } #ifdef ARCH_arm Index: arch/x86/lib/memcpy_32.c =================================================================== --- arch/x86/lib/memcpy_32.c (revision 25) +++ arch/x86/lib/memcpy_32.c (working copy) @@ -1,8 +1,13 @@ #include #include +#ifdef NOT_GENODE #undef memcpy #undef memset +#else +#undef lx_memcpy +#undef lx_memset +#endif /* NOT_GENODE */ void *memcpy(void *to, const void *from, size_t n) { Index: arch/x86/include/asm/string_32.h =================================================================== --- arch/x86/include/asm/string_32.h (revision 25) +++ arch/x86/include/asm/string_32.h (working copy) @@ -179,8 +179,12 @@ #ifndef CONFIG_KMEMCHECK #if (__GNUC__ >= 4) +#ifdef NOT_GENODE #define memcpy(t, f, n) __builtin_memcpy(t, f, n) #else +#define lx_memcpy(t, f, n) __memcpy(t, f, n) +#endif +#else #define memcpy(t, f, n) \ (__builtin_constant_p((n)) \ ? __constant_memcpy((t), (f), (n)) \ @@ -322,8 +326,12 @@ #define __HAVE_ARCH_MEMSET #if (__GNUC__ >= 4) +#ifdef NOT_GENODE #define memset(s, c, count) __builtin_memset(s, c, count) #else +#define lx_memset(s, c, count) __memset(s, c, count) +#endif +#else #define memset(s, c, count) \ (__builtin_constant_p(c) \ ? __constant_c_x_memset((s), (0x01010101UL * (unsigned char)(c)), \ Index: drivers/tty/serial/l4ser.c =================================================================== --- drivers/tty/serial/l4ser.c (revision 25) +++ drivers/tty/serial/l4ser.c (working copy) @@ -22,10 +22,12 @@ #include #include +#include #include #include #include #include +#include #include #include #include @@ -118,7 +120,7 @@ int c; if (port->x_char) { - L4XV_FN_v(l4_vcon_write(l4port->vcon_cap, &port->x_char, 1)); + L4XV_FN_v(l4_vcon_write(LOG_printf("%c", port->x_char)); port->icount.tx++; port->x_char = 0; return; @@ -128,7 +130,12 @@ c = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); if (c > L4_VCON_WRITE_SIZE) c = L4_VCON_WRITE_SIZE; - L4XV_FN_v(l4_vcon_write(l4port->vcon_cap, &xmit->buf[xmit->tail], c)); + L4XV_L(f); + char *ptr = (char*)&xmit->buf[xmit->tail], old = ptr[c]; + ptr[c] = 0; + LOG_printf("%s", ptr); + ptr[c] = old; + L4XV_U(f); xmit->tail = (xmit->tail + c) & (UART_XMIT_SIZE - 1); port->icount.tx += c; } @@ -247,7 +254,7 @@ if (l4ser_port[num].inited) return 0; l4ser_port[num].inited = 1; - +#if 0 if ((r = l4x_re_resolve_name(name, &l4ser_port[num].vcon_cap))) { if (num == 0) l4ser_port[num].vcon_cap = l4re_env()->log; @@ -285,7 +292,7 @@ vcon_attr.i_flags = 0; vcon_attr.o_flags = 0; vcon_attr.l_flags = 0; - L4XV_FN_v(l4_vcon_set_attr(l4ser_port[num].vcon_cap, &vcon_attr)); +// L4XV_FN_v(l4_vcon_set_attr(l4ser_port[num].vcon_cap, &vcon_attr)); l4ser_port[num].port.uartclk = 3686400; l4ser_port[num].port.ops = &l4ser_pops; @@ -326,7 +333,13 @@ unsigned c = count; if (c > L4_VCON_WRITE_SIZE) c = L4_VCON_WRITE_SIZE; - L4XV_FN_v(l4_vcon_write(l4ser_port[co->index].vcon_cap, s, c)); + L4XV_L(f); + char *ptr = (char*)s, old = ptr[c]; + ptr[c] = 0; + LOG_printf("%s", ptr); + ptr[c] = old; + + L4XV_U(f); count -= c; } while (count); } Index: include/asm-generic/vmlinux.lds.h =================================================================== --- include/asm-generic/vmlinux.lds.h (revision 25) +++ include/asm-generic/vmlinux.lds.h (working copy) @@ -371,6 +371,7 @@ VMLINUX_SYMBOL(__start___modver) = .; \ *(__modver) \ VMLINUX_SYMBOL(__stop___modver) = .; \ + LONG(0) /* enforce non-zero section size */ \ . = ALIGN((align)); \ VMLINUX_SYMBOL(__end_rodata) = .; \ } \