575 lines
8.2 KiB
ArmAsm
575 lines
8.2 KiB
ArmAsm
// TITLE ("Memory Fences, Load Acquires and Store Acquires")
|
||
|
||
/*++
|
||
|
||
Copyright (c) 1995 Intel Corporation
|
||
|
||
Module Name:
|
||
|
||
i64ioasm.s assembly routines for read and write I/O
|
||
|
||
Abstract:
|
||
|
||
This module implements the I/O port access routines.
|
||
|
||
Author:
|
||
|
||
Bernard Lint, M. Jayakumar 17 Sep '97
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "ksia64.h"
|
||
|
||
#define HAL_RR_PS_VE 0x69
|
||
|
||
.file "i64ioasm.s"
|
||
|
||
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpInsertTranslationRegister (
|
||
IN UINT_PTR IFA,
|
||
IN ULONG SlotNumber,
|
||
IN ULONGLONG Attribute,
|
||
IN ULONGLONG ITIR
|
||
)
|
||
|
||
|
||
Routine Description:
|
||
|
||
This function fills a fixed entry in TR
|
||
|
||
|
||
N.B. It is assumed that the entry is not in the TB and therefore the TB
|
||
is not probed.
|
||
|
||
Arguements:
|
||
|
||
(a0) - Supplies the virtual page number to be loaded into IFA.
|
||
|
||
(a1) - Supplies the slot number to be used for Translation Register.
|
||
|
||
(a2) - Supplies the attribute and portion of the physical address.
|
||
|
||
(a3) - Supplies the value to be loaded into ITIR.
|
||
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
|
||
LEAF_ENTRY(HalpInsertTranslationRegister)
|
||
|
||
// Register aliases
|
||
//
|
||
|
||
rT1 = t3
|
||
rT2 = t4
|
||
|
||
rPKR = t13
|
||
rRR = t15
|
||
|
||
|
||
//
|
||
// rsm to reset PSR.i bit
|
||
//
|
||
|
||
|
||
rsm 1 << PSR_I // reset PSR.i bit
|
||
;;
|
||
rsm 1 << PSR_IC // reset PSR.ic bit
|
||
;;
|
||
srlz.d // serialize
|
||
|
||
//
|
||
// set RR[0],Region ID (HAL_ RID) = 0x7FFFFF,Page Size (PS) = 8K,
|
||
// VHPT enabled (VE) = 1
|
||
//
|
||
|
||
|
||
// dep.z rRR= RR_IO_PORT, RR_INDEX, RR_INDEX_LEN
|
||
|
||
dep.z rRR = 5, RR_INDEX, RR_INDEX_LEN
|
||
|
||
movl rT2 = (0x7FFFFF << RR_RID) | HAL_RR_PS_VE
|
||
;;
|
||
|
||
mov rr[rRR] = rT2 // Initialize rr[RR_IOPort]
|
||
|
||
|
||
// Protection Key Registers
|
||
|
||
mov rPKR = PKRNUM // Total number of key registers
|
||
;;
|
||
|
||
sub rPKR = rPKR, zero,1 // Choose the last one
|
||
|
||
movl rT2 = (0x7FFFFF << RR_RID) | PKR_VALID
|
||
;;
|
||
|
||
mov pkr[rPKR] = rT2
|
||
;;
|
||
|
||
srlz.i
|
||
mov cr.ifa = a0
|
||
mov cr.itir = a3
|
||
;;
|
||
|
||
itr.d dtr[a1] = a2
|
||
ssm 1 << PSR_IC // set PSR.ic bit again
|
||
;;
|
||
srlz.d // serialize
|
||
ssm 1 << PSR_I // set PSR.i bit again
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT(HalpInsertTranslationRegister)
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpLoadBufferUCHAR (
|
||
PUCHAR VirtualAddress,
|
||
PUCHAR Buffer,
|
||
UCHAR Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpLoadBufferUCHAR)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
mf
|
||
|
||
LoadChar:
|
||
|
||
ld1.acq t1 = [a0]
|
||
;;
|
||
st1 [a1] = t1, 1
|
||
|
||
br.cloop.dptk.few LoadChar
|
||
;;
|
||
|
||
mf.a
|
||
mov ar.lc = t22
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpLoadBufferUCHAR)
|
||
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpLoadBufferUSHORT (
|
||
PUSHORT VirtualAddress,
|
||
PUSHORT Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpLoadBufferUSHORT)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
mf
|
||
|
||
LoadShort:
|
||
|
||
ld2.acq t1 = [a0]
|
||
;;
|
||
st2 [a1] = t1, 2
|
||
|
||
br.cloop.dptk.few LoadShort
|
||
;;
|
||
|
||
mf.a
|
||
mov ar.lc = t22
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpLoadBufferUSHORT)
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpLoadBufferULONG (
|
||
PULONG VirtualAddress,
|
||
PULONG Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpLoadBufferULONG)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
mf
|
||
|
||
LoadLong:
|
||
|
||
ld4.acq t1 = [a0]
|
||
;;
|
||
st4 [a1] = t1, 4
|
||
|
||
br.cloop.dptk.few LoadLong
|
||
;;
|
||
|
||
mf.a
|
||
mov ar.lc = t22
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpLoadBufferULONG)
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpLoadBufferULONGLONG (
|
||
PULONGLONG VirtualAddress,
|
||
PULONGLONG Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpLoadBufferULONGLONG)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
mf
|
||
|
||
LoadLongLong:
|
||
|
||
ld8.acq t1 = [a0]
|
||
;;
|
||
st8 [a1] = t1, 8
|
||
|
||
br.cloop.dptk.few LoadLongLong
|
||
;;
|
||
|
||
mf.a
|
||
mov ar.lc = t22
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpLoadBufferULONGLONG)
|
||
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpStoreBufferUCHAR (
|
||
PUCHAR VirtualAddress,
|
||
PUCHAR Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpStoreBufferUCHAR)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
|
||
StoreChar:
|
||
|
||
ld1 t1 = [a1], 1
|
||
;;
|
||
st1.rel [a0] = t1
|
||
|
||
br.cloop.dptk.few StoreChar
|
||
;;
|
||
|
||
mf
|
||
|
||
mf.a
|
||
|
||
mov ar.lc = t22
|
||
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpStoreBufferUCHAR)
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpStoreBufferUSHORT (
|
||
PUSHORT VirtualAddress,
|
||
PUSHORT Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpStoreBufferUSHORT)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
|
||
StoreShort:
|
||
|
||
ld2 t1 = [a1], 2
|
||
;;
|
||
st2.rel [a0] = t1
|
||
|
||
br.cloop.dptk.few StoreShort
|
||
;;
|
||
|
||
mf
|
||
|
||
mf.a
|
||
|
||
mov ar.lc = t22
|
||
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpStoreBufferUSHORT)
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpStoreBufferULONG (
|
||
PULONG VirtualAddress,
|
||
PULONG Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpStoreBufferULONG)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
|
||
StoreLong:
|
||
|
||
ld4.s t1 = [a1],t0
|
||
;;
|
||
st4.rel [a0] = t1,4
|
||
|
||
br.cloop.dptk.few StoreLong
|
||
;;
|
||
|
||
mf
|
||
|
||
mf.a
|
||
|
||
mov ar.lc = t22
|
||
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpStoreBufferULONG)
|
||
|
||
/*++
|
||
|
||
VOID
|
||
HalpStoreBufferULONGLONG (
|
||
PULONGLONG VirtualAddress,
|
||
PULONGLONG Buffer,
|
||
ULONG Count
|
||
);
|
||
|
||
Routine Description:
|
||
|
||
Arguements:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
LEAF_ENTRY(HalpStoreBufferULONGLONG)
|
||
|
||
.prologue
|
||
.save ar.lc, t22
|
||
mov t22 = ar.lc
|
||
|
||
sub a2 = a2,zero,1
|
||
;;
|
||
|
||
PROLOGUE_END
|
||
|
||
mov ar.lc = a2
|
||
|
||
StoreLongLong:
|
||
|
||
ld8.s t1 = [a1],t0
|
||
;;
|
||
st8.rel [a0] = t1, 8
|
||
|
||
br.cloop.dptk.few StoreLongLong
|
||
;;
|
||
|
||
mf
|
||
|
||
mf.a
|
||
|
||
mov ar.lc = t22
|
||
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT (HalpStoreBufferULONGLONG)
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// ReadCpuLid(VOID);
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function returns that value of cr.lid for this cpu
|
||
//
|
||
// Arguements:
|
||
//
|
||
// Return Value:
|
||
//
|
||
// LID register contents
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(ReadCpuLid)
|
||
|
||
mov v0 = cr.lid
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT(ReadCpuLid)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// IsPsrDtOn(VOID);
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function returns the value of cr.dt for this cpu
|
||
//
|
||
// Arguements:
|
||
//
|
||
// Return Value:
|
||
//
|
||
// cr.dt
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(IsPsrDtOn)
|
||
|
||
mov t0 = psr
|
||
movl t1 = 1 << PSR_DT
|
||
;;
|
||
and t2 = t0, t1
|
||
;;
|
||
shr.u v0 = t2, PSR_DT
|
||
|
||
LEAF_RETURN
|
||
|
||
LEAF_EXIT(IsPsrDtOn)
|
||
|