168 lines
5.7 KiB
ArmAsm
168 lines
5.7 KiB
ArmAsm
// TITLE("PspGetSetContextSpecialAPC")
|
||
//++
|
||
//
|
||
// Copyright (c) 1994 IBM Corporation
|
||
//
|
||
// Module Name:
|
||
//
|
||
// psapcppc.s
|
||
//
|
||
// Abstract:
|
||
//
|
||
// Since APCs are implemented in software on the PowerPC, it is possible
|
||
// that all the non-volatile registers are not restored prior to returning
|
||
// to user mode. This procedure saves and restores all non-volatiles to
|
||
// ensure that the full context (set via the PspGetSetContextSpecialAPC)
|
||
// is returned to the thread.
|
||
//
|
||
// Author:
|
||
//
|
||
// Chuck Bauman 26-Sep-1994
|
||
//
|
||
// Environment:
|
||
//
|
||
// Kernel mode.
|
||
//
|
||
// Revision History:
|
||
//
|
||
//--
|
||
|
||
#include "ksppc.h"
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// PspGetSetContextSpecialAPC(
|
||
// IN PKAPC Apc,
|
||
// IN PKNORMAL_ROUTINE *NormalRoutine,
|
||
// IN PVOID *NormalContext,
|
||
// IN PVOID *SystemArgument1,
|
||
// IN PVOID *SystemArgument2
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Ensure that all non-volatiles are stored on the kernel mode stack
|
||
// so that the normal save/restore prologue/epilogue code restores
|
||
// the entire context after the set context APC prior to returning.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Apc (r.3) - Supplies a pointer to the APC control object that caused entry
|
||
// into this routine.
|
||
//
|
||
// NormalRoutine (r.4) - Supplies a pointer to the normal routine function
|
||
// that was specified when the APC was initialized. This parameter is not
|
||
// used.
|
||
//
|
||
// NormalContext (r.5) - Supplies a pointer to an arbitrary data structure
|
||
// that was specified when the APC was initialized. This parameter is not
|
||
// used.
|
||
//
|
||
// SystemArgument1, SystemArgument2 (r.6,r.7) - Supplies a set of two
|
||
// pointer arguments that contain untyped data. These parameters
|
||
// are not used.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
.extern ..PspGetSetContextApc
|
||
|
||
.struct 0
|
||
.space STK_MIN_FRAME
|
||
Lr: .space 4
|
||
.align 3
|
||
ApcEx: .space ExceptionFrameLength
|
||
.align 3
|
||
ApcFrameLen:
|
||
|
||
SPECIAL_ENTRY(PspGetSetContextSpecialApc)
|
||
mflr r.0
|
||
stwu r.sp, -ApcFrameLen(r.sp) // buy stack frame
|
||
stw r.14, ApcEx + ExGpr14 (r.sp) // Store non-volatile GPRs
|
||
stw r.15, ApcEx + ExGpr15 (r.sp)
|
||
stw r.16, ApcEx + ExGpr16 (r.sp)
|
||
stw r.17, ApcEx + ExGpr17 (r.sp)
|
||
stw r.18, ApcEx + ExGpr18 (r.sp)
|
||
stw r.19, ApcEx + ExGpr19 (r.sp)
|
||
stw r.20, ApcEx + ExGpr20 (r.sp)
|
||
stw r.21, ApcEx + ExGpr21 (r.sp)
|
||
stw r.22, ApcEx + ExGpr22 (r.sp)
|
||
stw r.23, ApcEx + ExGpr23 (r.sp)
|
||
stw r.24, ApcEx + ExGpr24 (r.sp)
|
||
stw r.25, ApcEx + ExGpr25 (r.sp)
|
||
stw r.26, ApcEx + ExGpr26 (r.sp)
|
||
stw r.27, ApcEx + ExGpr27 (r.sp)
|
||
stw r.28, ApcEx + ExGpr28 (r.sp)
|
||
stw r.29, ApcEx + ExGpr29 (r.sp)
|
||
stw r.30, ApcEx + ExGpr30 (r.sp)
|
||
stw r.31, ApcEx + ExGpr31 (r.sp)
|
||
stfd f.14, ApcEx + ExFpr14 (r.sp) // Store non-volatile FPRs
|
||
stfd f.15, ApcEx + ExFpr15 (r.sp)
|
||
stfd f.16, ApcEx + ExFpr16 (r.sp)
|
||
stfd f.17, ApcEx + ExFpr17 (r.sp)
|
||
stfd f.18, ApcEx + ExFpr18 (r.sp)
|
||
stfd f.19, ApcEx + ExFpr19 (r.sp)
|
||
stfd f.20, ApcEx + ExFpr20 (r.sp)
|
||
stfd f.21, ApcEx + ExFpr21 (r.sp)
|
||
stfd f.22, ApcEx + ExFpr22 (r.sp)
|
||
stfd f.23, ApcEx + ExFpr23 (r.sp)
|
||
stfd f.24, ApcEx + ExFpr24 (r.sp)
|
||
stfd f.25, ApcEx + ExFpr25 (r.sp)
|
||
stfd f.26, ApcEx + ExFpr26 (r.sp)
|
||
stfd f.27, ApcEx + ExFpr27 (r.sp)
|
||
stfd f.28, ApcEx + ExFpr28 (r.sp)
|
||
stfd f.29, ApcEx + ExFpr29 (r.sp)
|
||
stfd f.30, ApcEx + ExFpr30 (r.sp)
|
||
stfd f.31, ApcEx + ExFpr31 (r.sp)
|
||
stw r.0, Lr (r.sp) // save return address
|
||
PROLOGUE_END(PspGetSetContextSpecialApc)
|
||
|
||
bl ..PspGetSetContextApc
|
||
|
||
lwz r.0, Lr (r.sp) // restore the return address
|
||
lwz r.14, ApcEx + ExGpr14 (r.sp) // Store non-volatile GPRs
|
||
lwz r.15, ApcEx + ExGpr15 (r.sp)
|
||
lwz r.16, ApcEx + ExGpr16 (r.sp)
|
||
lwz r.17, ApcEx + ExGpr17 (r.sp)
|
||
lwz r.18, ApcEx + ExGpr18 (r.sp)
|
||
lwz r.19, ApcEx + ExGpr19 (r.sp)
|
||
lwz r.20, ApcEx + ExGpr20 (r.sp)
|
||
lwz r.21, ApcEx + ExGpr21 (r.sp)
|
||
lwz r.22, ApcEx + ExGpr22 (r.sp)
|
||
lwz r.23, ApcEx + ExGpr23 (r.sp)
|
||
lwz r.24, ApcEx + ExGpr24 (r.sp)
|
||
lwz r.25, ApcEx + ExGpr25 (r.sp)
|
||
lwz r.26, ApcEx + ExGpr26 (r.sp)
|
||
lwz r.27, ApcEx + ExGpr27 (r.sp)
|
||
lwz r.28, ApcEx + ExGpr28 (r.sp)
|
||
lwz r.29, ApcEx + ExGpr29 (r.sp)
|
||
lwz r.30, ApcEx + ExGpr30 (r.sp)
|
||
lwz r.31, ApcEx + ExGpr31 (r.sp)
|
||
mtlr r.0
|
||
lfd f.14, ApcEx + ExFpr14 (r.sp) // Store non-volatile FPRs
|
||
lfd f.15, ApcEx + ExFpr15 (r.sp)
|
||
lfd f.16, ApcEx + ExFpr16 (r.sp)
|
||
lfd f.17, ApcEx + ExFpr17 (r.sp)
|
||
lfd f.18, ApcEx + ExFpr18 (r.sp)
|
||
lfd f.19, ApcEx + ExFpr19 (r.sp)
|
||
lfd f.20, ApcEx + ExFpr20 (r.sp)
|
||
lfd f.21, ApcEx + ExFpr21 (r.sp)
|
||
lfd f.22, ApcEx + ExFpr22 (r.sp)
|
||
lfd f.23, ApcEx + ExFpr23 (r.sp)
|
||
lfd f.24, ApcEx + ExFpr24 (r.sp)
|
||
lfd f.25, ApcEx + ExFpr25 (r.sp)
|
||
lfd f.26, ApcEx + ExFpr26 (r.sp)
|
||
lfd f.27, ApcEx + ExFpr27 (r.sp)
|
||
lfd f.28, ApcEx + ExFpr28 (r.sp)
|
||
lfd f.29, ApcEx + ExFpr29 (r.sp)
|
||
lfd f.30, ApcEx + ExFpr30 (r.sp)
|
||
lfd f.31, ApcEx + ExFpr31 (r.sp)
|
||
addi r.sp, r.sp, ApcFrameLen
|
||
SPECIAL_EXIT(PspGetSetContextSpecialApc)
|
||
|