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.
 
 
 
 
 
 

273 lines
9.6 KiB

//
// Miscellaneous assembly-language routines and data for
// PowerPC RTL
//
#include "ksppc.h"
//
// Copyright 1993 IBM Corporation
//
// By Rick Simpson, 17 August 1993
//
//-----------------------------------------------------------------------------
//
// These routines save and restore only the GPRs and FPRs.
//
// Saving and restoring of other non-volatile registers (LR, certain
// fields of CR) is the responsibility of in-line prologue and epilogue
// code.
//
//-----------------------------------------------------------------------------
//
// _savegpr_<n>
// Inputs:
// r12 = pointer to END of GPR save area
// LR = return address to invoking prologue
// Saves GPR<n> through GPR31 in area preceeding where r12 points
//
// _savefpr_<n>
// Inputs:
// r1 = pointer to stack frame header
// LR = return address to invoking prologue
// Saves FPR<m> through FPR31 in area preceeding stack frame header
//
//-----------------------------------------------------------------------------
//
// _restgpr_<n>
// Inputs:
// r12 = pointer to END of GPR save area
// LR = return address to invoking prologue
// Restores GPR<n> through GPR31 from area preceeding where r12 points
//
// _restfpr_<m>
// Inputs:
// r1 = pointer to stack frame header
// LR = return address to invoking prologue
// Restores FPR<m> through FPR31 from area preceeding stack frame header
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//
// _savegpr_<n> -- Save GPRs when FPRs are also saved
//
// On entry:
// r12 = address of END of GPR save area
// LR = return address to prologue
//
// Saves GPR<n> through GPR31 in area preceeding where r12 points
//
//-----------------------------------------------------------------------------
FN_TABLE(_savegpr_13,0,1)
DUMMY_ENTRY(_savegpr_13)
.set _savegpr_13.body,.._savegpr_13-1
stw r13, -4*(32-13)(r12)
DUMMY_ENTRY(_savegpr_14)
stw r14, -4*(32-14)(r12)
DUMMY_ENTRY(_savegpr_15)
stw r15, -4*(32-15)(r12)
DUMMY_ENTRY(_savegpr_16)
stw r16, -4*(32-16)(r12)
DUMMY_ENTRY(_savegpr_17)
stw r17, -4*(32-17)(r12)
DUMMY_ENTRY(_savegpr_18)
stw r18, -4*(32-18)(r12)
DUMMY_ENTRY(_savegpr_19)
stw r19, -4*(32-19)(r12)
DUMMY_ENTRY(_savegpr_20)
stw r20, -4*(32-20)(r12)
DUMMY_ENTRY(_savegpr_21)
stw r21, -4*(32-21)(r12)
DUMMY_ENTRY(_savegpr_22)
stw r22, -4*(32-22)(r12)
DUMMY_ENTRY(_savegpr_23)
stw r23, -4*(32-23)(r12)
DUMMY_ENTRY(_savegpr_24)
stw r24, -4*(32-24)(r12)
DUMMY_ENTRY(_savegpr_25)
stw r25, -4*(32-25)(r12)
DUMMY_ENTRY(_savegpr_26)
stw r26, -4*(32-26)(r12)
DUMMY_ENTRY(_savegpr_27)
stw r27, -4*(32-27)(r12)
DUMMY_ENTRY(_savegpr_28)
stw r28, -4*(32-28)(r12)
DUMMY_ENTRY(_savegpr_29)
stw r29, -4*(32-29)(r12)
DUMMY_ENTRY(_savegpr_30)
stw r30, -4*(32-30)(r12)
DUMMY_ENTRY(_savegpr_31)
stw r31, -4*(32-31)(r12)
SPECIAL_EXIT(_savegpr_13)
//-----------------------------------------------------------------------------
//
// _savefpr_<n> -- Saves FPRs
//
// On entry:
// r1 = pointer to stack frame header
// LR = return address to prologue
//
// Saves FPR<n> through FPR31 in area preceeding stack frame header
//
//-----------------------------------------------------------------------------
FN_TABLE(_savefpr_14,0,1)
DUMMY_ENTRY(_savefpr_14)
.set _savefpr_14.body,.._savefpr_14-1
stfd f14, -8*(32-14)(r1)
DUMMY_ENTRY(_savefpr_15)
stfd f15, -8*(32-15)(r1)
DUMMY_ENTRY(_savefpr_16)
stfd f16, -8*(32-16)(r1)
DUMMY_ENTRY(_savefpr_17)
stfd f17, -8*(32-17)(r1)
DUMMY_ENTRY(_savefpr_18)
stfd f18, -8*(32-18)(r1)
DUMMY_ENTRY(_savefpr_19)
stfd f19, -8*(32-19)(r1)
DUMMY_ENTRY(_savefpr_20)
stfd f20, -8*(32-20)(r1)
DUMMY_ENTRY(_savefpr_21)
stfd f21, -8*(32-21)(r1)
DUMMY_ENTRY(_savefpr_22)
stfd f22, -8*(32-22)(r1)
DUMMY_ENTRY(_savefpr_23)
stfd f23, -8*(32-23)(r1)
DUMMY_ENTRY(_savefpr_24)
stfd f24, -8*(32-24)(r1)
DUMMY_ENTRY(_savefpr_25)
stfd f25, -8*(32-25)(r1)
DUMMY_ENTRY(_savefpr_26)
stfd f26, -8*(32-26)(r1)
DUMMY_ENTRY(_savefpr_27)
stfd f27, -8*(32-27)(r1)
DUMMY_ENTRY(_savefpr_28)
stfd f28, -8*(32-28)(r1)
DUMMY_ENTRY(_savefpr_29)
stfd f29, -8*(32-29)(r1)
DUMMY_ENTRY(_savefpr_30)
stfd f30, -8*(32-30)(r1)
DUMMY_ENTRY(_savefpr_31)
stfd f31, -8*(32-31)(r1)
SPECIAL_EXIT(_savefpr_14)
//-----------------------------------------------------------------------------
//
// _restgpr_<n> -- Restore GPRs when FPRs are also restored
//
// On entry:
// r12 = address of END of GPR save area
// LR = return address
//
// Restores GPR<n> through GPR31 from area preceeding where r12 points
//
//-----------------------------------------------------------------------------
FN_TABLE(_restgpr_13,0,2)
DUMMY_ENTRY(_restgpr_13)
.set _restgpr_13.body,.._restgpr_13-2
lwz r13, -4*(32-13)(r12)
DUMMY_ENTRY(_restgpr_14)
lwz r14, -4*(32-14)(r12)
DUMMY_ENTRY(_restgpr_15)
lwz r15, -4*(32-15)(r12)
DUMMY_ENTRY(_restgpr_16)
lwz r16, -4*(32-16)(r12)
DUMMY_ENTRY(_restgpr_17)
lwz r17, -4*(32-17)(r12)
DUMMY_ENTRY(_restgpr_18)
lwz r18, -4*(32-18)(r12)
DUMMY_ENTRY(_restgpr_19)
lwz r19, -4*(32-19)(r12)
DUMMY_ENTRY(_restgpr_20)
lwz r20, -4*(32-20)(r12)
DUMMY_ENTRY(_restgpr_21)
lwz r21, -4*(32-21)(r12)
DUMMY_ENTRY(_restgpr_22)
lwz r22, -4*(32-22)(r12)
DUMMY_ENTRY(_restgpr_23)
lwz r23, -4*(32-23)(r12)
DUMMY_ENTRY(_restgpr_24)
lwz r24, -4*(32-24)(r12)
DUMMY_ENTRY(_restgpr_25)
lwz r25, -4*(32-25)(r12)
DUMMY_ENTRY(_restgpr_26)
lwz r26, -4*(32-26)(r12)
DUMMY_ENTRY(_restgpr_27)
lwz r27, -4*(32-27)(r12)
DUMMY_ENTRY(_restgpr_28)
lwz r28, -4*(32-28)(r12)
DUMMY_ENTRY(_restgpr_29)
lwz r29, -4*(32-29)(r12)
DUMMY_ENTRY(_restgpr_30)
lwz r30, -4*(32-30)(r12)
DUMMY_ENTRY(_restgpr_31)
lwz r31, -4*(32-31)(r12)
SPECIAL_EXIT(_restgpr_13)
//-----------------------------------------------------------------------------
//
// _restfpr_<n> -- Restores FPRs
//
// On entry:
// r1 = pointer to stack frame header
// LR = return address
//
// Restores FPR<n> through FPR31 from area preceeding stack frame header
//
//-----------------------------------------------------------------------------
FN_TABLE(_restfpr_14,0,2)
DUMMY_ENTRY(_restfpr_14)
.set _restfpr_14.body,.._restfpr_14-2
lfd f14, -8*(32-14)(r1)
DUMMY_ENTRY(_restfpr_15)
lfd f15, -8*(32-15)(r1)
DUMMY_ENTRY(_restfpr_16)
lfd f16, -8*(32-16)(r1)
DUMMY_ENTRY(_restfpr_17)
lfd f17, -8*(32-17)(r1)
DUMMY_ENTRY(_restfpr_18)
lfd f18, -8*(32-18)(r1)
DUMMY_ENTRY(_restfpr_19)
lfd f19, -8*(32-19)(r1)
DUMMY_ENTRY(_restfpr_20)
lfd f20, -8*(32-20)(r1)
DUMMY_ENTRY(_restfpr_21)
lfd f21, -8*(32-21)(r1)
DUMMY_ENTRY(_restfpr_22)
lfd f22, -8*(32-22)(r1)
DUMMY_ENTRY(_restfpr_23)
lfd f23, -8*(32-23)(r1)
DUMMY_ENTRY(_restfpr_24)
lfd f24, -8*(32-24)(r1)
DUMMY_ENTRY(_restfpr_25)
lfd f25, -8*(32-25)(r1)
DUMMY_ENTRY(_restfpr_26)
lfd f26, -8*(32-26)(r1)
DUMMY_ENTRY(_restfpr_27)
lfd f27, -8*(32-27)(r1)
DUMMY_ENTRY(_restfpr_28)
lfd f28, -8*(32-28)(r1)
DUMMY_ENTRY(_restfpr_29)
lfd f29, -8*(32-29)(r1)
DUMMY_ENTRY(_restfpr_30)
lfd f30, -8*(32-30)(r1)
DUMMY_ENTRY(_restfpr_31)
lfd f31, -8*(32-31)(r1)
SPECIAL_EXIT(_restfpr_14)
//
// This is a copy of the function table entries for the millicode. It's
// used with the PPCKD_SYMBOL_SEARCH mechanism in vunwind.c to allow
// for older versions of miscasm.obj.
//
.reldata
.globl _millicode_table
_millicode_table:
.long .._savegpr_13, _savegpr_13.end, 0, 1, .._savegpr_13
.long .._savefpr_14, _savefpr_14.end, 0, 1, .._savefpr_14
.long .._restgpr_13, _restgpr_13.end, 0, 2, .._restgpr_13
.long .._restfpr_14, _restfpr_14.end, 0, 2, .._restfpr_14