Changeset 6b781c0 in mainline for uspace


Ignore:
Timestamp:
2007-06-08T15:02:49Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c03ee1c
Parents:
3ee8a075
Message:

Merge arm32 into trunk.

Location:
uspace
Files:
1 added
21 edited
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/kbd/Makefile

    r3ee8a075 r6b781c0  
    3333SOFTINT_PREFIX = ../softint
    3434include $(LIBC_PREFIX)/Makefile.toolchain
     35include ../../Makefile.config
    3536
    3637CFLAGS += -Iinclude -I../libadt/include
     
    7172                genarch/src/kbd.c
    7273endif
     74ifeq ($(ARCH), arm32)
     75ifeq ($(MACHINE), gxemul_testarm)
     76        ARCH_SOURCES += \
     77                arch/$(ARCH)/src/kbd_gxemul.c
     78endif
     79endif
    7380
    7481
  • uspace/kbd/arch/arm32/include/kbd.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Josef Cejka
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup kbdarm32 arm32
    30  * @brief       HelenOS arm32 arch dependent parts of uspace keyboard handler.
    31  * @ingroup  kbd
     29/** @addtogroup kbdarm32
    3230 * @{
    3331 */
    3432/** @file
     33 *  @brief Empty.
    3534 */
    3635
  • uspace/kbd/arch/arm32/src/kbd.c

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Martin Decky
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3333 */
    3434/** @file
     35 *  @brief Empty, required by generic Makefile.
    3536 */
    3637
    37 #include <arch/kbd.h>
    38 #include <ipc/ipc.h>
    39 #include <sysinfo.h>
    40 #include <kbd.h>
    41 #include <keys.h>
    42 
    43 int kbd_arch_init(void)
    44 {
    45         return 0;
    46 }
    47 
    48 
    49 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
    50 {
    51         return 1;
    52 }
    5338
    5439/** @}
  • uspace/libc/arch/arm32/Makefile.inc

    r3ee8a075 r6b781c0  
    11#
    2 # Copyright (c) 2005 Martin Decky
     2# Copyright (c) 2007 Michal Kebrt, Pavel Jancik
    33# All rights reserved.
    44#
     
    3232TARGET = arm-linux-gnu
    3333TOOLCHAIN_DIR = /usr/local/arm/bin
    34 CFLAGS +=
     34CFLAGS += -ffixed-r9 -mtp=soft
    3535LFLAGS += -N ../softint/libsoftint.a
    3636AFLAGS +=
     
    3939                arch/$(ARCH)/src/psthread.S \
    4040                arch/$(ARCH)/src/thread.c \
    41                 arch/$(ARCH)/src/dummy.S
     41                arch/$(ARCH)/src/eabi.S
    4242
    4343BFD_NAME = elf32-little
  • uspace/libc/arch/arm32/_link.ld.in

    r3ee8a075 r6b781c0  
    88
    99SECTIONS {
    10         . = 0x2000;
     10        . = 0x1000;
    1111
    12         .init ALIGN(0x2000): SUBALIGN(0x2000) {
     12        .init ALIGN(0x1000): SUBALIGN(0x1000) {
    1313                *(.init);
    1414        } : text
    1515        .text : {
    1616                *(.text);
    17                 *(.rodata*);
     17        *(.rodata*);
    1818        } :text
    19 
    20         .got ALIGN(0x2000) : SUBALIGN(0x2000) {
    21                 _gp = .;
    22                 *(.got*);
    23         } :data
    24         .data : {
     19       
     20        .data ALIGN(0x1000) : SUBALIGN(0x1000) {
    2521                *(.opd);
    2622                *(.data .data.*);
    2723                *(.sdata);
    2824        } :data
     25
    2926        .tdata : {
    3027                _tdata_start = .;
     
    3229                _tdata_end = .;
    3330        } :data
     31
    3432        .tbss : {
    3533                _tbss_start = .;
     
    3735                _tbss_end = .;
    3836        } :data
     37
    3938        .bss : {
    4039                *(.sbss);
    4140                *(.scommon);
    42                 *(COMMON);
    43                 *(.bss);
     41        *(COMMON);
     42        *(.bss);
    4443        } :data
    45 
    46         . = ALIGN(0x2000);
     44       
     45        . = ALIGN(0x1000);
    4746        _heap = .;
    48  
     47       
    4948        /DISCARD/ : {
    5049                *(*);
    51         }
     50        }
     51
    5252}
  • uspace/libc/arch/arm32/include/atomic.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2005 Jakub Jermar
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3131 */
    3232/** @file
     33 *  @brief Atomic operations.
    3334 */
    3435
     
    3839/** Atomic addition.
    3940 *
    40  * @param val Atomic value.
    41  * @param imm Value to add.
     41 * @param val Where to add.
     42 * @param i   Value to be added.
    4243 *
    4344 * @return Value after addition.
    4445 */
    45 static inline long atomic_add(atomic_t *val, int imm)
     46static inline long atomic_add(atomic_t *val, int i)
    4647{
    47         /* TODO */
    48         return (val->count += imm);
     48        int ret;
     49        volatile long * mem = &(val->count);
     50
     51        asm volatile (
     52                "1:                 \n"
     53                "ldr r2, [%1]       \n"
     54                "add r3, r2, %2     \n"
     55                "str r3, %0         \n"
     56                "swp r3, r3, [%1]   \n"
     57                "cmp r3, r2         \n"
     58                "bne 1b             \n"
     59
     60                : "=m" (ret)
     61                : "r" (mem), "r" (i)
     62                : "r3", "r2"
     63        );
     64
     65        return ret;
    4966}
    5067
     68
     69/** Atomic increment.
     70 *
     71 * @param val Variable to be incremented.
     72 */
    5173static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); }
     74
     75
     76/** Atomic decrement.
     77 *
     78 * @param val Variable to be decremented.
     79 */
    5280static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); }
    5381
    54 static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; }
    55 static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; }
    5682
    57 static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1); }
    58 static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1); }
     83/** Atomic pre-increment.
     84 *
     85 * @param val Variable to be incremented.
     86 * @return    Value after incrementation.
     87 */
     88static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1); }
     89
     90
     91/** Atomic pre-decrement.
     92 *
     93 * @param val Variable to be decremented.
     94 * @return    Value after decrementation.
     95 */
     96static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1); }
     97
     98
     99/** Atomic post-increment.
     100 *
     101 * @param val Variable to be incremented.
     102 * @return    Value before incrementation.
     103 */
     104static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1) - 1; }
     105
     106
     107/** Atomic post-decrement.
     108 *
     109 * @param val Variable to be decremented.
     110 * @return    Value before decrementation.
     111 */
     112static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1) + 1; }
     113
    59114
    60115#endif
  • uspace/libc/arch/arm32/include/config.h

    r3ee8a075 r6b781c0  
    3030 * @{
    3131 */
    32 /** @file
     32/** @file 
     33 *  @brief Configuration constants.
    3334 */
    3435
  • uspace/libc/arch/arm32/include/endian.h

    r3ee8a075 r6b781c0  
    3030 * @{
    3131 */
    32 /** @file
     32/** @file
     33 *  @brief Endianness definition.
    3334 */
    3435
  • uspace/libc/arch/arm32/include/faddr.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2005 Jakub Jermar
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3030 * @{
    3131 */
    32 /** @file
     32/** @file
     33 *  @brief Function address conversion.
    3334 */
    3435
     
    3839#include <libarch/types.h>
    3940
    40 /**
    41  *
    42  * Calculate absolute address of function
    43  * referenced by fptr pointer.
     41/** Calculate absolute address of function referenced by fptr pointer.
    4442 *
    4543 * @param f Function pointer.
    46  *
    4744 */
    4845#define FADDR(f)         (f)
  • uspace/libc/arch/arm32/include/limits.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Josef Cejka
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3030 * @{
    3131 */
    32 /** @file
    33  * @ingroup libcarm32   
     32/** @file 
     33 *  @brief Limits declarations.
    3434 */
    3535
     
    3737#define LIBC_arm32__LIMITS_H_
    3838
    39 # define LONG_MIN MIN_INT32
    40 # define LONG_MAX MAX_INT32
    41 # define ULONG_MIN MIN_UINT32
    42 # define ULONG_MAX MAX_UINT32
     39#define LONG_MIN MIN_INT32
     40#define LONG_MAX MAX_INT32
     41#define ULONG_MIN MIN_UINT32
     42#define ULONG_MAX MAX_UINT32
    4343
    4444#endif
  • uspace/libc/arch/arm32/include/psthread.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Ondrej Palkovsky
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3030 * @{
    3131 */
    32 /** @file
    33  * @ingroup libcarm32   
     32/** @file 
     33 *  @brief psthread related declarations.
    3434 */
    3535
     
    3838
    3939#include <types.h>
     40#include <align.h>
     41#include "thread.h"
    4042
    41 #define SP_DELTA        0       /* TODO */
     43/** Size of a stack item */
     44#define STACK_ITEM_SIZE         4
    4245
     46/** Stack alignment - see <a href="http://www.arm.com/support/faqdev/14269.html">ABI</a> for details */
     47#define STACK_ALIGNMENT         8
     48
     49#define SP_DELTA        (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT))
     50
     51
     52/** Sets data to the context.
     53 * 
     54 *  @param c     Context (#context_t).
     55 *  @param _pc   Program counter.
     56 *  @param stack Stack address.
     57 *  @param size  Stack size.
     58 *  @param ptls  Pointer to the TCB.
     59 */
     60#define context_set(c, _pc, stack, size, ptls)                  \
     61        (c)->pc = (sysarg_t) (_pc);                             \
     62        (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA;     \
     63        (c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t) + ARM_TP_OFFSET;
     64
     65
     66/** Thread context.
     67 *
     68 *  Only registers preserved accross function calls are included. r9 is used
     69 *  to store a TLS address. -ffixed-r9 gcc forces gcc not to use this
     70 *  register. -mtp=soft forces gcc to use #__aeabi_read_tp to obtain
     71 *  TLS address.
     72 */
    4373typedef struct  {
    4474        uint32_t sp;
    4575        uint32_t pc;
     76        uint32_t r4;
     77        uint32_t r5;
     78        uint32_t r6;
     79        uint32_t r7;
     80        uint32_t r8;
    4681        uint32_t tls;
     82        uint32_t r10;
     83        uint32_t r11;
    4784} context_t;
     85
    4886
    4987#endif
  • uspace/libc/arch/arm32/include/stackarg.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Josef Cejka
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3131 */
    3232/** @file
     33 *  @brief Empty.
    3334 */
    3435
  • uspace/libc/arch/arm32/include/syscall.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2005 Martin Decky
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup libc
     29/** @addtogroup libcarm32
    3030 * @{
    3131 */
    32 /**
    33  * @file
     32/** @file
     33 *  @brief Empty.
    3434 */
    3535
  • uspace/libc/arch/arm32/include/thread.h

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Jakub Jermar
     2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup libcia64       
     29/** @addtogroup libcarm32
    3030 * @{
    3131 */
    3232/** @file
     33 *  @brief Uspace threads and TLS.
    3334 */
    3435
     
    3839#include <unistd.h>
    3940
     41/** Stack initial size. */
    4042#define THREAD_INITIAL_STACK_PAGES_NO 1
    4143
     44/** Offsets for accessing __thread variables are shifted 8 bytes higher. */
     45#define ARM_TP_OFFSET   (-8)
     46
     47/** TCB (Thread Control Block) struct.
     48 *
     49 *  TLS starts just after this struct.
     50 */
    4251typedef struct {
     52        /** psthread data. */
    4353        void *pst_data;
    44         /* TODO */
    4554} tcb_t;
    4655
     56
     57/** Sets TLS address to the r9 register.
     58 *
     59 *  @param tcb TCB (TLS starts behind)
     60 */
    4761static inline void __tcb_set(tcb_t *tcb)
    4862{
    49         /* TODO */
     63        void *tls = (void *)tcb;
     64        tls += sizeof(tcb_t) + ARM_TP_OFFSET;
     65        asm volatile (
     66                "mov r9, %0"
     67                :
     68                : "r"(tls)
     69        );
    5070}
    5171
     72
     73/** Returns TCB address.
     74 *
     75 * @return TCB address (starts before TLS which address is stored in r9 register).
     76 */
    5277static inline tcb_t *__tcb_get(void)
    5378{
    54         /* TODO */
    55         return NULL;
     79        void *ret;
     80        asm volatile (
     81                "mov %0, r9"
     82                : "=r"(ret)
     83        );
     84        return (tcb_t *)(ret - ARM_TP_OFFSET - sizeof(tcb_t));
    5685}
     86
     87
     88/** Returns TLS address stored.
     89 *
     90 *  Implemented in assembly.
     91 *
     92 *  @return TLS address stored in r9 register
     93 */
     94extern uintptr_t __aeabi_read_tp(void);
    5795
    5896#endif
  • uspace/libc/arch/arm32/include/types.h

    r3ee8a075 r6b781c0  
    3030 * @{
    3131 */
    32 /** @file
    33  * @ingroup libcarm32
     32/** @file 
     33 *  @brief Definitions of basic types like #uintptr_t.
    3434 */
    3535
  • uspace/libc/arch/arm32/src/eabi.S

    r3ee8a075 r6b781c0  
    11#
    2 # Copyright (c) 2007 Jakub Jermar
     2# Copyright (c) 2007 Pavel Jancik
    33# All rights reserved.
    44#
     
    3030
    3131.global __aeabi_read_tp
     32
    3233__aeabi_read_tp:
    33 
    34 0:
    35         b 0b
     34        mov r0, r9
     35        mov pc, lr
  • uspace/libc/arch/arm32/src/entry.s

    r3ee8a075 r6b781c0  
    11#
    2 # Copyright (c) 2006 Jakub Jermar
     2# Copyright (c) 2007 Michal Kebrt, Pavel Jancik
    33# All rights reserved.
    44#
     
    2929.section .init, "ax"
    3030
     31.org 0
     32
    3133.global __entry
    3234.global __entry_driver
     
    3638#
    3739__entry:
     40        bl __main
     41        bl __io_init
     42        bl main
     43        bl __exit
    3844
    39 #
    40 # TODO
    41 #
     45__entry_driver:
     46        bl __main
     47        bl main
     48        bl __exit
     49
  • uspace/libc/arch/arm32/src/psthread.S

    r3ee8a075 r6b781c0  
    11#
    2 # Copyright (c) 2005 Jakub Jermar
     2# Copyright (c) 2007 Michal Kebrt
    33# All rights reserved.
    44#
     
    3333
    3434context_save:
    35         /* TODO */
     35        stmia r0!, {sp, lr}
     36        stmia r0!, {r4-r11}
     37
     38        # return 1
     39        mov r0, #1
     40        mov pc, lr
    3641
    3742context_restore:
    38         /* TODO */
     43        ldmia r0!, {sp, lr}
     44        ldmia r0!, {r4-r11}
     45
     46        #return 0
     47        mov r0, #0
     48        mov pc, lr
     49
  • uspace/libc/arch/arm32/src/syscall.c

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2005 Martin Decky
     2 * Copyright (c) 2007 Pavel Jancik
    33 * All rights reserved.
    44 *
     
    3131 */
    3232/** @file
    33   * @ingroup libcarm32 
     33 *  @brief Syscall routine.
    3434 */
    3535
    3636#include <libc.h>
    3737
     38
     39/** Syscall routine.
     40 *
     41 *  Stores p1-p4, id to r0-r4 registers and calls <code>swi</code>
     42 *  instruction. Returned value is read from r0 register.
     43 *
     44 *  @param p1 Parameter 1.
     45 *  @param p2 Parameter 2.
     46 *  @param p3 Parameter 3.
     47 *  @param p4 Parameter 4.
     48 *  @param id Number of syscall.
     49 *
     50 *  @return Syscall return value.
     51 */
    3852sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3,
    3953    const sysarg_t p4, const syscall_t id)
    4054{
    41         /* TODO */
    42         return 0;
     55        register sysarg_t __arm_reg_r0 asm("r0") = p1;
     56        register sysarg_t __arm_reg_r1 asm("r1") = p2;
     57        register sysarg_t __arm_reg_r2 asm("r2") = p3;
     58        register sysarg_t __arm_reg_r3 asm("r3") = p4;
     59        register sysarg_t __arm_reg_r4 asm("r4") = id;
     60
     61        asm volatile ( "swi"
     62                : "=r" (__arm_reg_r0)
     63                : "r"  (__arm_reg_r0),
     64                  "r"  (__arm_reg_r1),
     65                  "r"  (__arm_reg_r2),
     66                  "r"  (__arm_reg_r3),
     67                  "r"  (__arm_reg_r4)
     68        );
     69
     70        return __arm_reg_r0;
    4371}
    4472
  • uspace/libc/arch/arm32/src/thread.c

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2006 Ondrej Palkovsky
     2 * Copyright (c) 2007 Pavel Jancik
    33 * All rights reserved.
    44 *
     
    3333 */
    3434/** @file
     35 *  @brief Uspace threads and TLS.
    3536 */
    3637
     
    3839#include <malloc.h>
    3940
    40 /** Allocate TLS & TCB for initial module threads
     41/** Allocates TLS & TCB.
    4142 *
    42  * @param data Start of data section
    43  * @return pointer to tcb_t structure
     43 * @param data Start of data section (output parameter).
     44 * @param size Size of (tbss + tdata) sections.
     45 * @return     Pointer to the allocated #tcb_t structure.
    4446 */
    4547tcb_t * __alloc_tls(void **data, size_t size)
    4648{
    47         /* TODO */
    48         return NULL;
     49        tcb_t *result;
     50
     51        result = malloc(sizeof(tcb_t) + size);
     52        *data = ((void *)result) + sizeof(tcb_t);
     53        return result;
    4954}
    5055
     56/** Deallocates TLS & TCB.
     57 *
     58 * @param tcb TCB structure to be deallocated (along with corresponding TLS).
     59 * @param size Not used.
     60 */
    5161void __free_tls_arch(tcb_t *tcb, size_t size)
    5262{
    53         /* TODO */
     63        free(tcb);
    5464}
    5565
  • uspace/libc/arch/arm32/src/thread_entry.s

    r3ee8a075 r6b781c0  
    3535#
    3636__thread_entry:
    37 
    38 #
    39 # TODO
    40 #
     37        b __thread_main
  • uspace/softfloat/arch/arm32/include/functions.h

    r3ee8a075 r6b781c0  
    2929/** @addtogroup softfloatarm32 arm32   
    3030 * @ingroup sfl
    31  * @brief softfloat architecture dependent definitions
     31 * @brief Softfloat architecture dependent definitions.
    3232 * @{
    3333 */
    34 /** @file
     34/** @file
     35 *  @brief Softfloat architecture dependent definitions.
    3536 */
    3637
Note: See TracChangeset for help on using the changeset viewer.