Added some PPC helper functions.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4980 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
d3c6ba4606
commit
e2367e8fcb
|
@ -3,11 +3,13 @@ SubDir OBOS_TOP src kernel core arch ppc ;
|
||||||
KernelStaticLibrary libppc :
|
KernelStaticLibrary libppc :
|
||||||
<$(SOURCE_GRIST)>arch_atomic.c
|
<$(SOURCE_GRIST)>arch_atomic.c
|
||||||
<$(SOURCE_GRIST)>arch_cpu.c
|
<$(SOURCE_GRIST)>arch_cpu.c
|
||||||
|
<$(SOURCE_GRIST)>arch_cpu_asm.S
|
||||||
<$(SOURCE_GRIST)>arch_dbg_console.c
|
<$(SOURCE_GRIST)>arch_dbg_console.c
|
||||||
<$(SOURCE_GRIST)>arch_debug.c
|
<$(SOURCE_GRIST)>arch_debug.c
|
||||||
<$(SOURCE_GRIST)>arch_elf.c
|
<$(SOURCE_GRIST)>arch_elf.c
|
||||||
<$(SOURCE_GRIST)>arch_faults.c
|
<$(SOURCE_GRIST)>arch_faults.c
|
||||||
<$(SOURCE_GRIST)>arch_int.c
|
<$(SOURCE_GRIST)>arch_int.c
|
||||||
|
<$(SOURCE_GRIST)>arch_mmu.cpp
|
||||||
<$(SOURCE_GRIST)>arch_smp.c
|
<$(SOURCE_GRIST)>arch_smp.c
|
||||||
<$(SOURCE_GRIST)>arch_thread.c
|
<$(SOURCE_GRIST)>arch_thread.c
|
||||||
<$(SOURCE_GRIST)>arch_timer.c
|
<$(SOURCE_GRIST)>arch_timer.c
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
** 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
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
/* uint32 get_sdr1(void);
|
||||||
|
*/
|
||||||
|
FUNCTION(get_sdr1):
|
||||||
|
mfsdr1 %r3
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void set_sdr1(uint32 value);
|
||||||
|
* r3
|
||||||
|
*/
|
||||||
|
FUNCTION(set_sdr1):
|
||||||
|
mtsdr1 %r3
|
||||||
|
blr
|
||||||
|
|
||||||
|
#define get_ibat(num) \
|
||||||
|
mfibatu %r4, num; \
|
||||||
|
stw %r4, 0(%r3); \
|
||||||
|
mfibatl %r4, num; \
|
||||||
|
stw %r4, 4(%r3); \
|
||||||
|
|
||||||
|
#define set_ibat(num); \
|
||||||
|
lwz %r4, 0(%r3); \
|
||||||
|
mtibatu num, %r4; \
|
||||||
|
lwz %r4, 4(%r3); \
|
||||||
|
mtibatl num, %r4;
|
||||||
|
|
||||||
|
/* void get_ibat0-3(block_address_translation *bat);
|
||||||
|
* r3
|
||||||
|
*/
|
||||||
|
FUNCTION(get_ibat0):
|
||||||
|
get_ibat(0)
|
||||||
|
blr
|
||||||
|
FUNCTION(get_ibat1):
|
||||||
|
get_ibat(1)
|
||||||
|
blr
|
||||||
|
FUNCTION(get_ibat2):
|
||||||
|
get_ibat(2)
|
||||||
|
blr
|
||||||
|
FUNCTION(get_ibat3):
|
||||||
|
get_ibat(3)
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void set_ibat0-3(block_address_translation *bat);
|
||||||
|
* r3
|
||||||
|
*/
|
||||||
|
FUNCTION(set_ibat0):
|
||||||
|
set_ibat(0)
|
||||||
|
blr
|
||||||
|
FUNCTION(set_ibat1):
|
||||||
|
set_ibat(1)
|
||||||
|
blr
|
||||||
|
FUNCTION(set_ibat2):
|
||||||
|
set_ibat(2)
|
||||||
|
blr
|
||||||
|
FUNCTION(set_ibat3):
|
||||||
|
set_ibat(3)
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void reset_ibats(void)
|
||||||
|
*/
|
||||||
|
FUNCTION(reset_ibats):
|
||||||
|
li %r3, 0
|
||||||
|
mtibatu 0, %r3
|
||||||
|
mtibatl 0, %r3
|
||||||
|
mtibatu 1, %r3
|
||||||
|
mtibatl 1, %r3
|
||||||
|
mtibatu 2, %r3
|
||||||
|
mtibatl 2, %r3
|
||||||
|
mtibatu 3, %r3
|
||||||
|
mtibatl 3, %r3
|
||||||
|
blr
|
||||||
|
|
||||||
|
#define get_dbat(num) \
|
||||||
|
mfdbatu %r4, num; \
|
||||||
|
stw %r4, 0(%r3); \
|
||||||
|
mfdbatl %r4, num; \
|
||||||
|
stw %r4, 4(%r3);
|
||||||
|
|
||||||
|
#define set_dbat(num) \
|
||||||
|
lwz %r4, 0(%r3); \
|
||||||
|
mtdbatu num, %r4; \
|
||||||
|
lwz %r4, 4(%r3); \
|
||||||
|
mtdbatl num, %r4;
|
||||||
|
|
||||||
|
/* void get_dbat0-3(block_address_translation *bat);
|
||||||
|
* r3
|
||||||
|
*/
|
||||||
|
FUNCTION(get_dbat0):
|
||||||
|
get_dbat(0)
|
||||||
|
blr
|
||||||
|
FUNCTION(get_dbat1):
|
||||||
|
get_dbat(1)
|
||||||
|
blr
|
||||||
|
FUNCTION(get_dbat2):
|
||||||
|
get_dbat(2)
|
||||||
|
blr
|
||||||
|
FUNCTION(get_dbat3):
|
||||||
|
get_dbat(3)
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void set_dbat0-3(block_address_translation *bat);
|
||||||
|
* r3
|
||||||
|
*/
|
||||||
|
FUNCTION(set_dbat0):
|
||||||
|
set_dbat(0)
|
||||||
|
blr
|
||||||
|
FUNCTION(set_dbat1):
|
||||||
|
set_dbat(1)
|
||||||
|
blr
|
||||||
|
FUNCTION(set_dbat2):
|
||||||
|
set_dbat(2)
|
||||||
|
blr
|
||||||
|
FUNCTION(set_dbat3):
|
||||||
|
set_dbat(3)
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void reset_dbats(void)
|
||||||
|
*/
|
||||||
|
FUNCTION(reset_dbats):
|
||||||
|
li %r3, 0
|
||||||
|
mtdbatu 0, %r3
|
||||||
|
mtdbatl 0, %r3
|
||||||
|
mtdbatu 1, %r3
|
||||||
|
mtdbatl 1, %r3
|
||||||
|
mtdbatu 2, %r3
|
||||||
|
mtdbatl 2, %r3
|
||||||
|
mtdbatu 3, %r3
|
||||||
|
mtdbatl 3, %r3
|
||||||
|
blr
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
||||||
|
** Distributed under the terms of the OpenBeOS License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <arch_mmu.h>
|
||||||
|
#include <arch_cpu.h>
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
page_table_entry::PrimaryHash(uint32 virtualSegmentID, uint32 virtualAddress)
|
||||||
|
{
|
||||||
|
return (virtualSegmentID & 0x7ffff) ^ ((virtualAddress >> 12) & 0xffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
page_table_entry::SecondaryHash(uint32 virtualSegmentID, uint32 virtualAddress)
|
||||||
|
{
|
||||||
|
return ~PrimaryHash(virtualSegmentID, virtualAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ppc_get_page_table(void **_pageTable, size_t *_size)
|
||||||
|
{
|
||||||
|
uint32 sdr1 = get_sdr1();
|
||||||
|
|
||||||
|
*_pageTable = (void *)(sdr1 & 0xffff0000);
|
||||||
|
*_size = ((sdr1 & 0x1ff) + 1) << 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ppc_set_page_table(void *pageTable, size_t size)
|
||||||
|
{
|
||||||
|
set_sdr1(((uint32)pageTable & 0xffff0000) | (((size >> 16) - 1 ) & 0x1ff));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue