Windows NT 4.0 source code leak
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

// 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