342 lines
10 KiB
ArmAsm
342 lines
10 KiB
ArmAsm
// TITLE("Wst Utility")
|
||
//++
|
||
// Copyright (c) 1992-1994, Microsoft Corporation.
|
||
//
|
||
// Description:
|
||
// SaveAllRegs ()
|
||
// - save all Alpha registers
|
||
//
|
||
// RestoreAllRegs ()
|
||
// - restore all Alpha registers
|
||
//
|
||
// penter ()
|
||
// - penter wrapper to call c_penter
|
||
//
|
||
// GetCaller ()
|
||
// - get caller address (return address)
|
||
//
|
||
// GetCalCaller ()
|
||
// - dummy routine for use in calibration
|
||
//
|
||
// GetStubCaller ()
|
||
// -
|
||
//
|
||
// Modification History:
|
||
//
|
||
// 1994.01.28 HonWah Chan -- Created
|
||
//--
|
||
|
||
#include "ksalpha.h"
|
||
|
||
.extern c_penter
|
||
|
||
SBTTL("Save Registers")
|
||
|
||
LEAF_ENTRY(SaveAllRegs)
|
||
|
||
//
|
||
// Save all the integer registers.
|
||
//
|
||
|
||
.set noreorder
|
||
.set noat
|
||
stq v0, 0x000(a0) // 0: store integer register v0
|
||
stq t0, 0x008(a0) // 1: store integer registers t0 - t7
|
||
stq t1, 0x010(a0) // 2:
|
||
stq t2, 0x018(a0) // 3:
|
||
stq t3, 0x020(a0) // 4:
|
||
stq t4, 0x028(a0) // 5:
|
||
stq t5, 0x030(a0) // 6:
|
||
stq t6, 0x038(a0) // 7:
|
||
stq t7, 0x040(a0) // 8:
|
||
|
||
stq s0, 0x048(a0) // 9: store integer registers s0 - s5
|
||
stq s1, 0x050(a0) // 10:
|
||
stq s2, 0x058(a0) // 11:
|
||
stq s3, 0x060(a0) // 12:
|
||
stq s4, 0x068(a0) // 13:
|
||
stq s5, 0x070(a0) // 14:
|
||
stq fp, 0x078(a0) // 15: store integer register fp/s6
|
||
|
||
stq a0, 0x080(a0) // 16: store integer registers a0 - a5
|
||
stq a1, 0x088(a0) // 17:
|
||
stq a2, 0x090(a0) // 18:
|
||
stq a3, 0x098(a0) // 19:
|
||
stq a4, 0x0A0(a0) // 20:
|
||
stq a5, 0x0A8(a0) // 21:
|
||
|
||
stq t8, 0x0B0(a0) // 22: store integer registers t8 - t11
|
||
stq t9, 0x0B8(a0) // 23:
|
||
stq t10, 0x0C0(a0) // 24:
|
||
stq t11, 0x0C8(a0) // 25:
|
||
|
||
stq ra, 0x0D0(a0) // 26: store integer register ra
|
||
stq t12, 0x0D8(a0) // 27: store integer register t12
|
||
stq AT, 0x0E0(a0) // 28: store integer register at
|
||
stq gp, 0x0E8(a0) // 29: store integer register gp
|
||
stq sp, 0x0F0(a0) // 30: store integer register sp
|
||
stq zero,0x0F8(a0) // 31: store integer register zero
|
||
|
||
//
|
||
// Save all the floating registers, and the floating control register.
|
||
//
|
||
|
||
stt f0, 0x100(a0) // store floating registers f0 - f31
|
||
stt f1, 0x108(a0) //
|
||
stt f2, 0x110(a0) //
|
||
stt f3, 0x118(a0) //
|
||
stt f4, 0x120(a0) //
|
||
stt f5, 0x128(a0) //
|
||
stt f6, 0x130(a0) //
|
||
stt f7, 0x138(a0) //
|
||
stt f8, 0x140(a0) //
|
||
stt f9, 0x148(a0) //
|
||
stt f10, 0x150(a0) //
|
||
stt f11, 0x158(a0) //
|
||
stt f12, 0x160(a0) //
|
||
stt f13, 0x168(a0) //
|
||
stt f14, 0x170(a0) //
|
||
stt f15, 0x178(a0) //
|
||
stt f16, 0x180(a0) //
|
||
stt f17, 0x188(a0) //
|
||
stt f18, 0x190(a0) //
|
||
stt f19, 0x198(a0) //
|
||
stt f20, 0x1A0(a0) //
|
||
stt f21, 0x1A8(a0) //
|
||
stt f22, 0x1B0(a0) //
|
||
stt f23, 0x1B8(a0) //
|
||
stt f24, 0x1C0(a0) //
|
||
stt f25, 0x1C8(a0) //
|
||
stt f26, 0x1D0(a0) //
|
||
stt f27, 0x1D8(a0) //
|
||
stt f28, 0x1E0(a0) //
|
||
stt f29, 0x1E8(a0) //
|
||
stt f30, 0x1F0(a0) //
|
||
stt f31, 0x1F8(a0) //
|
||
|
||
.set at
|
||
.set reorder
|
||
|
||
ret zero, (ra) // return
|
||
.end SaveAllRegs
|
||
|
||
|
||
SBTTL("Restore Registers")
|
||
|
||
LEAF_ENTRY(RestoreAllRegs)
|
||
|
||
//
|
||
// Restore all the integer registers.
|
||
//
|
||
|
||
.set noreorder
|
||
.set noat
|
||
ldq v0, 0x000(a0) // 0: restore integer register v0
|
||
ldq t0, 0x008(a0) // 1: restore integer registers t0 - t7
|
||
ldq t1, 0x010(a0) // 2:
|
||
ldq t2, 0x018(a0) // 3:
|
||
ldq t3, 0x020(a0) // 4:
|
||
ldq t4, 0x028(a0) // 5:
|
||
ldq t5, 0x030(a0) // 6:
|
||
ldq t6, 0x038(a0) // 7:
|
||
ldq t7, 0x040(a0) // 8:
|
||
|
||
ldq s0, 0x048(a0) // 9: restore integer registers s0 - s5
|
||
ldq s1, 0x050(a0) // 10:
|
||
ldq s2, 0x058(a0) // 11:
|
||
ldq s3, 0x060(a0) // 12:
|
||
ldq s4, 0x068(a0) // 13:
|
||
ldq s5, 0x070(a0) // 14:
|
||
ldq fp, 0x078(a0) // 15: restore integer register fp/s6
|
||
|
||
// ldq a0, 0x080(a0) // 16: restore integer registers a0 - a5
|
||
ldq a1, 0x088(a0) // 17:
|
||
ldq a2, 0x090(a0) // 18:
|
||
ldq a3, 0x098(a0) // 19:
|
||
ldq a4, 0x0A0(a0) // 20:
|
||
ldq a5, 0x0A8(a0) // 21:
|
||
|
||
ldq t8, 0x0B0(a0) // 22: restore integer registers t8 - t11
|
||
ldq t9, 0x0B8(a0) // 23:
|
||
ldq t10, 0x0C0(a0) // 24:
|
||
ldq t11, 0x0C8(a0) // 25:
|
||
|
||
// ldq ra, 0x0D0(a0) // 26: restore integer register ra
|
||
ldq t12, 0x0D8(a0) // 27: restore integer register t12
|
||
ldq AT, 0x0E0(a0) // 28: restore integer register at
|
||
ldq gp, 0x0E8(a0) // 29: restore integer register gp
|
||
// ldq sp, 0x0F0(a0) // 30: restore integer register sp
|
||
ldq zero,0x0F8(a0) // 31: restore integer register zero
|
||
|
||
//
|
||
// Restore all the floating registers, and the floating control register.
|
||
//
|
||
|
||
ldt f0, 0x100(a0) // restore floating registers f0 - f31
|
||
ldt f1, 0x108(a0) //
|
||
ldt f2, 0x110(a0) //
|
||
ldt f3, 0x118(a0) //
|
||
ldt f4, 0x120(a0) //
|
||
ldt f5, 0x128(a0) //
|
||
ldt f6, 0x130(a0) //
|
||
ldt f7, 0x138(a0) //
|
||
ldt f8, 0x140(a0) //
|
||
ldt f9, 0x148(a0) //
|
||
ldt f10, 0x150(a0) //
|
||
ldt f11, 0x158(a0) //
|
||
ldt f12, 0x160(a0) //
|
||
ldt f13, 0x168(a0) //
|
||
ldt f14, 0x170(a0) //
|
||
ldt f15, 0x178(a0) //
|
||
ldt f16, 0x180(a0) //
|
||
ldt f17, 0x188(a0) //
|
||
ldt f18, 0x190(a0) //
|
||
ldt f19, 0x198(a0) //
|
||
ldt f20, 0x1A0(a0) //
|
||
ldt f21, 0x1A8(a0) //
|
||
ldt f22, 0x1B0(a0) //
|
||
ldt f23, 0x1B8(a0) //
|
||
ldt f24, 0x1C0(a0) //
|
||
ldt f25, 0x1C8(a0) //
|
||
ldt f26, 0x1D0(a0) //
|
||
ldt f27, 0x1D8(a0) //
|
||
ldt f28, 0x1E0(a0) //
|
||
ldt f29, 0x1E8(a0) //
|
||
ldt f30, 0x1F0(a0) //
|
||
ldt f31, 0x1F8(a0) //
|
||
|
||
.set at
|
||
.set reorder
|
||
|
||
ret zero, (ra) // return
|
||
.end RestoreAllRegs
|
||
|
||
SBTTL("penter")
|
||
|
||
LEAF_ENTRY(penter)
|
||
|
||
//
|
||
// Restore A0 register before calling the C part of penter
|
||
//
|
||
|
||
.set noreorder
|
||
.set noat
|
||
|
||
lda sp, -0x28(sp)
|
||
stq t0, 0x20(sp)
|
||
stq a0, 0x18(sp)
|
||
stq a1, 0x10(sp)
|
||
stq ra, 0x08(sp)
|
||
bne v0, 10f
|
||
addq ra, zero, v0
|
||
|
||
10: stq v0, 0x00(sp)
|
||
|
||
ldq a0,-0x30(sp) // prev return (if called from stub)
|
||
addq v0,zero,a1 // return address
|
||
|
||
jsr c_penter
|
||
|
||
ldq t0, 0x20(sp)
|
||
ldq a0, 0x18(sp)
|
||
ldq a1, 0x10(sp)
|
||
ldq ra, 0x08(sp)
|
||
ldq v0, 0x00(sp)
|
||
lda sp, 0x28(sp)
|
||
|
||
.set at
|
||
.set reorder
|
||
|
||
ret zero, (v0) // return
|
||
.end penter
|
||
|
||
|
||
SBTTL("Get Caller")
|
||
|
||
LEAF_ENTRY(GetCaller)
|
||
|
||
.set noreorder
|
||
.set noat
|
||
|
||
// A1 contains the stack size of c_penter.
|
||
// in penter above, we put ra into 0(sp)
|
||
// so, 0x0(sp+a1) is the ra of penter.
|
||
addq sp, a1, t1
|
||
ldq t0, 0x000(t1)
|
||
stl t0, 0x000(a0)
|
||
|
||
.set at
|
||
.set reorder
|
||
|
||
ret zero, (ra) // return
|
||
.end GetCaller
|
||
|
||
SBTTL("Get Cal. Caller")
|
||
|
||
LEAF_ENTRY(GetCalCaller)
|
||
|
||
.set noreorder
|
||
.set noat
|
||
|
||
addq sp, a1, t1
|
||
ldq t0, 0x000(t1)
|
||
stl t0, 0x000(a0)
|
||
|
||
.set at
|
||
.set reorder
|
||
|
||
ret zero, (ra) // return
|
||
.end GetCalCaller
|
||
|
||
|
||
SBTTL("Get Stub Caller")
|
||
|
||
LEAF_ENTRY(GetStubCaller)
|
||
|
||
.set noreorder
|
||
.set noat
|
||
|
||
// A1 contains the stack size of c_penter.
|
||
// 0x028 is the stack size of penter (above)
|
||
// In the stub code, we put ra in 8(sp),
|
||
// So, the real return address is in 30(sp+a1).
|
||
// Isn't that Cool !?
|
||
addq sp, a1, t1
|
||
ldq t0, 0x030(t1)
|
||
stl t0, 0x000(a0)
|
||
|
||
.set at
|
||
.set reorder
|
||
|
||
ret zero, (ra) // return
|
||
.end GetStubCaller
|
||
//
|
||
// SBTTL("TESTING ONLY")
|
||
//
|
||
// LEAF_ENTRY(TESTINGONLY)
|
||
//
|
||
// .set noreorder
|
||
// .set noat
|
||
//
|
||
// lda sp, -0x10(sp)
|
||
// stq ra, 0x08(sp)
|
||
// stq v0, 0x00(sp)
|
||
// ldah t12, 0x5431
|
||
// lda t12, 0x8796
|
||
// jsr v0, (t12)
|
||
// ldq ra, 0x08(sp)
|
||
// ldq v0, 0x00(sp)
|
||
// ldah t12, 0x1234
|
||
// lda t12, 0x5678
|
||
// jmp zero, (t12)
|
||
// bis zero, zero, zero
|
||
//
|
||
//
|
||
// .set at
|
||
// .set reorder
|
||
//
|
||
// ret zero, (ra) // return
|
||
// .end TESTINGONLY
|
||
|
||
|
||
|