2025-04-27 07:49:33 -04:00

116 lines
3.1 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// TITLE("Byte and Short Emulation")
//++
//
//
// Copyright (c) 1995 Digital Equipment Corporation
//
// Module Name:
//
// byteme.s
//
// Abstract:
//
// This module implements the code to perform atomic store operations
// on bytes and shorts (words).
//
// Atomic byte and short opcodes have been added into the Alpha
// architecture as of Alpha 21164A or EV56. In chips 21164 and prior,
// an illegal instruction will occur and an exception will lead them here.
//
// Author:
//
// Wim Colgate, May 18th, 1995
// Tom Van Baak, May 18th, 1995
//
// Environment:
//
// Kernel mode only.
//
// Revision History:
//
//--
#include "ksalpha.h"
//++
//
// VOID
// KiInterlockedStoreByte(
// IN PUCHAR Address,
// IN UCHAR Data
// )
//
// Routine Description:
//
// This routine stores the data byte specified by Data to the location
// specified by Address. The architecture requires byte granularity,
// so locking is necessary.
//
// Arguments:
//
// Address(a0) - Supplies a pointer to byte data value.
// Data(a1) - Supplied the byte data value to store.
//
// Return Value:
//
// None
//
//--
LEAF_ENTRY(KiInterlockedStoreByte)
bic a0, 3, t0 // clear low 2 bits
and a0, 3, t1 // mask of three low bits
10: ldl_l t2, 0(t0) // load locked full longword
insbl a1, t1, t3 // insert byte low
mskbl t2, t1, t2 // mask byte low
bis t2, t3, t2 // merge data
stl_c t2, 0(t0) // store conditional
beq t2, 20f // failed to store, retry, forward
ret zero, (ra), 1 // return
20: br zero, 10b // try again
.end KiInterlockedStoreByte
//++
//
// VOID
// KiInterlockedStoreWord(
// IN PUSHORT Address,
// IN USHORT Data
// )
//
// Routine Description:
//
// This routine stores the short data specified by Data to the aligned
// location specified by Address. The architecture requires word granularity,
// so locking is necessary.
//
// Arguments:
//
// Address(a0) - Supplies a pointer to an aligned short data value.
// Data(a1) - Supplied the short data value to store.
//
// Return Value:
//
// None
//
//--
LEAF_ENTRY(KiInterlockedStoreWord)
bic a0, 2, t0 // clear low short address bit
and a0, 2, t1 // mask of low short address bit
10: ldl_l t2, 0(t0) // load locked full longword
inswl a1, t1, t3 // insert word low
mskwl t2, t1, t2 // mask word low
bis t2, t3, t2 // merge data
stl_c t2, 0(t0) // store conditional
beq t2, 20f // failed to store, retry, forward
ret zero, (ra), 1 // return
20: br zero, 10b // try again
.end KiInterlockedStoreWord