More mipsel

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30621 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jonas Sundström 2009-05-03 22:41:38 +00:00
parent 4ba7f1c0ed
commit cb8f3e2698
16 changed files with 610 additions and 0 deletions

View File

@ -0,0 +1,21 @@
SubDir HAIKU_TOP src system boot arch mipsel ;
DEFINES += _BOOT_MODE ;
local kernelLibArchObjects =
<src!system!kernel!lib!arch!$(TARGET_ARCH)>byteorder.o
<src!system!kernel!lib!arch!$(TARGET_ARCH)>memcpy.o
<src!system!kernel!lib!arch!$(TARGET_ARCH)>memset.o
;
KernelMergeObject boot_arch_$(TARGET_ARCH).o :
arch_elf.cpp
: # additional flags
:
$(kernelArchObjects)
$(kernelLibArchObjects)
;
SEARCH on [ FGristFiles arch_elf.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel arch $(TARGET_ARCH) ] ;

View File

@ -0,0 +1,20 @@
SubDir HAIKU_TOP src system libroot os arch mipsel ;
UsePrivateKernelHeaders ;
# TODO: Replace by "UsePrivateHeaders libroot" after resolving the TODO in
# time.c!
UsePrivateSystemHeaders ;
MergeObject os_arch_$(TARGET_ARCH).o :
atomic.S
byteorder.S
compatibility.c # only here until the places where those functions are used
# are fixed
stack_frame.c
# systeminfo.c
system_time.c
system_time_asm.S
thread.c
time.c
tls.c
;

View File

@ -0,0 +1,46 @@
/*
* Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*/
#define FUNCTION(x) .global x; .type x,@function; x
#warning MIPSEL: fixme
.text
/* int atomic_add(int *value, int increment)
* (r3) r3 r4
*/
FUNCTION(atomic_add):
lost1: jr $ra
/* int atomic_and(int *value, int andValue)
* (r3) r3 r4
*/
FUNCTION(atomic_and):
lost2: jr $ra
/* int atomic_or(int *value, int orValue)
* (r3) r3 r4
*/
FUNCTION(atomic_or):
lost3: jr $ra
/* int atomic_set(int *value, int setTo)
* (r3) r3 r4
*/
FUNCTION(atomic_set):
lost4: jr $ra
/* int atomic_test_and_set(int *value, int setTo, int testValue)
* (r3) r3 r4 r5
*/
FUNCTION(atomic_test_and_set):
lost5: jr $ra
/* int atomic_get(int *value)
* (r3) r3
*/
FUNCTION(atomic_get):
lost6: jr $ra

View File

@ -0,0 +1,49 @@
/*
* Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the OpenBeOS License.
*/
#define FUNCTION(x) .global x; .type x,@function; x
#warning MIPSEL: fixme
.text
/* uint16 __swap_int16(uint16 value)
* r3
*/
FUNCTION(__swap_int16):
jr $ra
/* uint32 __swap_int32(uint32 value)
* r3
*/
FUNCTION(__swap_int32):
jr $ra
/* uint64 __swap_int64(uint64 value)
* r3/r4
*/
FUNCTION(__swap_int64):
jr $ra
/* TODO: The following functions can surely be optimized. A simple optimization
* would be to define macros with the contents of the __swap_int{32,64}
* functions and use those instead of calling the functions.
*/
/* float __swap_float(float value)
* f1
*/
FUNCTION(__swap_float):
jr $ra
/* double __swap_double(double value)
* f1
*/
FUNCTION(__swap_double):
jr $ra

View File

@ -0,0 +1,44 @@
/*
* Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*/
// This file includes some known R5 syscalls
// ToDo: maybe they should indeed do something...
#include <SupportDefs.h>
int _kset_mon_limit_(int num);
int _kset_fd_limit_(int num);
int _kget_cpu_state_(int cpuNum);
int _kset_cpu_state_(int cpuNum, int state);
int
_kset_mon_limit_(int num)
{
return B_ERROR;
}
int
_kset_fd_limit_(int num)
{
return B_ERROR;
}
int
_kget_cpu_state_(int cpuNum)
{
return 1;
}
int
_kset_cpu_state_(int cpuNum, int state)
{
return state ? B_OK : B_ERROR;
}

View File

@ -0,0 +1,24 @@
/*
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <SupportDefs.h>
#include <libroot_private.h>
void*
get_stack_frame(void)
{
// TODO: Implement!
return NULL;
}
void*
__arch_get_caller(void)
{
// TODO: Implement!
return NULL;
}

View File

@ -0,0 +1,88 @@
/*
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#define SYSCALL0(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL1(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL2(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL3(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL4(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL5(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL6(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL7(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL8(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL9(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL10(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL11(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL12(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:
#define SYSCALL13(name, n) \
.globl name; \
.type name,@function; \
.align 4; \
name:

View File

@ -0,0 +1,29 @@
/*
* Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include <OS.h>
#include <arch_cpu.h>
#include <libroot_private.h>
#include <real_time_data.h>
static vint32 *sConversionFactor;
void
__mipsel_setup_system_time(vint32 *cvFactor)
{
sConversionFactor = cvFactor;
}
bigtime_t
system_time(void)
{
uint64 timeBase = __mipsel_get_time_base();
uint32 cv = *sConversionFactor;
return (timeBase >> 32) * cv + (((timeBase & 0xffffffff) * cv) >> 32);
}

View File

@ -0,0 +1,18 @@
/*
* Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the OpenBeOS License.
*/
#define FUNCTION(x) .global x; .type x,@function; x
#warning MIPSEL: fixme
.text
/* int64 __mipsel_get_time_base(void)
* r3/r4
*/
FUNCTION(__mipsel_get_time_base):
/* get TB (time base) register */
carry: jr $ra

View File

@ -0,0 +1,9 @@
#include <OS.h>
#include "syscalls.h"
thread_id
find_thread(const char *name)
{
return _kern_find_thread(name);
}

View File

@ -0,0 +1,42 @@
/*
* Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
* Distributed under the terms of the MIT License.
*/
#include <OS.h>
#include <arch_cpu.h>
#include <libroot_private.h>
#include <real_time_data.h>
static struct arch_real_time_data *sRealTimeData;
void
__arch_init_time(struct real_time_data *data, bool setDefaults)
{
sRealTimeData = &data->arch_data;
if (setDefaults) {
sRealTimeData->data[0].system_time_offset = 0;
sRealTimeData->system_time_conversion_factor = 1000000000LL;
sRealTimeData->version = 0;
}
__mipsel_setup_system_time(&sRealTimeData->system_time_conversion_factor);
}
bigtime_t
__arch_get_system_time_offset(struct real_time_data *data)
{
int32 version;
bigtime_t offset;
do {
version = sRealTimeData->version;
offset = sRealTimeData->data[version % 2].system_time_offset;
} while (version != sRealTimeData->version);
return offset;
}

View File

@ -0,0 +1,53 @@
/*
** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
** Distributed under the terms of the OpenBeOS License.
*/
// ToDo: this is a dummy implementation - I've not yet gained enough knowledge
// to decide how this should be done, so it's just broken now (okay for single
// threaded apps, though).
// we don't want to have the inline assembly included here
#ifndef _NO_INLINE_ASM
# define _NO_INLINE_ASM 1
#endif
#include "support/TLS.h"
#include "tls.h"
static int32 gNextSlot = TLS_FIRST_FREE_SLOT;
static void *gSlots[TLS_MAX_KEYS];
int32
tls_allocate(void)
{
int32 next = atomic_add(&gNextSlot, 1);
if (next >= TLS_MAX_KEYS)
return B_NO_MEMORY;
return next;
}
void *
tls_get(int32 index)
{
return gSlots[index];
}
void **
tls_address(int32 index)
{
return &gSlots[index];
}
void
tls_set(int32 index, void *value)
{
gSlots[index] = value;
}

View File

@ -0,0 +1,16 @@
SubDir HAIKU_TOP src system libroot posix arch mipsel ;
local genericSources =
setjmp_save_sigs.c
longjmp_return.c
;
MergeObject posix_arch_$(TARGET_ARCH).o :
sigsetjmp.S
siglongjmp.S
$(genericSources)
;
SEARCH on [ FGristFiles $(genericSources) ]
= [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;

View File

@ -0,0 +1,49 @@
/*
* Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>. All rights
* reserved. Distributed under the terms of the Haiku License.
*/
#ifndef SETJMP_INTERNAL_H
#define SETJMP_INTERNAL_H
#error MIPSEL: fixme
/* PPC function call ABI register use:
r0 - volatile
r1 - stack frame
r2 - reserved
r3-r4 - param passing, return values
r5-r10 - param passing
r11-r12 - volatile
r13 - small data pointer
r14-r30 - local vars
r31 - local vars/environment
*/
/* These are the fields of the __jmp_regs structure */
#define JMP_REGS_R1 0
#define JMP_REGS_R2 4
#define JMP_REGS_R13 8
#define JMP_REGS_R14 12
#define JMP_REGS_R15 16
#define JMP_REGS_R16 20
#define JMP_REGS_R17 24
#define JMP_REGS_R18 28
#define JMP_REGS_R19 32
#define JMP_REGS_R20 36
#define JMP_REGS_R21 40
#define JMP_REGS_R22 44
#define JMP_REGS_R23 48
#define JMP_REGS_R24 52
#define JMP_REGS_R25 56
#define JMP_REGS_R26 60
#define JMP_REGS_R27 64
#define JMP_REGS_R28 68
#define JMP_REGS_R29 72
#define JMP_REGS_R30 76
#define JMP_REGS_R31 80
#define JMP_REGS_LR 84
#define JMP_REGS_CR 88
#define FUNCTION(x) .global x; .type x,@function; x
#endif /* SETJMP_INTERNAL_H */

View File

@ -0,0 +1,48 @@
#error XXX
/*
* Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>. All rights
* reserved. Distributed under the terms of the Haiku License.
*/
#include "setjmp_internal.h"
#error MIPSEL: fixme
/* int __siglongjmp(jmp_buf buffer, int value) */
FUNCTION(siglongjmp):
FUNCTION(longjmp):
FUNCTION(_longjmp):
// r3: buffer, r4: saveMask
// restore non-volatile general purpose registers
lwz %r1, JMP_REGS_R1(3)
lwz %r2, JMP_REGS_R2(3)
lwz %r13, JMP_REGS_R13(3)
lwz %r14, JMP_REGS_R14(3)
lwz %r15, JMP_REGS_R15(3)
lwz %r16, JMP_REGS_R16(3)
lwz %r17, JMP_REGS_R17(3)
lwz %r18, JMP_REGS_R18(3)
lwz %r19, JMP_REGS_R19(3)
lwz %r20, JMP_REGS_R20(3)
lwz %r21, JMP_REGS_R21(3)
lwz %r22, JMP_REGS_R22(3)
lwz %r23, JMP_REGS_R23(3)
lwz %r24, JMP_REGS_R24(3)
lwz %r25, JMP_REGS_R25(3)
lwz %r26, JMP_REGS_R26(3)
lwz %r27, JMP_REGS_R27(3)
lwz %r28, JMP_REGS_R28(3)
lwz %r29, JMP_REGS_R29(3)
lwz %r30, JMP_REGS_R30(3)
lwz %r31, JMP_REGS_R31(3)
// restore special registers (link, condition)
lwz %r0, JMP_REGS_LR(3)
mtlr %r0
lwz %r0, JMP_REGS_CR(3)
mtcr %r0
b __longjmp_return
#pragma weak longjmp=siglongjmp

View File

@ -0,0 +1,54 @@
#error XXX
/*
* Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>. All rights
* reserved. Distributed under the terms of the Haiku License.
*/
#include "setjmp_internal.h"
#error MIPSEL: fixme
/* int sigsetjmp(jmp_buf buffer, int saveMask) */
FUNCTION(__sigsetjmp):
FUNCTION(sigsetjmp):
// r3: buffer, r4: saveMask
// store non-volatile general purpose registers
stw %r1, JMP_REGS_R1(3)
stw %r2, JMP_REGS_R2(3)
stw %r13, JMP_REGS_R13(3)
stw %r14, JMP_REGS_R14(3)
stw %r15, JMP_REGS_R15(3)
stw %r16, JMP_REGS_R16(3)
stw %r17, JMP_REGS_R17(3)
stw %r18, JMP_REGS_R18(3)
stw %r19, JMP_REGS_R19(3)
stw %r20, JMP_REGS_R20(3)
stw %r21, JMP_REGS_R21(3)
stw %r22, JMP_REGS_R22(3)
stw %r23, JMP_REGS_R23(3)
stw %r24, JMP_REGS_R24(3)
stw %r25, JMP_REGS_R25(3)
stw %r26, JMP_REGS_R26(3)
stw %r27, JMP_REGS_R27(3)
stw %r28, JMP_REGS_R28(3)
stw %r29, JMP_REGS_R29(3)
stw %r30, JMP_REGS_R30(3)
stw %r31, JMP_REGS_R31(3)
// store special registers (link, condition)
mflr %r0
stw %r0, JMP_REGS_LR(3)
mfcr %r0
stw %r0, JMP_REGS_CR(3)
b __setjmp_save_sigs
/* int setjmp(jmp_buf buffer) */
FUNCTION(setjmp):
// call __sigsetjmp with saveMask = 0
addi %r4, 0, 0
b __sigsetjmp
#pragma weak _setjmp=setjmp