274 lines
No EOL
4.9 KiB
Text
274 lines
No EOL
4.9 KiB
Text
/******************************************************************************
|
|
* Copyright (c) 2004, 2008 IBM Corporation
|
|
* All rights reserved.
|
|
* This program and the accompanying materials
|
|
* are made available under the terms of the BSD License
|
|
* which accompanies this distribution, and is available at
|
|
* http://www.opensource.org/licenses/bsd-license.php
|
|
*
|
|
* Contributors:
|
|
* IBM Corporation - initial implementation
|
|
*****************************************************************************/
|
|
|
|
|
|
// This file contains the implementation of the Forth code words specific
|
|
// to PowerPC64. Some of this is 970-only.
|
|
|
|
// 970-specific CPU registers.
|
|
// Don't use on P7 !
|
|
PRIM(HID0_X21)
|
|
unsigned long hid0 = TOS.u;
|
|
asm volatile("sync ; mtspr 1008,%0 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008 ; mfspr %0,1008" : "+r"(hid0));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HID0_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,1008" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(HID1_X21)
|
|
unsigned long hid1 = TOS.u;
|
|
asm volatile("mtspr 1009,%0 ; mtspr 1009,%0 ; isync" : : "r"(hid1));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HID1_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,1009" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(HID4_X21)
|
|
unsigned long hid4 = TOS.u;
|
|
asm volatile("sync ; mtspr 1012,%0 ; isync" : : "r"(hid4));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HID4_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,1012" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(HID5_X21)
|
|
unsigned long hid5 = TOS.u;
|
|
asm volatile("mtspr 1014,%0" : : "r"(hid5));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HID5_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,1014" : "=r"(TOS));
|
|
MIRP
|
|
|
|
// PowerPC special registers.
|
|
PRIM(MSR_X21)
|
|
unsigned long msr = TOS.u;
|
|
asm volatile("mtmsrd %0" : : "r"(msr));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(MSR_X40)
|
|
PUSH;
|
|
asm volatile("mfmsr %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(SDR1_X21)
|
|
unsigned long sdr1 = TOS.u;
|
|
asm volatile("mtsdr1 %0" : : "r"(sdr1));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(SDR1_X40)
|
|
PUSH;
|
|
asm volatile("mfsdr1 %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(PVR_X40)
|
|
PUSH;
|
|
asm volatile("mfpvr %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(PIR_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,1023" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(TBL_X40)
|
|
PUSH;
|
|
asm volatile("mftbl %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(TBU_X40)
|
|
PUSH;
|
|
asm volatile("mftbu %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(DABR_X21)
|
|
unsigned long dabr = TOS.u;
|
|
asm volatile("mtspr 1013,%0" : : "r"(dabr));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(DABR_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,1013" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(HIOR_X21)
|
|
unsigned long dabr = TOS.u;
|
|
asm volatile("mtspr 311,%0" : : "r"(dabr));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HIOR_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,311" : "=r"(TOS));
|
|
MIRP
|
|
|
|
|
|
|
|
PRIM(SPRG0_X21)
|
|
unsigned long sprg0 = TOS.u;
|
|
asm volatile("mtsprg0 %0" : "+r"(sprg0));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(SPRG0_X40)
|
|
PUSH;
|
|
asm volatile("mfsprg0 %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(SPRG1_X21)
|
|
unsigned long sprg1 = TOS.u;
|
|
asm volatile("mtsprg1 %0" : "+r"(sprg1));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(SPRG1_X40)
|
|
PUSH;
|
|
asm volatile("mfsprg1 %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(SPRG2_X21)
|
|
unsigned long sprg2 = TOS.u;
|
|
asm volatile("mtsprg2 %0" : "+r"(sprg2));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(SPRG2_X40)
|
|
PUSH;
|
|
asm volatile("mfsprg2 %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(SPRG3_X21)
|
|
unsigned long sprg3 = TOS.u;
|
|
asm volatile("mtsprg3 %0" : "+r"(sprg3));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(SPRG3_X40)
|
|
PUSH;
|
|
asm volatile("mfsprg3 %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(HSPRG0_X21)
|
|
unsigned long hsprg0 = TOS.u;
|
|
asm volatile("mtspr 304,%0" : "+r"(hsprg0));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HSPRG0_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,304" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(HSPRG1_X21)
|
|
unsigned long hsprg1 = TOS.u;
|
|
asm volatile("mtspr 305,%0" : "+r"(hsprg1));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(HSPRG1_X40)
|
|
PUSH;
|
|
asm volatile("mfspr %0,305" : "=r"(TOS));
|
|
MIRP
|
|
|
|
|
|
PRIM(MMCR0_X21)
|
|
unsigned long mmcr0 = TOS.u;
|
|
asm volatile("sync ; mtspr 795,%0 ; isync" : : "r"(mmcr0));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(PMC1_X40)
|
|
PUSH;
|
|
asm volatile("sync ; mfspr %0,787" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(ICBI)
|
|
asm volatile("dcbst 0,%0 ; sync ; icbi 0,%0 ; sync ; isync" : : "r"(TOS));
|
|
POP;
|
|
MIRP
|
|
|
|
// Call into the client program.
|
|
PRIM(JUMP_X2d_CLIENT)
|
|
TOS.u = call_client(TOS);
|
|
MIRP
|
|
|
|
|
|
// Hang. Useful for debugging, believe it or not.
|
|
PRIM(CRASH)
|
|
for (;;) ;
|
|
MIRP
|
|
|
|
PRIM(START_X2d_RTAS)
|
|
cell e = TOS; POP;
|
|
cell p1 = TOS; POP;
|
|
cell p0 = TOS;
|
|
TOS.u = call_c(p0, p1, (cell)0UL, e);
|
|
MIRP
|
|
|
|
PRIM(CALL_X2d_C)
|
|
cell e = TOS; POP;
|
|
cell p2 = TOS; POP;
|
|
cell p1 = TOS; POP;
|
|
cell p0 = TOS;
|
|
TOS.u = call_c(p0, p1, p2, e);
|
|
MIRP
|
|
|
|
PRIM(FLUSHCACHE)
|
|
type_u n = TOS.u; POP;
|
|
unsigned char* p = TOS.a; POP;
|
|
flush_cache(p, n);
|
|
MIRP
|
|
|
|
PRIM(DEC_X21)
|
|
unsigned long dec = TOS.u;
|
|
asm volatile("mtdec %0" : "+r"(dec));
|
|
POP;
|
|
MIRP
|
|
|
|
PRIM(DEC_X40)
|
|
PUSH;
|
|
asm volatile("mfdec %0" : "=r"(TOS));
|
|
MIRP
|
|
|
|
PRIM(BM_X2d_ALLOCATOR_X2d_INIT)
|
|
unsigned long blocksize = TOS.u; POP;
|
|
unsigned long size = TOS.u; POP;
|
|
unsigned long start = TOS.u;
|
|
TOS.u = SLOF_bm_allocator_init(start, size, blocksize);
|
|
MIRP
|
|
|
|
PRIM(BM_X2d_ALLOC)
|
|
unsigned long size = TOS.u; POP;
|
|
unsigned long handle = TOS.u;
|
|
TOS.u = SLOF_bm_alloc(handle, size);
|
|
MIRP
|
|
|
|
PRIM(BM_X2d_FREE)
|
|
unsigned long size = TOS.u; POP;
|
|
unsigned long addr = TOS.u; POP;
|
|
unsigned long handle = TOS.u; POP;
|
|
SLOF_bm_free(handle, addr, size);
|
|
MIRP |