2 * hal.dll implementation
4 * Copyright (C) 2007 Chris Wulff
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #define WIN32_NO_STATUS
29 #include "ddk/ntddk.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl
);
37 #ifdef __ASM_USE_FASTCALL_WRAPPER
39 extern void * WINAPI
wrap_fastcall_func1( void *func
, const void *a
);
40 __ASM_STDCALL_FUNC( wrap_fastcall_func1
, 8,
43 "xchgl (%esp),%ecx\n\t"
45 extern void * WINAPI
wrap_fastcall_func2( void *func
, const void *a
, const void *b
);
46 __ASM_STDCALL_FUNC( wrap_fastcall_func2
, 12,
50 "xchgl (%esp),%edx\n\t"
53 #define call_fastcall_func1(func,a) wrap_fastcall_func1(func,a)
54 #define call_fastcall_func2(func,a,b) wrap_fastcall_func2(func,a,b)
56 #else /* __ASM_USE_FASTCALL_WRAPPER */
58 #define call_fastcall_func1(func,a) func(a)
59 #define call_fastcall_func2(func,a,b) func(a,b)
61 #endif /* __ASM_USE_FASTCALL_WRAPPER */
63 DEFINE_FASTCALL1_WRAPPER( ExAcquireFastMutex
)
64 void FASTCALL
ExAcquireFastMutex( FAST_MUTEX
*mutex
)
66 call_fastcall_func1( ExAcquireFastMutexUnsafe
, mutex
);
69 DEFINE_FASTCALL1_WRAPPER( ExReleaseFastMutex
)
70 void FASTCALL
ExReleaseFastMutex( FAST_MUTEX
*mutex
)
72 call_fastcall_func1( ExReleaseFastMutexUnsafe
, mutex
);
75 DEFINE_FASTCALL1_WRAPPER( ExTryToAcquireFastMutex
)
76 BOOLEAN FASTCALL
ExTryToAcquireFastMutex( FAST_MUTEX
*mutex
)
78 TRACE("mutex %p.\n", mutex
);
80 return (InterlockedCompareExchange( &mutex
->Count
, 0, 1 ) == 1);
83 DEFINE_FASTCALL1_WRAPPER( KfAcquireSpinLock
)
84 KIRQL FASTCALL
KfAcquireSpinLock( KSPIN_LOCK
*lock
)
87 KeAcquireSpinLock( lock
, &irql
);
91 void WINAPI
KeAcquireSpinLock( KSPIN_LOCK
*lock
, KIRQL
*irql
)
93 TRACE("lock %p, irql %p.\n", lock
, irql
);
94 KeAcquireSpinLockAtDpcLevel( lock
);
98 DEFINE_FASTCALL_WRAPPER( KfReleaseSpinLock
, 8 )
99 void FASTCALL
KfReleaseSpinLock( KSPIN_LOCK
*lock
, KIRQL irql
)
101 KeReleaseSpinLock( lock
, irql
);
104 void WINAPI
KeReleaseSpinLock( KSPIN_LOCK
*lock
, KIRQL irql
)
106 TRACE("lock %p, irql %u.\n", lock
, irql
);
107 KeReleaseSpinLockFromDpcLevel( lock
);
110 DEFINE_FASTCALL_WRAPPER( KeAcquireInStackQueuedSpinLock
, 8 )
111 void FASTCALL
KeAcquireInStackQueuedSpinLock( KSPIN_LOCK
*lock
, KLOCK_QUEUE_HANDLE
*queue
)
113 call_fastcall_func2( KeAcquireInStackQueuedSpinLockAtDpcLevel
, lock
, queue
);
116 DEFINE_FASTCALL1_WRAPPER( KeReleaseInStackQueuedSpinLock
)
117 void FASTCALL
KeReleaseInStackQueuedSpinLock( KLOCK_QUEUE_HANDLE
*queue
)
119 call_fastcall_func1( KeReleaseInStackQueuedSpinLockFromDpcLevel
, queue
);
121 #endif /* __i386__ */
123 #if defined(__i386__) || defined(__arm__) || defined(__aarch64__)
125 DEFINE_FASTCALL1_WRAPPER( KfLowerIrql
)
126 VOID FASTCALL
KfLowerIrql(KIRQL NewIrql
)
128 FIXME( "(%u) stub!\n", NewIrql
);
131 DEFINE_FASTCALL1_WRAPPER( KfRaiseIrql
)
132 KIRQL FASTCALL
KfRaiseIrql(KIRQL NewIrql
)
134 FIXME( "(%u) stub!\n", NewIrql
);
139 KIRQL WINAPI
KeGetCurrentIrql(VOID
)
145 UCHAR WINAPI
READ_PORT_UCHAR(UCHAR
*port
)
147 FIXME("(%p) stub!\n", port
);
151 ULONG WINAPI
READ_PORT_ULONG(ULONG
*port
)
153 FIXME("(%p) stub!\n", port
);
157 void WINAPI
WRITE_PORT_UCHAR(UCHAR
*port
, UCHAR value
)
159 FIXME("(%p %d) stub!\n", port
, value
);
162 void WINAPI
WRITE_PORT_ULONG(ULONG
*port
, ULONG value
)
164 FIXME("(%p %ld) stub!\n", port
, value
);
166 #endif /* __i386__ || __arm__ || __arm64__ */
168 ULONG WINAPI
HalGetBusData(BUS_DATA_TYPE BusDataType
, ULONG BusNumber
, ULONG SlotNumber
, PVOID Buffer
, ULONG Length
)
170 FIXME("(%u %lu %lu %p %lu) stub!\n", BusDataType
, BusNumber
, SlotNumber
, Buffer
, Length
);
171 /* Claim that there is no such bus */
175 ULONG WINAPI
HalGetBusDataByOffset(BUS_DATA_TYPE BusDataType
, ULONG BusNumber
, ULONG SlotNumber
, PVOID Buffer
, ULONG Offset
, ULONG Length
)
177 FIXME("(%u %lu %lu %p %lu %lu) stub!\n", BusDataType
, BusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
178 /* Claim that there is no such bus */
182 BOOLEAN WINAPI
HalTranslateBusAddress(INTERFACE_TYPE InterfaceType
, ULONG BusNumber
, PHYSICAL_ADDRESS BusAddress
,
183 PULONG AddressSpace
, PPHYSICAL_ADDRESS TranslatedAddress
)
185 FIXME("(%d %ld %s %p %p) stub!\n", InterfaceType
, BusNumber
,
186 wine_dbgstr_longlong(BusAddress
.QuadPart
), AddressSpace
, TranslatedAddress
);
190 ULONGLONG WINAPI
KeQueryPerformanceCounter(LARGE_INTEGER
*frequency
)
192 LARGE_INTEGER counter
;
194 TRACE("(%p)\n", frequency
);
196 NtQueryPerformanceCounter(&counter
, frequency
);
197 return counter
.QuadPart
;