mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
10 KiB
342 lines
10 KiB
// 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
|
|
|
|
|
|
|