Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

150 lines
3.0 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
trapc.c
Abstract:
This module contains utility functions used by IA-64 Boot Debugger.
Author:
Allen Kay 11-Nov-99 [email protected]
Environment:
Revision History:
--*/
#include "bd.h"
extern ULONGLONG BdPcr;
extern VOID BdInstallVectors();
typedef struct _MOVL_INST {
union {
struct {
ULONGLONG qp: 6;
ULONGLONG r1: 7;
ULONGLONG Imm7b: 7;
ULONGLONG Vc: 1;
ULONGLONG Ic: 1;
ULONGLONG Imm5c: 5;
ULONGLONG Imm9d: 9;
ULONGLONG I: 1;
ULONGLONG OpCode: 4;
ULONGLONG Rsv: 23;
} i_field;
ULONGLONG Ulong64;
} u;
} MOVL_INST, *PMOVL_INST;
ULONGLONG
BdSetMovlImmediate (
IN OUT PULONGLONG Ip,
IN ULONGLONG VectorAddr
)
/*++
Routine Description:
Extract immediate operand from break instruction.
Arguments:
Ip - Bundle address of instruction
Return Value:
Value of immediate operand.
--*/
{
PULONGLONG BundleAddress;
ULONGLONG BundleLow;
ULONGLONG BundleHigh;
IN MOVL_INST MovlInst, Slot0, Slot1, Slot2;
IN ULONGLONG Imm64;
BundleAddress = (PULONGLONG)Ip;
BundleLow = *BundleAddress;
BundleHigh = *(BundleAddress+1);
//
// Extract Slot0
//
Slot0.u.Ulong64 = BundleLow & 0x3FFFFFFFFFFF;
//
// Now set immediate address from slot1
//
Slot1.u.Ulong64 = (BundleLow >> 46) | (BundleHigh << 18);
Slot1.u.Ulong64 = (VectorAddr >> 22) & 0x1FFFFFFFFFF;
//
// First set immediate address from slot2
//
Slot2.u.Ulong64 = (BundleHigh >> 23);
Slot2.u.i_field.I = (VectorAddr >> 63) & 0x1;
Slot2.u.i_field.Ic = (VectorAddr >> 21) & 0x1;
Slot2.u.i_field.Imm5c = (VectorAddr >> 16) & 0x1F;
Slot2.u.i_field.Imm9d = (VectorAddr >> 7) & 0x1FF;
Slot2.u.i_field.Imm7b = VectorAddr & 0x7F;
//
// Change the bundle
//
*BundleAddress = (BundleLow & 0x3FFFFFFFFFFF) |
Slot1.u.Ulong64 << 46;
*(BundleAddress+1) = Slot2.u.Ulong64 << 23 |
(Slot1.u.Ulong64 & 0x1FFFFFC0000) >> 18;
//
// Now get the address.
//
BundleAddress = (PULONGLONG)Ip;
BundleLow = *BundleAddress;
BundleHigh = *(BundleAddress+1);
//
// First get immediate address from slot2
//
MovlInst.u.Ulong64 = (BundleHigh >> 23);
Imm64 = MovlInst.u.i_field.I << 63 |
MovlInst.u.i_field.Ic << 21 |
MovlInst.u.i_field.Imm5c << 16 |
MovlInst.u.i_field.Imm9d << 7 |
MovlInst.u.i_field.Imm7b;
//
// Now get immediate address from slot1
//
MovlInst.u.Ulong64 = (BundleLow >> 46) | (BundleHigh << 18);
Imm64 = Imm64 | ( (MovlInst.u.Ulong64 & 0x1FFFFFFFFFF) << 22);
return Imm64;
}
VOID
BdIa64Init()
{
BdInstallVectors();
BdPrcb.PcrPage = BdPcr >> PAGE_SIZE;
}