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.
1065 lines
14 KiB
1065 lines
14 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
getsetrg.c
|
|
|
|
Abstract:
|
|
|
|
This module implement the code necessary to get and set register values.
|
|
These routines are used during the emulation of unaligned data references
|
|
and floating point exceptions.
|
|
|
|
Author:
|
|
|
|
David N. Cutler (davec) 17-Jun-1991
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
GeorgioP 03-06-92 Port for use by the IEEE filter routine
|
|
|
|
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntmips.h>
|
|
|
|
ULONG
|
|
_GetRegisterValue (
|
|
IN ULONG Register,
|
|
IN PCONTEXT Context
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is called to get the value of a register from the specified
|
|
exception or trap frame.
|
|
|
|
Arguments:
|
|
|
|
Register - Supplies the number of the register whose value is to be
|
|
returned. Integer registers are specified as 0 - 31 and floating
|
|
registers are specified as 32 - 63.
|
|
|
|
Context - Supplies a pointer to a context
|
|
|
|
Return Value:
|
|
|
|
The value of the specified register is returned as the function value.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
//
|
|
// Dispatch on the register number.
|
|
//
|
|
|
|
switch (Register) {
|
|
|
|
//
|
|
// Integer register zero.
|
|
//
|
|
|
|
case 0:
|
|
return 0;
|
|
|
|
//
|
|
// Integer register AT.
|
|
//
|
|
|
|
case 1:
|
|
return Context->IntAt;
|
|
|
|
//
|
|
// Integer register V0.
|
|
//
|
|
|
|
case 2:
|
|
return Context->IntV0;
|
|
|
|
//
|
|
// Integer register V1.
|
|
//
|
|
|
|
case 3:
|
|
return Context->IntV1;
|
|
|
|
//
|
|
// Integer register A0.
|
|
//
|
|
|
|
case 4:
|
|
return Context->IntA0;
|
|
|
|
//
|
|
// Integer register A1.
|
|
//
|
|
|
|
case 5:
|
|
return Context->IntA1;
|
|
|
|
//
|
|
// Integer register A2.
|
|
//
|
|
|
|
case 6:
|
|
return Context->IntA2;
|
|
|
|
//
|
|
// Integer register A3.
|
|
//
|
|
|
|
case 7:
|
|
return Context->IntA3;
|
|
|
|
//
|
|
// Integer register T0.
|
|
//
|
|
|
|
case 8:
|
|
return Context->IntT0;
|
|
|
|
//
|
|
// Integer register T1.
|
|
//
|
|
|
|
case 9:
|
|
return Context->IntT1;
|
|
|
|
//
|
|
// Integer register T2.
|
|
//
|
|
|
|
case 10:
|
|
return Context->IntT2;
|
|
|
|
//
|
|
// Integer register T3.
|
|
//
|
|
|
|
case 11:
|
|
return Context->IntT3;
|
|
|
|
//
|
|
// Integer register T4.
|
|
//
|
|
|
|
case 12:
|
|
return Context->IntT4;
|
|
|
|
//
|
|
// Integer register T5.
|
|
//
|
|
|
|
case 13:
|
|
return Context->IntT5;
|
|
|
|
//
|
|
// Integer register T6.
|
|
//
|
|
|
|
case 14:
|
|
return Context->IntT6;
|
|
|
|
//
|
|
// Integer register T7.
|
|
//
|
|
|
|
case 15:
|
|
return Context->IntT7;
|
|
|
|
//
|
|
// Integer register S0.
|
|
//
|
|
|
|
case 16:
|
|
return Context->IntS0;
|
|
|
|
//
|
|
// Integer register S1.
|
|
//
|
|
|
|
case 17:
|
|
return Context->IntS1;
|
|
|
|
//
|
|
// Integer register S2.
|
|
//
|
|
|
|
case 18:
|
|
return Context->IntS2;
|
|
|
|
//
|
|
// Integer register S3.
|
|
//
|
|
|
|
case 19:
|
|
return Context->IntS3;
|
|
|
|
//
|
|
// Integer register S4.
|
|
//
|
|
|
|
case 20:
|
|
return Context->IntS4;
|
|
|
|
//
|
|
// Integer register S5.
|
|
//
|
|
|
|
case 21:
|
|
return Context->IntS5;
|
|
|
|
//
|
|
// Integer register S6.
|
|
//
|
|
|
|
case 22:
|
|
return Context->IntS6;
|
|
|
|
//
|
|
// Integer register S7.
|
|
//
|
|
|
|
case 23:
|
|
return Context->IntS7;
|
|
|
|
//
|
|
// Integer register T8.
|
|
//
|
|
|
|
case 24:
|
|
return Context->IntT8;
|
|
|
|
//
|
|
// Integer register T9.
|
|
//
|
|
|
|
case 25:
|
|
return Context->IntT9;
|
|
|
|
//
|
|
// Integer register K0.
|
|
//
|
|
|
|
case 26:
|
|
return 0;
|
|
|
|
//
|
|
// Integer register K1.
|
|
//
|
|
|
|
case 27:
|
|
return 0;
|
|
|
|
//
|
|
// Integer register gp.
|
|
//
|
|
|
|
case 28:
|
|
return Context->IntGp;
|
|
|
|
//
|
|
// Integer register Sp.
|
|
//
|
|
|
|
case 29:
|
|
return Context->IntSp;
|
|
|
|
//
|
|
// Integer register S8.
|
|
//
|
|
|
|
case 30:
|
|
return Context->IntS8;
|
|
|
|
//
|
|
// Integer register Ra.
|
|
//
|
|
|
|
case 31:
|
|
return Context->IntRa;
|
|
|
|
//
|
|
// Floating register F0.
|
|
//
|
|
|
|
case 32:
|
|
return Context->FltF0;
|
|
|
|
//
|
|
// Floating register F1.
|
|
//
|
|
|
|
case 33:
|
|
return Context->FltF1;
|
|
|
|
//
|
|
// Floating register F2.
|
|
//
|
|
|
|
case 34:
|
|
return Context->FltF2;
|
|
|
|
//
|
|
// Floating register F3.
|
|
//
|
|
|
|
case 35:
|
|
return Context->FltF3;
|
|
|
|
//
|
|
// Floating register F4.
|
|
//
|
|
|
|
case 36:
|
|
return Context->FltF4;
|
|
|
|
//
|
|
// Floating register F5.
|
|
//
|
|
|
|
case 37:
|
|
return Context->FltF5;
|
|
|
|
//
|
|
// Floating register F6.
|
|
//
|
|
|
|
case 38:
|
|
return Context->FltF6;
|
|
|
|
//
|
|
// Floating register F7.
|
|
//
|
|
|
|
case 39:
|
|
return Context->FltF7;
|
|
|
|
//
|
|
// Floating register F8.
|
|
//
|
|
|
|
case 40:
|
|
return Context->FltF8;
|
|
|
|
//
|
|
// Floating register F9.
|
|
//
|
|
|
|
case 41:
|
|
return Context->FltF9;
|
|
|
|
//
|
|
// Floating register F10.
|
|
//
|
|
|
|
case 42:
|
|
return Context->FltF10;
|
|
|
|
//
|
|
// Floating register F11.
|
|
//
|
|
|
|
case 43:
|
|
return Context->FltF11;
|
|
|
|
//
|
|
// Floating register F12.
|
|
//
|
|
|
|
case 44:
|
|
return Context->FltF12;
|
|
|
|
//
|
|
// Floating register F13.
|
|
//
|
|
|
|
case 45:
|
|
return Context->FltF13;
|
|
|
|
//
|
|
// Floating register F14.
|
|
//
|
|
|
|
case 46:
|
|
return Context->FltF14;
|
|
|
|
//
|
|
// Floating register F15.
|
|
//
|
|
|
|
case 47:
|
|
return Context->FltF15;
|
|
|
|
//
|
|
// Floating register F16.
|
|
//
|
|
|
|
case 48:
|
|
return Context->FltF16;
|
|
|
|
//
|
|
// Floating register F17.
|
|
//
|
|
|
|
case 49:
|
|
return Context->FltF17;
|
|
|
|
//
|
|
// Floating register F18.
|
|
//
|
|
|
|
case 50:
|
|
return Context->FltF18;
|
|
|
|
//
|
|
// Floating register F19.
|
|
//
|
|
|
|
case 51:
|
|
return Context->FltF19;
|
|
|
|
//
|
|
// Floating register F20.
|
|
//
|
|
|
|
case 52:
|
|
return Context->FltF20;
|
|
|
|
//
|
|
// Floating register F21.
|
|
//
|
|
|
|
case 53:
|
|
return Context->FltF21;
|
|
|
|
//
|
|
// Floating register F22.
|
|
//
|
|
|
|
case 54:
|
|
return Context->FltF22;
|
|
|
|
//
|
|
// Floating register F23.
|
|
//
|
|
|
|
case 55:
|
|
return Context->FltF23;
|
|
|
|
//
|
|
// Floating register F24.
|
|
//
|
|
|
|
case 56:
|
|
return Context->FltF24;
|
|
|
|
//
|
|
// Floating register F25.
|
|
//
|
|
|
|
case 57:
|
|
return Context->FltF25;
|
|
|
|
//
|
|
// Floating register F26.
|
|
//
|
|
|
|
case 58:
|
|
return Context->FltF26;
|
|
|
|
//
|
|
// Floating register F27.
|
|
//
|
|
|
|
case 59:
|
|
return Context->FltF27;
|
|
|
|
//
|
|
// Floating register F28.
|
|
//
|
|
|
|
case 60:
|
|
return Context->FltF28;
|
|
|
|
//
|
|
// Floating register F29.
|
|
//
|
|
|
|
case 61:
|
|
return Context->FltF29;
|
|
|
|
//
|
|
// Floating register F30.
|
|
//
|
|
|
|
case 62:
|
|
return Context->FltF30;
|
|
|
|
//
|
|
// Floating register F31.
|
|
//
|
|
|
|
case 63:
|
|
return Context->FltF31;
|
|
}
|
|
}
|
|
|
|
VOID
|
|
_SetRegisterValue (
|
|
IN ULONG Register,
|
|
IN ULONG Value,
|
|
OUT PCONTEXT Context
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is called to set the value of a register in the specified
|
|
exception or trap frame.
|
|
|
|
Arguments:
|
|
|
|
Register - Supplies the number of the register whose value is to be
|
|
stored. Integer registers are specified as 0 - 31 and floating
|
|
registers are specified as 32 - 63.
|
|
|
|
Value - Supplies the value to be stored in the specified register.
|
|
|
|
Context - Supplies a pointer to an context record.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
//
|
|
// Dispatch on the register number.
|
|
//
|
|
|
|
switch (Register) {
|
|
|
|
//
|
|
// Integer register zero.
|
|
//
|
|
|
|
case 0:
|
|
return;
|
|
|
|
//
|
|
// Integer register AT.
|
|
//
|
|
|
|
case 1:
|
|
Context->IntAt = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register V0.
|
|
//
|
|
|
|
case 2:
|
|
Context->IntV0 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register V1.
|
|
//
|
|
|
|
case 3:
|
|
Context->IntV1 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register A0.
|
|
//
|
|
|
|
case 4:
|
|
Context->IntA0 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register A1.
|
|
//
|
|
|
|
case 5:
|
|
Context->IntA1 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register A2.
|
|
//
|
|
|
|
case 6:
|
|
Context->IntA2 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register A3.
|
|
//
|
|
|
|
case 7:
|
|
Context->IntA3 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T0.
|
|
//
|
|
|
|
case 8:
|
|
Context->IntT0 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T1.
|
|
//
|
|
|
|
case 9:
|
|
Context->IntT1 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T2.
|
|
//
|
|
|
|
case 10:
|
|
Context->IntT2 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T3.
|
|
//
|
|
|
|
case 11:
|
|
Context->IntT3 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T4.
|
|
//
|
|
|
|
case 12:
|
|
Context->IntT4 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T5.
|
|
//
|
|
|
|
case 13:
|
|
Context->IntT5 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T6.
|
|
//
|
|
|
|
case 14:
|
|
Context->IntT6 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T7.
|
|
//
|
|
|
|
case 15:
|
|
Context->IntT7 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S0.
|
|
//
|
|
|
|
case 16:
|
|
Context->IntS0 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S1.
|
|
//
|
|
|
|
case 17:
|
|
Context->IntS1 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S2.
|
|
//
|
|
|
|
case 18:
|
|
Context->IntS2 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S3.
|
|
//
|
|
|
|
case 19:
|
|
Context->IntS3 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S4.
|
|
//
|
|
|
|
case 20:
|
|
Context->IntS4 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S5.
|
|
//
|
|
|
|
case 21:
|
|
Context->IntS5 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S6.
|
|
//
|
|
|
|
case 22:
|
|
Context->IntS6 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S7.
|
|
//
|
|
|
|
case 23:
|
|
Context->IntS7 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T8.
|
|
//
|
|
|
|
case 24:
|
|
Context->IntT8 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register T9.
|
|
//
|
|
|
|
case 25:
|
|
Context->IntT9 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register K0.
|
|
//
|
|
|
|
case 26:
|
|
return;
|
|
|
|
//
|
|
// Integer register K1.
|
|
//
|
|
|
|
case 27:
|
|
return;
|
|
|
|
//
|
|
// Integer register gp.
|
|
//
|
|
|
|
case 28:
|
|
Context->IntGp = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register Sp.
|
|
//
|
|
|
|
case 29:
|
|
Context->IntSp = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register S8.
|
|
//
|
|
|
|
case 30:
|
|
Context->IntS8 = Value;
|
|
return;
|
|
|
|
//
|
|
// Integer register Ra.
|
|
//
|
|
|
|
case 31:
|
|
Context->IntRa = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F0.
|
|
//
|
|
|
|
case 32:
|
|
Context->FltF0 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F1.
|
|
//
|
|
|
|
case 33:
|
|
Context->FltF1 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F2.
|
|
//
|
|
|
|
case 34:
|
|
Context->FltF2 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F3.
|
|
//
|
|
|
|
case 35:
|
|
Context->FltF3 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F4.
|
|
//
|
|
|
|
case 36:
|
|
Context->FltF4 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F5.
|
|
//
|
|
|
|
case 37:
|
|
Context->FltF5 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F6.
|
|
//
|
|
|
|
case 38:
|
|
Context->FltF6 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F7.
|
|
//
|
|
|
|
case 39:
|
|
Context->FltF7 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F8.
|
|
//
|
|
|
|
case 40:
|
|
Context->FltF8 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F9.
|
|
//
|
|
|
|
case 41:
|
|
Context->FltF9 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F10.
|
|
//
|
|
|
|
case 42:
|
|
Context->FltF10 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F11.
|
|
//
|
|
|
|
case 43:
|
|
Context->FltF11 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F12.
|
|
//
|
|
|
|
case 44:
|
|
Context->FltF12 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F13.
|
|
//
|
|
|
|
case 45:
|
|
Context->FltF13 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F14.
|
|
//
|
|
|
|
case 46:
|
|
Context->FltF14 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F15.
|
|
//
|
|
|
|
case 47:
|
|
Context->FltF15 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F16.
|
|
//
|
|
|
|
case 48:
|
|
Context->FltF16 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F17.
|
|
//
|
|
|
|
case 49:
|
|
Context->FltF17 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F18.
|
|
//
|
|
|
|
case 50:
|
|
Context->FltF18 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F19.
|
|
//
|
|
|
|
case 51:
|
|
Context->FltF19 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F20.
|
|
//
|
|
|
|
case 52:
|
|
Context->FltF20 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F21.
|
|
//
|
|
|
|
case 53:
|
|
Context->FltF21 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F22.
|
|
//
|
|
|
|
case 54:
|
|
Context->FltF22 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F23.
|
|
//
|
|
|
|
case 55:
|
|
Context->FltF23 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F24.
|
|
//
|
|
|
|
case 56:
|
|
Context->FltF24 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F25.
|
|
//
|
|
|
|
case 57:
|
|
Context->FltF25 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F26.
|
|
//
|
|
|
|
case 58:
|
|
Context->FltF26 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F27.
|
|
//
|
|
|
|
case 59:
|
|
Context->FltF27 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F28.
|
|
//
|
|
|
|
case 60:
|
|
Context->FltF28 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F29.
|
|
//
|
|
|
|
case 61:
|
|
Context->FltF29 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F30.
|
|
//
|
|
|
|
case 62:
|
|
Context->FltF30 = Value;
|
|
return;
|
|
|
|
//
|
|
// Floating register F31.
|
|
//
|
|
|
|
case 63:
|
|
Context->FltF31 = Value;
|
|
return;
|
|
}
|
|
}
|