mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-29 10:08:53 +00:00
b38fee2867
- search for alternative virtual address regions upwards, starting from the given start address, in the 'l4re_rm_attach()' and 'Region_manager::reserve_range()' functions - don't treat memory locations above 0x80000000 in l4linux's virtual address space as device memory - align the start address of the vmalloc area according to the assumption in 'devicemaps_init()' Fixes #414.
1265 lines
32 KiB
Diff
1265 lines
32 KiB
Diff
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 <asm/api/api.h>
|
|
|
|
+#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 <linux/stringify.h>
|
|
|
|
+#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 <l4/sys/task.h>
|
|
#include <l4/sys/kdebug.h>
|
|
#include <l4/re/consts.h>
|
|
+#include <l4/log/log.h>
|
|
|
|
+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 <linux/string.h>
|
|
#include <linux/module.h>
|
|
|
|
+#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 <linux/serial.h>
|
|
|
|
#include <l4/sys/vcon.h>
|
|
+#include <l4/sys/kdebug.h>
|
|
#include <l4/sys/factory.h>
|
|
#include <l4/sys/icu.h>
|
|
#include <l4/re/c/namespace.h>
|
|
#include <l4/re/c/util/cap.h>
|
|
+#include <l4/log/log.h>
|
|
#include <asm/generic/setup.h>
|
|
#include <asm/generic/cap_alloc.h>
|
|
#include <asm/generic/util.h>
|
|
@@ -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) = .; \
|
|
} \
|