diff --git a/base-mb/include/base/native_types.h b/base-mb/include/base/native_types.h index 65a71d6c9..5e46a0551 100755 --- a/base-mb/include/base/native_types.h +++ b/base-mb/include/base/native_types.h @@ -46,16 +46,22 @@ namespace Genode { struct Native_config { + enum { + CONTEXT_AREA_VIRTUAL_BASE = 0x40000000, + CONTEXT_AREA_VIRTUAL_SIZE = 0x10000000, + CONTEXT_VIRTUAL_SIZE = 0x00100000, + }; + /** * Thread-context area configuration. */ - static addr_t context_area_virtual_base() { return 0x40000000UL; } - static addr_t context_area_virtual_size() { return 0x10000000UL; } + static addr_t context_area_virtual_base() { return CONTEXT_AREA_VIRTUAL_BASE; } + static addr_t context_area_virtual_size() { return CONTEXT_AREA_VIRTUAL_SIZE; } /** * Size of virtual address region holding the context of one thread */ - static addr_t context_virtual_size() { return 0x00100000UL; } + static addr_t context_virtual_size() { return CONTEXT_VIRTUAL_SIZE; } }; struct Native_pd_args { }; diff --git a/base-mb/include/cpu/cpu_state.h b/base-mb/include/cpu/cpu_state.h new file mode 100644 index 000000000..4727a269b --- /dev/null +++ b/base-mb/include/cpu/cpu_state.h @@ -0,0 +1,36 @@ +/* + * \brief CPU state + * \author Martin Stein + * \date 2012-11-26 + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _BASE_MB__INCLUDE__CPU__CPU_STATE_H_ +#define _BASE_MB__INCLUDE__CPU__CPU_STATE_H_ + +/* Genode includes */ +#include + +namespace Genode { + + /** + * Basic CPU state + */ + struct Cpu_state + { + /** + * Registers + */ + addr_t sp; /* stack pointer */ + addr_t ip; /* instruction pointer */ + }; +} + +#endif /* _BASE_MB__INCLUDE__CPU__CPU_STATE_H_ */ + diff --git a/base-mb/include/cpu/string.h b/base-mb/include/cpu/string.h new file mode 100644 index 000000000..e4d2e70dd --- /dev/null +++ b/base-mb/include/cpu/string.h @@ -0,0 +1,54 @@ +/* + * \brief Cpu specifi memcpy + * \author Martin Stein + * \date 2012-11-27 + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _BASE_MB__INCLUDE__CPU__STRING_H_ +#define _BASE_MB__INCLUDE__CPU__STRING_H_ + +#include + +namespace Genode +{ + /** + * Copy memory block + * + * \param dst destination memory block + * \param src source memory block + * \param size number of bytes to copy + * + * \return Number of bytes not copied + */ + inline size_t memcpy_cpu(void *dst, const void *src, size_t size) + { + unsigned char *d = (unsigned char *)dst, *s = (unsigned char *)src; + + /* check 4 byte; alignment */ + size_t d_align = (size_t)d & 0x3; + size_t s_align = (size_t)s & 0x3; + + /* at least 32 bytes, 4 byte aligned, same alignment */ + if (size < 32 || (d_align ^ s_align)) + return size; + + /* copy to 4 byte alignment */ + for (size_t i = 0; i < s_align; i++, *d++ = *s++, size--); + + /* copy words */ + uint32_t * dw = (uint32_t *)d; + uint32_t * sw = (uint32_t *)s; + for (; size >= 4; size -= 4, dw++, sw++) *dw = *sw; + + return size; + } +} + +#endif /* _BASE_MB__INCLUDE__CPU__STRING_H_ */ diff --git a/base-mb/src/base/thread/thread.cc b/base-mb/src/base/thread/thread.cc index 9eddac2c4..9beb0a755 100644 --- a/base-mb/src/base/thread/thread.cc +++ b/base-mb/src/base/thread/thread.cc @@ -31,6 +31,8 @@ namespace Genode { Ram_session *env_context_area_ram_session(); } +static addr_t context_virtual_base_mask() { + return ~(Native_config::context_virtual_size() - 1); } /****************************** ** Thread-context allocator ** @@ -45,7 +47,7 @@ Thread_base::Context *Thread_base::Context_allocator::base_to_context(addr_t bas addr_t Thread_base::Context_allocator::addr_to_base(void *addr) { - return ((addr_t)addr) & CONTEXT_VIRTUAL_BASE_MASK; + return ((addr_t)addr) & context_virtual_base_mask(); } @@ -205,3 +207,9 @@ Thread_base::~Thread_base() _deinit_platform_thread(); _free_context(); } + +void Thread_base::join() +{ + _join_lock.lock(); +} + diff --git a/base-mb/src/core/context_area.cc b/base-mb/src/core/context_area.cc index 3c235c049..4c38c58c0 100644 --- a/base-mb/src/core/context_area.cc +++ b/base-mb/src/core/context_area.cc @@ -49,7 +49,7 @@ class Context_area_rm_session : public Rm_session */ Local_addr attach(Dataspace_capability ds_cap, size_t size, off_t offset, - bool use_local_addr, Local_addr local_addr) + bool use_local_addr, Local_addr local_addr, bool) { Dataspace_component *ds = context_ds[ds_cap.local_name()]; if (!ds) { @@ -105,7 +105,7 @@ class Context_area_ram_session : public Ram_session } context_ds[i] = new (platform()->core_mem_alloc()) - Dataspace_component(size, 0, (addr_t)phys_base, false, true); + Dataspace_component(size, 0, (addr_t)phys_base, false, true, 0); /* * We do not manage the dataspace via an entrypoint because it will diff --git a/base-mb/src/core/cpu_session_support.cc b/base-mb/src/core/cpu_session_support.cc new file mode 100644 index 000000000..df0ff7414 --- /dev/null +++ b/base-mb/src/core/cpu_session_support.cc @@ -0,0 +1,27 @@ +/* + * \brief Platform specific parts of CPU session + * \author Martin Stein + * \date 2012-11-27 + */ + +/* + * Copyright (C) 2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +/* Genode includes */ +#include + +/* core includes */ +#include + +using namespace Genode; + + +Ram_dataspace_capability Cpu_session_component::utcb(Thread_capability) { + PDBG("Not implemented"); + return Ram_dataspace_capability(); +}; + diff --git a/base-mb/src/core/include/platform_pd.h b/base-mb/src/core/include/platform_pd.h index 1de83fdbb..3e131efc2 100755 --- a/base-mb/src/core/include/platform_pd.h +++ b/base-mb/src/core/include/platform_pd.h @@ -56,17 +56,20 @@ namespace Genode { addr_t context_offset_mask() { return ~context_base_mask(); } - addr_t max_context_id { - return context_area_size()/context_size()-1; - } + + enum { + CONTEXT_SIZE = Native_config::CONTEXT_VIRTUAL_SIZE, + CONTEXT_AREA_SIZE = Native_config::CONTEXT_AREA_VIRTUAL_SIZE, + MAX_CONTEXT_ID = CONTEXT_AREA_SIZE / CONTEXT_SIZE - 1 + }; Native_process_id _pid; - Native_thread_id owner_tid_by_context_id[max_context_id()+1]; + Native_thread_id owner_tid_by_context_id[MAX_CONTEXT_ID + 1]; void _free_context(Native_thread_id const & t) { - for (Context_id cid = 0; cid <= max_context_id(); cid++) { + for (Context_id cid = 0; cid <= MAX_CONTEXT_ID; cid++) { if (owner_tid_by_context_id[cid] == t) { owner_tid_by_context_id[cid] = 0; } @@ -83,7 +86,7 @@ namespace Genode { { static bool const verbose = false; - if ((unsigned)User::MAX_THREAD_ID>(unsigned)max_context_id()) { + if ((unsigned)User::MAX_THREAD_ID>(unsigned)MAX_CONTEXT_ID) { PERR("More threads allowed than context areas available"); return; } @@ -125,7 +128,7 @@ namespace Genode { Context *context_by_tid(Native_thread_id tid) { - for (unsigned cid = 0; cid <= max_context_id(); cid++) + for (unsigned cid = 0; cid <= MAX_CONTEXT_ID; cid++) if (owner_tid_by_context_id[cid] == tid) return context(cid); @@ -139,7 +142,7 @@ namespace Genode { if (!cid_if_context_address(a, &cid)) return false; - if (cid > max_context_id()) { + if (cid > MAX_CONTEXT_ID) { PERR("Context ID %i out of range", (unsigned int)cid); return false; } @@ -152,7 +155,7 @@ namespace Genode { return false; } - addr_t offset = a & CONTEXT_OFFSET_MASK; + addr_t offset = a & context_offset_mask(); Context *context = (Context *)(context_size() - sizeof(Context)); if ((void*)offset >= &context->utcb) { @@ -171,7 +174,7 @@ namespace Genode { { static bool const verbose = false; - if (cid > max_context_id()) + if (cid > MAX_CONTEXT_ID) return 0; if (owner_tid_by_context_id[cid]){ @@ -193,21 +196,21 @@ namespace Genode { * First thread is assumed to be the main thread and gets last * context-area by convention */ - if (!owner_tid_by_context_id[max_context_id()]){ - owner_tid_by_context_id[max_context_id()] = tid; + if (!owner_tid_by_context_id[MAX_CONTEXT_ID]){ + owner_tid_by_context_id[MAX_CONTEXT_ID] = tid; if (verbose) PDBG("Thread %i owns Context %i (0x%p) of Protection Domain %i", - tid, max_context_id(), context(max_context_id()), _pid); + tid, MAX_CONTEXT_ID, context(MAX_CONTEXT_ID), _pid); - return context(max_context_id()); + return context(MAX_CONTEXT_ID); } - for (unsigned i = 0; i <= max_context_id() - 1; i++) { + for (unsigned i = 0; i <= MAX_CONTEXT_ID - 1; i++) { if (!owner_tid_by_context_id[i]) { owner_tid_by_context_id[i] = tid; if (verbose) PDBG("Thread %i owns Context %i (0x%p) of Protection Domain %i", - tid, max_context_id(), context(max_context_id()), _pid); + tid, MAX_CONTEXT_ID, context(MAX_CONTEXT_ID), _pid); return context(i); } } @@ -247,7 +250,7 @@ namespace Genode { */ void free_context(Context_id const & c) { - if (c > max_context_id()) { return; } + if (c > MAX_CONTEXT_ID) { return; } owner_tid_by_context_id[c] = Kernel::INVALID_THREAD_ID; } diff --git a/base-mb/src/core/target.inc b/base-mb/src/core/target.inc index 75923ddd3..9a0b275ca 100755 --- a/base-mb/src/core/target.inc +++ b/base-mb/src/core/target.inc @@ -17,6 +17,7 @@ SRC_CC = \ platform.cc \ platform_services.cc \ platform_thread.cc \ + cpu_session_support.cc \ ram_session_component.cc \ ram_session_support.cc \ rm_session_component.cc \ diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/atomic.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/atomic.s index 8eb8cec02..7351fa5a4 100755 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/atomic.s +++ b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/atomic.s @@ -11,8 +11,6 @@ * under the terms of the GNU General Public License version 2. */ -.include "linker_commands.s" - .global _atomic_cmpxchg @@ -24,7 +22,10 @@ * it is bothsides aligned - so that no common functions could gain * interruptsave status because it were linked inside this page too */ -_BEGIN_ATOMIC_OPS +.section ".Atomic_ops" +.global _atomic_ops_begin +.align 12 +_atomic_ops_begin: /** * Atomic compare and exchange, see cmpxchg @@ -86,7 +87,7 @@ _atomic_syscall_yield: addik r1, r1, +2*4 bri _atomic_cmpxchg_yield_return -_END_ATOMIC_OPS - - +.global _atomic_ops_end +.align 12 +_atomic_ops_end: diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0.s index 488afdd47..9dcf377e7 100755 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0.s +++ b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0.s @@ -4,9 +4,6 @@ * \date 21.06.2010 */ -.include "linker_commands.s" -.include "errors.s" - .extern _main .global _main_utcb_addr @@ -22,7 +19,10 @@ .endm -_BEGIN_ELF_ENTRY_CODE +/* _BEGIN_ELF_ENTRY_CODE */ +.global _start +.section ".Elf_entry" +_start: _INIT_MAIN_UTCB _INIT_MAIN_STACK @@ -30,10 +30,12 @@ _BEGIN_ELF_ENTRY_CODE bralid r15, _main or r0, r0, r0 - _ERROR_NOTHING_LEFT_TO_CALL_BY_CRT0 + /* _ERROR_NOTHING_LEFT_TO_CALL_BY_CRT0 */ + brai 0x99000001 -_BEGIN_READABLE_WRITEABLE +/* _BEGIN_READABLE_WRITEABLE */ +.section ".bss" .align 4 _main_utcb_addr: .space 1*4 diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0_kernel.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0_kernel.s index 72b2347ab..b167b3ebc 100755 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0_kernel.s +++ b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/crt0_kernel.s @@ -11,10 +11,6 @@ * under the terms of the GNU General Public License version 2. */ -/* platform includes */ -.include "errors.s" -.include "linker_commands.s" - /* * To be compatible to crt0.s for common programs, * the following labels are used for roottasks main-thread @@ -73,15 +69,20 @@ /* linker links this section to kernelbase + offset 0 */ -_BEGIN_ELF_ENTRY_CODE +/* _BEGIN_ELF_ENTRY_CODE */ +.global _start +.section ".Elf_entry" +_start: _CALL_KERNEL__USES_R15 _CALL_AFTER_KERNEL__USES_R3_R15 - _ERROR_NOTHING_LEFT_TO_CALL_BY_CRT0 + + /* ERROR_NOTHING_LEFT_TO_CALL_BY_CRT0 */ + brai 0x99000001 - -_BEGIN_READABLE_WRITEABLE +/* _BEGIN_READABLE_WRITEABLE */ +.section ".bss" .align 4 _main_utcb_addr: .space 4*1 diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/errors.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/errors.s deleted file mode 100755 index d2d59554a..000000000 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/errors.s +++ /dev/null @@ -1,23 +0,0 @@ -/* - * \brief Assembler Errors - * \author Martin Stein - * \date 2010-10-06 - * - * Grouped into one include file for better management and identification - */ - -/* - * Copyright (C) 2010-2012 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU General Public License version 2. - */ - -.macro _ERROR_NOTHING_LEFT_TO_CALL_BY_CRT0 - brai 0x99000001 -.endm - - -.macro _ERROR_UNKNOWN_USERLAND_BLOCKING_TYPE - brai 0x99000003 -.endm diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/exec_context.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/exec_context.s deleted file mode 100755 index 4e02ebc80..000000000 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/exec_context.s +++ /dev/null @@ -1,527 +0,0 @@ -/* - * \brief Access to execution context internals - * \author Martin Stein - * \date 2010-10-06 - */ - -/* - * Copyright (C) 2010-2012 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU General Public License version 2. - */ - - -/********************************************************** - ** Overwrite specific parts of the execution context ** - ** ** - ** \param r15 base address of the execution context ** - ** \param (rx) value that shall be written - except ** - ** r1, rpc and r15 - the register itself, ** - ** otherwise use "prestore" labels or r3 ** - **********************************************************/ - -.macro _SAVE_R2_TO_R13_TO_CONTEXT__USES_R2_TO_R13_R15 - swi r2, r15, 2*4 - swi r3, r15, 3*4 - swi r4, r15, 4*4 - swi r5, r15, 5*4 - swi r6, r15, 6*4 - swi r7, r15, 7*4 - swi r8, r15, 8*4 - swi r9, r15, 9*4 - swi r10, r15, 10*4 - swi r11, r15, 11*4 - swi r12, r15, 12*4 - swi r13, r15, 13*4 -.endm - - -.macro _SAVE_R18_TO_R31_TO_CONTEXT__TO_R15_R18_TO_R31 - swi r18, r15, 18*4 - swi r19, r15, 19*4 - swi r20, r15, 20*4 - swi r21, r15, 21*4 - swi r22, r15, 22*4 - swi r23, r15, 23*4 - swi r24, r15, 24*4 - swi r25, r15, 25*4 - swi r26, r15, 26*4 - swi r27, r15, 27*4 - swi r28, r15, 28*4 - swi r29, r15, 29*4 - swi r30, r15, 30*4 - swi r31, r15, 31*4 -.endm - - -.macro _SAVE_PRESTORED_R1_R15_RPC_TO_CONTEXT__USES_R3_R15 - lwi r3, r0, _prestored_r1 - swi r3, r15, 1*4 - lwi r3, r0, _prestored_r15 - swi r3, r15, 15*4 - lwi r3, r0, _prestored_rpc - swi r3, r15, 32*4 -.endm - - -.macro _SAVE_RMSR_TO_CONTEXT__USES_R3_R15 - mfs r3, rmsr - swi r3, r15, 33*4 -.endm - - -.macro _SAVE_RPID_TO_CONTEXT__USES_R3_R15 - mfs r3, rpid - swi r3, r15, 36*4 -.endm - - -.macro _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 - swi r3, r15, 37*4 -.endm - - -.macro _SAVE_RESR_TO_CONTEXT__USES_R3_R15 - mfs r3, resr - swi r3, r15, 35*4 -.endm - - -.macro _SAVE_REAR_TO_CONTEXT__USES_R3_R15 - mfs r3, rear - swi r3, r15, 34*4 -.endm - - - -/*********************************************************** - ** Load a specifics values from the execution context ** - ** ** - ** \param r15 base address of the execution context ** - ** \return (rx) value that has been loaded - except ** - ** r1, rpc and r15 - the register itself, ** - ** otherwise use "preload" labels or r3 ** - ***********************************************************/ - -.macro _LOAD_R2_TO_R13_FROM_CONTEXT__USES_R2_TO_R13_R15 - lwi r2, r15, 2*4 - lwi r3, r15, 3*4 - lwi r4, r15, 4*4 - lwi r5, r15, 5*4 - lwi r6, r15, 6*4 - lwi r7, r15, 7*4 - lwi r8, r15, 8*4 - lwi r9, r15, 9*4 - lwi r10, r15, 10*4 - lwi r11, r15, 11*4 - lwi r12, r15, 12*4 - lwi r13, r15, 13*4 -.endm - - -.macro _LOAD_R18_TO_R31_FROM_CONTEXT__TO_R15_R18_TO_R31 - lwi r18, r15, 18*4 - lwi r19, r15, 19*4 - lwi r20, r15, 20*4 - lwi r21, r15, 21*4 - lwi r22, r15, 22*4 - lwi r23, r15, 23*4 - lwi r24, r15, 24*4 - lwi r25, r15, 25*4 - lwi r26, r15, 26*4 - lwi r27, r15, 27*4 - lwi r28, r15, 28*4 - lwi r29, r15, 29*4 - lwi r30, r15, 30*4 - lwi r31, r15, 31*4 -.endm - - -.macro _PRELOAD_R1_R15_RPC_FROM_CONTEXT__USES_R3_R15 - lwi r3, r15, 1*4 - swi r3, r0, _preloaded_r1 - lwi r3, r15, 15*4 - swi r3, r0, _preloaded_r15 - lwi r3, r15, 32*4 - swi r3, r0, _preloaded_rpc -.endm - - -.macro _LOAD_RMSR_FROM_CONTEXT__USES_R3_R4_R15 - lwi r3, r15, 33*4 - mts rmsr, r3 - _SYNCHRONIZING_OP -.endm - - -.macro _LOAD_RPID_FROM_CONTEXT__USES_R3_R15 - lwi r3, r15, 36*4 - mts rpid, r3 - _SYNCHRONIZING_OP -.endm - - -.macro _LOAD_BLOCKING_TYPE_FROM_CONTEXT__USES_R3_R15 - lwi r3, r15, 37*4 -.endm - - - -.macro _VARIABLES_TO_WRITE_EXEC_CONTEXT - .align 4 - _prestored_r1: .space 4 - .align 4 - _prestored_r15: .space 4 - .align 4 - _prestored_rpc: .space 4 -.endm - - -.macro _VARIABLES_TO_READ_EXEC_CONTEXT - .align 4 - _preloaded_r1: .space 4 - .align 4 - _preloaded_r15: .space 4 - .align 4 - _preloaded_rpc: .space 4 -.endm - - - - -/** - * Macros to print out context content - * - * (any value hexadecimal and padded with - * leading zeros to 8 digits) - * output has following format: - * - * r1 r2 r3 r4 - * ... - * ... - * r28 r29 r30 r31 - * rmsr - * - */ - - -.macro _4BIT_SHIFT_RIGHT__ARG_30__RET_30 - srl r30, r30 - srl r30, r30 - srl r30, r30 - srl r30, r30 -.endm - - -.macro _PRINT_ASCII8__ARG_30 - swi r30, r0, 0x84000004 -.endm - - -.macro _PRINT_HEX8__ARG_30 - swi r29, r0, _print_hex8__buffer_0 - - andi r30, r30, 0xf - rsubi r29, r30, 9 - addi r30, r30, 48 - - bgei r29, 8 - addi r30, r30, 39 - _PRINT_ASCII8__ARG_30 - - lwi r29, r0, _print_hex8__buffer_0 -.endm - - -.macro _PRINT_HEX32__ARG_31 - swi r31, r0, _print_hex32__buffer_1 - swi r30, r0, _print_hex32__buffer_0 - - lwi r31, r0, _print_hex32__buffer_1-3 - add r30, r31, r0 - _4BIT_SHIFT_RIGHT__ARG_30__RET_30 - _PRINT_HEX8__ARG_30 - add r30, r31, r0 - _PRINT_HEX8__ARG_30 - - lwi r31, r0, _print_hex32__buffer_1-2 - add r30, r31, r0 - _4BIT_SHIFT_RIGHT__ARG_30__RET_30 - _PRINT_HEX8__ARG_30 - add r30, r31, r0 - _PRINT_HEX8__ARG_30 - - lwi r31, r0, _print_hex32__buffer_1-1 - add r30, r31, r0 - _4BIT_SHIFT_RIGHT__ARG_30__RET_30 - _PRINT_HEX8__ARG_30 - add r30, r31, r0 - _PRINT_HEX8__ARG_30 - - lwi r31, r0, _print_hex32__buffer_1-0 - add r30, r31, r0 - _4BIT_SHIFT_RIGHT__ARG_30__RET_30 - _PRINT_HEX8__ARG_30 - add r30, r31, r0 - _PRINT_HEX8__ARG_30 - - lwi r31, r0, _print_hex32__buffer_1 - lwi r30, r0, _print_hex32__buffer_0 -.endm - - -.macro _PRINT_ASCII_SPACE - swi r30, r0, _print_ascii_space__buffer_0 - - addi r30, r0, 32 - _PRINT_ASCII8__ARG_30 - - lwi r30, r0, _print_ascii_space__buffer_0 -.endm - - -.macro _PRINT_ASCII_BREAK - swi r30, r0, _print_ascii_break__buffer_0 - - addi r30, r0, 13 - _PRINT_ASCII8__ARG_30 - addi r30, r0, 10 - _PRINT_ASCII8__ARG_30 - - lwi r30, r0, _print_ascii_break__buffer_0 -.endm - - -.macro _PRINT_ASCII_STOP - swi r30, r0, _print_ascii_stop__buffer_0 - - addi r30, r0, 115 - _PRINT_ASCII8__ARG_30 - addi r30, r0, 116 - _PRINT_ASCII8__ARG_30 - addi r30, r0, 111 - _PRINT_ASCII8__ARG_30 - addi r30, r0, 112 - _PRINT_ASCII8__ARG_30 - - _PRINT_ASCII_BREAK - - lwi r30, r0, _print_ascii_stop__buffer_0 -.endm - - -.macro _PRINT_ASCII_RUN - swi r30, r0, _print_ascii_run__buffer_0 - - addi r30, r0, 114 - _PRINT_ASCII8__ARG_30 - addi r30, r0, 117 - _PRINT_ASCII8__ARG_30 - addi r30, r0, 110 - _PRINT_ASCII8__ARG_30 - - _PRINT_ASCII_BREAK - - lwi r30, r0, _print_ascii_run__buffer_0 -.endm - - -.macro _PRINT_CONTEXT - swi r31, r0, _print_context__buffer_0 - - _PRINT_ASCII_BREAK - - - add r31, r0, r0 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r1 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r2 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r3 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r4 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r5 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r6 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r7 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_BREAK - - - add r31, r0, r8 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r9 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r10 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r11 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r12 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r13 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r14 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r15 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_BREAK - - - add r31, r0, r16 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r17 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r18 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r19 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r20 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r21 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r22 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r23 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_BREAK - - - add r31, r0, r24 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r25 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r26 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r27 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r28 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r29 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - add r31, r0, r30 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - lwi r31, r0, _print_context__buffer_0 - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_BREAK - - - mfs r31, rmsr - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - lwi r31, r0, _current_context_label - _PRINT_HEX32__ARG_31 - _PRINT_ASCII_SPACE - - - lwi r31, r0, _print_context__buffer_0 -.endm - - -.macro _PRINT_ASCII_STOP__VARIABLES - .align 4 - _print_ascii_stop__buffer_0: .space 1*4 -.endm - - -.macro _PRINT_ASCII_RUN__VARIABLES - .align 4 - _print_ascii_run__buffer_0: .space 1*4 -.endm - - -.macro _PRINT_ASCII_BREAK__VARIABLES - .align 4 - _print_ascii_break__buffer_0: .space 1*4 -.endm - - -.macro _PRINT_ASCII_SPACE__VARIABLES - .align 4 - _print_ascii_space__buffer_0: .space 1*4 -.endm - - -.macro _PRINT_HEX8__VARIABLES - .align 4 - _print_hex8__buffer_0: .space 1*4 - .align 4 - _print_hex8__buffer_1: .space 1*4 -.endm - - -.macro _PRINT_HEX32__VARIABLES - .align 4 - _print_hex32__buffer_0: .space 1*4 - .align 4 - _print_hex32__buffer_1: .space 1*4 -.endm - - -.macro _PRINT_CONTEXT__VARIABLES - .align 4 - _print_context__buffer_0: .space 1*4 -.endm - - - diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/linker_commands.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/linker_commands.s deleted file mode 100644 index baf1b04d9..000000000 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/linker_commands.s +++ /dev/null @@ -1,34 +0,0 @@ -.macro _BEGIN_ELF_ENTRY_CODE - .global _start - .section ".Elf_entry" - - _start: -.endm - - -.macro _BEGIN_ATOMIC_OPS - .section ".Atomic_ops" - .global _atomic_ops_begin - .align 12 - _atomic_ops_begin: -.endm - - -.macro _END_ATOMIC_OPS - .global _atomic_ops_end - .align 12 - _atomic_ops_end: -.endm - - -.macro _BEGIN_READABLE_EXECUTABLE - .section ".text" -.endm - - -.macro _BEGIN_READABLE_WRITEABLE - .section ".bss" -.endm - - - diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/special_registers.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/special_registers.s deleted file mode 100755 index 941a93c8d..000000000 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/include/special_registers.s +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Assembler macros for machine status register access - * - * \author Martin Stein - * \date 2010-10-05 - */ - -/* - * Copyright (C) 2010-2012 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU General Public License version 2. - */ - -.macro _SYNCHRONIZING_OP - bri 4 -.endm - - -.macro _AWAIT_DELAY_OP - or r0, r0, r0 -.endm - - -.macro _ENABLE_EXCEPTIONS - msrset r0, 0x100 - _SYNCHRONIZING_OP -.endm - - -.macro _DISABLE_EXCEPTIONS - msrclr r0, 0x100 - _SYNCHRONIZING_OP -.endm - - -.macro _ENABLE_INTERRUPTS - msrset r0, 0x002 - _SYNCHRONIZING_OP -.endm - - -.macro _DISABLE_INTERRUPTS - msrclr r0, 0x002 - _SYNCHRONIZING_OP -.endm - - -.macro _RELEASE_EXCEPTION - msrclr r0, 0x200 - _SYNCHRONIZING_OP -.endm - - -.macro _RELEASE_BREAK - msrclr r0, 0x008 - _SYNCHRONIZING_OP -.endm - diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/kernel_entry.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/kernel_entry.s index 924eaf329..7618d7a31 100755 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/kernel_entry.s +++ b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/kernel_entry.s @@ -14,12 +14,6 @@ */ -.include "special_registers.s" -.include "errors.s" -.include "exec_context.s" -.include "linker_commands.s" - - /* We have to know wich userland context was the last that was executed */ .extern _userland_context @@ -83,7 +77,9 @@ .macro _BLOCKING_TYPE_IS_INTERRUPT__USES_R3_R15 addi r3, r0, 1 lwi r15, r0, _userland_context - _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 + + /* _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 */ + swi r3, r15, 37*4 .endm @@ -103,7 +99,9 @@ .macro _BLOCKING_TYPE_IS_EXCEPTION__USES_R3_R15 addi r3, r0, 2 lwi r15, r0, _userland_context - _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 + + /* _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 */ + swi r3, r15, 37*4 .endm @@ -117,22 +115,68 @@ .macro _BLOCKING_TYPE_IS_SYSCALL__USES_R3_R15 addi r3, r0, 3 lwi r15, r0, _userland_context - _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 + + /* _SAVE_BLOCKING_TYPE_TO_CONTEXT__USES_R3_R15 */ + swi r3, r15, 37*4 .endm .macro _BACKUP_PRESTORED_CONTEXT__USES_R2_TO_R31 lwi r15, r0, _userland_context - _SAVE_R2_TO_R13_TO_CONTEXT__USES_R2_TO_R13_R15 - _SAVE_R18_TO_R31_TO_CONTEXT__TO_R15_R18_TO_R31 + /* _SAVE_R2_TO_R13_TO_CONTEXT__USES_R2_TO_R13_R15 */ + swi r2, r15, 2*4 + swi r3, r15, 3*4 + swi r4, r15, 4*4 + swi r5, r15, 5*4 + swi r6, r15, 6*4 + swi r7, r15, 7*4 + swi r8, r15, 8*4 + swi r9, r15, 9*4 + swi r10, r15, 10*4 + swi r11, r15, 11*4 + swi r12, r15, 12*4 + swi r13, r15, 13*4 - _SAVE_RPID_TO_CONTEXT__USES_R3_R15 - _SAVE_RMSR_TO_CONTEXT__USES_R3_R15 - _SAVE_RESR_TO_CONTEXT__USES_R3_R15 - _SAVE_REAR_TO_CONTEXT__USES_R3_R15 + /* _SAVE_R18_TO_R31_TO_CONTEXT__TO_R15_R18_TO_R31 */ + swi r18, r15, 18*4 + swi r19, r15, 19*4 + swi r20, r15, 20*4 + swi r21, r15, 21*4 + swi r22, r15, 22*4 + swi r23, r15, 23*4 + swi r24, r15, 24*4 + swi r25, r15, 25*4 + swi r26, r15, 26*4 + swi r27, r15, 27*4 + swi r28, r15, 28*4 + swi r29, r15, 29*4 + swi r30, r15, 30*4 + swi r31, r15, 31*4 - _SAVE_PRESTORED_R1_R15_RPC_TO_CONTEXT__USES_R3_R15 + /* _SAVE_RPID_TO_CONTEXT__USES_R3_R15 */ + mfs r3, rpid + swi r3, r15, 36*4 + + /* _SAVE_RMSR_TO_CONTEXT__USES_R3_R15 */ + mfs r3, rmsr + swi r3, r15, 33*4 + + /* _SAVE_RESR_TO_CONTEXT__USES_R3_R15 */ + mfs r3, resr + swi r3, r15, 35*4 + + /* _SAVE_REAR_TO_CONTEXT__USES_R3_R15 */ + mfs r3, rear + swi r3, r15, 34*4 + + /* _SAVE_PRESTORED_R1_R15_RPC_TO_CONTEXT__USES_R3_R15 */ + lwi r3, r0, _prestored_r1 + swi r3, r15, 1*4 + lwi r3, r0, _prestored_r15 + swi r3, r15, 15*4 + lwi r3, r0, _prestored_rpc + swi r3, r15, 32*4 .endm @@ -145,9 +189,8 @@ .endm - - -_BEGIN_READABLE_EXECUTABLE +/* _BEGIN_READABLE_EXECUTABLE */ +.section ".text" _interrupt_entry: @@ -197,13 +240,21 @@ _BEGIN_READABLE_EXECUTABLE -_BEGIN_READABLE_WRITEABLE +/* _BEGIN_READABLE_WRITEABLE */ +.section ".bss" .global _current_context_label .align 4 _current_context_label: .space 1*4 - _VARIABLES_TO_WRITE_EXEC_CONTEXT + /* _VARIABLES_TO_WRITE_EXEC_CONTEXT */ + .align 4 + _prestored_r1: .space 4 + .align 4 + _prestored_r15: .space 4 + .align 4 + _prestored_rpc: .space 4 + _MAY_BE_VERBOSE_VARIABLES diff --git a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/userland_entry.s b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/userland_entry.s index bd0d4d69f..97db15663 100755 --- a/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/userland_entry.s +++ b/base-mb/src/kernel/platforms/petalogix_s3adsp1800_mmu/userland_entry.s @@ -14,11 +14,6 @@ * under the terms of the GNU General Public License version 2. */ -.include "special_registers.s" -.include "errors.s" -.include "exec_context.s" -.include "linker_commands.s" - .global _userland_entry .global _userland_context @@ -73,13 +68,57 @@ .macro _PREPARE_CONTEXT__USES_R2_TO_R31 lwi r15, r0, _userland_context - _PRELOAD_R1_R15_RPC_FROM_CONTEXT__USES_R3_R15 + /* _PRELOAD_R1_R15_RPC_FROM_CONTEXT__USES_R3_R15 */ + lwi r3, r15, 1*4 + swi r3, r0, _preloaded_r1 + lwi r3, r15, 15*4 + swi r3, r0, _preloaded_r15 + lwi r3, r15, 32*4 + swi r3, r0, _preloaded_rpc - _LOAD_RPID_FROM_CONTEXT__USES_R3_R15 - _LOAD_RMSR_FROM_CONTEXT__USES_R3_R4_R15 + /* _LOAD_RPID_FROM_CONTEXT__USES_R3_R15 */ + lwi r3, r15, 36*4 + mts rpid, r3 - _LOAD_R2_TO_R13_FROM_CONTEXT__USES_R2_TO_R13_R15 - _LOAD_R18_TO_R31_FROM_CONTEXT__TO_R15_R18_TO_R31 + /* _SYNCHRONIZING_OP */ + bri 4 + + /* _LOAD_RMSR_FROM_CONTEXT__USES_R3_R4_R15 */ + lwi r3, r15, 33*4 + mts rmsr, r3 + + /* _SYNCHRONIZING_OP */ + bri 4 + + /* _LOAD_R2_TO_R13_FROM_CONTEXT__USES_R2_TO_R13_R15 */ + lwi r2, r15, 2*4 + lwi r3, r15, 3*4 + lwi r4, r15, 4*4 + lwi r5, r15, 5*4 + lwi r6, r15, 6*4 + lwi r7, r15, 7*4 + lwi r8, r15, 8*4 + lwi r9, r15, 9*4 + lwi r10, r15, 10*4 + lwi r11, r15, 11*4 + lwi r12, r15, 12*4 + lwi r13, r15, 13*4 + + /* _LOAD_R18_TO_R31_FROM_CONTEXT__TO_R15_R18_TO_R31 */ + lwi r18, r15, 18*4 + lwi r19, r15, 19*4 + lwi r20, r15, 20*4 + lwi r21, r15, 21*4 + lwi r22, r15, 22*4 + lwi r23, r15, 23*4 + lwi r24, r15, 24*4 + lwi r25, r15, 25*4 + lwi r26, r15, 26*4 + lwi r27, r15, 27*4 + lwi r28, r15, 28*4 + lwi r29, r15, 29*4 + lwi r30, r15, 30*4 + lwi r31, r15, 31*4 .endm @@ -127,7 +166,12 @@ lwi r1, r0, _preloaded_r1 lwi r15, r0, _preloaded_r15 - _ENABLE_EXCEPTIONS + /* _ENABLE_EXCEPTIONS */ + msrset r0, 0x100 + + /*_SYNCHRONIZING_OP */ + bri 4 + _START_KERNEL_TIMER rtid r14, 0 @@ -137,7 +181,9 @@ .macro _SWITCH_USERLAND_BLOCKING_TYPE__USES_R3_R15 lwi r15, r0, _userland_context - _LOAD_BLOCKING_TYPE_FROM_CONTEXT__USES_R3_R15 + + /* _LOAD_BLOCKING_TYPE_FROM_CONTEXT__USES_R3_R15 */ + lwi r3, r15, 37*4 .endm @@ -165,7 +211,8 @@ .endm -_BEGIN_READABLE_EXECUTABLE +/* _BEGIN_READABLE_EXECUTABLE */ +.section ".text" _userland_entry: _SWITCH_USERLAND_BLOCKING_TYPE__USES_R3_R15 @@ -199,7 +246,9 @@ _BEGIN_READABLE_EXECUTABLE _end_case_initial: _case_default: - _ERROR_UNKNOWN_USERLAND_BLOCKING_TYPE + /* _ERROR_UNKNOWN_USERLAND_BLOCKING_TYPE */ + brai 0x99000003 + /* system halted */ _end_case_default: @@ -207,7 +256,8 @@ _BEGIN_READABLE_EXECUTABLE _end_userland_entry: -_BEGIN_READABLE_WRITEABLE +/* _BEGIN_READABLE_WRITEABLE */ +.section ".bss" .align 4 _kernel_timer_ctrl: .space 1*4 @@ -215,7 +265,14 @@ _BEGIN_READABLE_WRITEABLE _kernel_timer_ctrl_start: .space 1*4 _START_KERNEL_TIMER__VARIABLES - _VARIABLES_TO_READ_EXEC_CONTEXT + /* _VARIABLES_TO_READ_EXEC_CONTEXT */ + .align 4 + _preloaded_r1: .space 4 + .align 4 + _preloaded_r15: .space 4 + .align 4 + _preloaded_rpc: .space 4 + _MAY_BE_VERBOSE_VARIABLES .align 4 diff --git a/base/src/platform/arm/crt0.s b/base/src/platform/arm/crt0.s index ab06a3b29..a948938aa 100644 --- a/base/src/platform/arm/crt0.s +++ b/base/src/platform/arm/crt0.s @@ -36,3 +36,10 @@ _stack_low: .globl _stack_high _stack_high: + /* + * Symbol referenced by ldso's crt0.s, which is needed by base-hw only. + * It is defined here merely to resolve the symbol for non-base-hw + * platforms. + */ + .globl _main_utcb + _main_utcb: .long 0