diff --git a/headers/private/kernel/commpage.h b/headers/private/kernel/commpage.h index 65d1b8cf3e..2840058235 100644 --- a/headers/private/kernel/commpage.h +++ b/headers/private/kernel/commpage.h @@ -5,6 +5,7 @@ #ifndef _KERNEL_COMMPAGE_H #define _KERNEL_COMMPAGE_H +#include #include #include @@ -17,6 +18,7 @@ extern "C" { status_t commpage_init(void); void* allocate_commpage_entry(int entry, size_t size); void* fill_commpage_entry(int entry, const void* copyFrom, size_t size); +image_id get_commpage_image(); status_t arch_commpage_init(void); // implemented in the architecture specific part diff --git a/src/system/kernel/arch/x86/arch_commpage.cpp b/src/system/kernel/arch/x86/arch_commpage.cpp index 7a8ec60fe7..908542076b 100644 --- a/src/system/kernel/arch/x86/arch_commpage.cpp +++ b/src/system/kernel/arch/x86/arch_commpage.cpp @@ -11,6 +11,7 @@ #include #include +#include #include @@ -90,6 +91,12 @@ initialize_commpage_syscall(void) size_t len = (size_t)((addr_t)syscallCodeEnd - (addr_t)syscallCode); fill_commpage_entry(COMMPAGE_ENTRY_X86_SYSCALL, syscallCode, len); + // add syscall to the commpage image + image_id image = get_commpage_image(); + elf_add_memory_image_symbol(image, "commpage_syscall", + ((addr_t*)USER_COMMPAGE_ADDR)[COMMPAGE_ENTRY_X86_SYSCALL], len, + B_SYMBOL_TYPE_TEXT); + return B_OK; } diff --git a/src/system/kernel/arch/x86/arch_cpu.cpp b/src/system/kernel/arch/x86/arch_cpu.cpp index 7b416d3f2e..ca2f1dc336 100644 --- a/src/system/kernel/arch/x86/arch_cpu.cpp +++ b/src/system/kernel/arch/x86/arch_cpu.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -607,9 +608,16 @@ arch_cpu_init_post_modules(kernel_args *args) } // put the optimized functions into the commpage - fill_commpage_entry(COMMPAGE_ENTRY_X86_MEMCPY, (const void *)gOptimizedFunctions.memcpy, - (addr_t)gOptimizedFunctions.memcpy_end - - (addr_t)gOptimizedFunctions.memcpy); + size_t memcpyLen = (addr_t)gOptimizedFunctions.memcpy_end + - (addr_t)gOptimizedFunctions.memcpy; + fill_commpage_entry(COMMPAGE_ENTRY_X86_MEMCPY, + (const void*)gOptimizedFunctions.memcpy, memcpyLen); + + // add the functions to the commpage image + image_id image = get_commpage_image(); + elf_add_memory_image_symbol(image, "commpage_memcpy", + ((addr_t*)USER_COMMPAGE_ADDR)[COMMPAGE_ENTRY_X86_MEMCPY], memcpyLen, + B_SYMBOL_TYPE_TEXT); return B_OK; } diff --git a/src/system/kernel/commpage.cpp b/src/system/kernel/commpage.cpp index db237bfd82..4ed533dd6b 100644 --- a/src/system/kernel/commpage.cpp +++ b/src/system/kernel/commpage.cpp @@ -9,6 +9,7 @@ #include +#include #include #include @@ -18,6 +19,7 @@ static area_id sUserCommPageArea; static addr_t* sCommPageAddress; static addr_t* sUserCommPageAddress; static void* sFreeCommPageSpace; +static image_id sCommPageImage; #define ALIGN_ENTRY(pointer) (void*)ROUNDUP((addr_t)(pointer), 8) @@ -44,6 +46,13 @@ fill_commpage_entry(int entry, const void* copyFrom, size_t size) } +image_id +get_commpage_image() +{ + return sCommPageImage; +} + + status_t commpage_init(void) { @@ -68,6 +77,13 @@ commpage_init(void) // the next slot to allocate space is after the table sFreeCommPageSpace = ALIGN_ENTRY(&sCommPageAddress[COMMPAGE_TABLE_ENTRIES]); + // create the image for the commpage + sCommPageImage = elf_create_memory_image("commpage", USER_COMMPAGE_ADDR, + COMMPAGE_SIZE, 0, 0); + elf_add_memory_image_symbol(sCommPageImage, "commpage_table", + USER_COMMPAGE_ADDR, COMMPAGE_TABLE_ENTRIES * sizeof(addr_t), + B_SYMBOL_TYPE_DATA); + arch_commpage_init(); return B_OK;