Migrate RTL subsystem to C++
This commit is contained in:
@@ -28,4 +28,37 @@ HlInitializeComPort(IN OUT PCPPORT Port,
|
||||
IN PUCHAR PortAddress,
|
||||
IN ULONG BaudRate);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
UCHAR
|
||||
HlReadRegister8(IN PVOID Register);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
USHORT
|
||||
HlReadRegister16(IN PVOID Register);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
HlReadRegister32(IN PVOID Register);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister8(IN PVOID Register,
|
||||
IN UCHAR Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister16(IN PVOID Register,
|
||||
IN USHORT Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister32(IN PVOID Register,
|
||||
IN ULONG Value);
|
||||
|
||||
#endif /* __XTDK_HLFUNCS_H */
|
||||
|
@@ -15,326 +15,363 @@
|
||||
#include <rtltypes.h>
|
||||
|
||||
|
||||
/* Routines used by XTLDR */
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTAPI
|
||||
UCHAR
|
||||
RtlReadRegisterByte(IN VOLATILE PVOID Register);
|
||||
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlReadRegisterLong(IN VOLATILE PVOID Register);
|
||||
|
||||
XTAPI
|
||||
USHORT
|
||||
RtlReadRegisterShort(IN VOLATILE PVOID Register);
|
||||
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlRemoveEntryList(IN PLIST_ENTRY Entry);
|
||||
|
||||
|
||||
/* Runtime Library routines forward references */
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearAllBits(IN PRTL_BITMAP BitMap);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlClearSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlCompareGuids(IN PGUID Guid1,
|
||||
IN PGUID Guid2);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareString(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareStringInsensitive(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareWideString(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareWideStringInsensitive(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlConcatenateString(OUT PCHAR Destination,
|
||||
IN PCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlConcatenateWideString(OUT PWCHAR Destination,
|
||||
IN PWCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlConvertToLargeInteger32(IN LONG Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlConvertToLargeIntegerUnsigned32(IN ULONG Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyString(IN PCHAR Destination,
|
||||
IN PCSTR Source,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyWideString(IN PWCHAR Destination,
|
||||
IN PCWSTR Source,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlDivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
IN ULONG Divisor,
|
||||
OUT PULONG Remainder);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlFindClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlFindSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCSTR
|
||||
RtlFindString(IN PCSTR Source,
|
||||
IN PCSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCSTR
|
||||
RtlFindStringInsensitive(IN PCSTR Source,
|
||||
IN PCSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCWSTR
|
||||
RtlFindWideString(IN PCWSTR Source,
|
||||
IN PCWSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCWSTR
|
||||
RtlFindWideStringInsensitive(IN PCWSTR Source,
|
||||
IN PCWSTR Search);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
XTSTATUS
|
||||
RtlFormatWideString(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PCWSTR Format,
|
||||
IN VA_LIST ArgumentList);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlInitializeBitMap(IN PRTL_BITMAP BitMap,
|
||||
IN PULONG_PTR Buffer,
|
||||
IN ULONG Size);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlListEmpty(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlListLoop(IN PLIST_ENTRY ListHead);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlMoveMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlMultiplyLargeInteger(IN LARGE_INTEGER Multiplicand,
|
||||
IN LONG Multiplier);
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlRemoveEntryList(IN PLIST_ENTRY Entry);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlReverseString(IN OUT PCHAR String,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlReverseWideString(IN OUT PWCHAR String,
|
||||
IN ULONG Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlSameMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetAllBits(IN PRTL_BITMAP BitMap);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlSetClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetMemory(OUT PVOID Destination,
|
||||
IN UCHAR Byte,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlStringLength(IN PCSTR String,
|
||||
IN SIZE_T MaxLength);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlStringToWideString(OUT PWCHAR Destination,
|
||||
IN PCSTR *Source,
|
||||
IN SIZE_T Length);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlTestBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTokenizeString(IN PCHAR String,
|
||||
IN PCSTR Delimiter,
|
||||
IN OUT PCHAR *SavePtr);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTokenizeWideString(IN PWCHAR String,
|
||||
IN PCWSTR Delimiter,
|
||||
IN OUT PWCHAR *SavePtr);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
CHAR
|
||||
RtlToLowerCharacter(IN CHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
WCHAR
|
||||
RtlToLowerWideCharacter(IN WCHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
CHAR
|
||||
RtlToUpperCharacter(IN CHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
WCHAR
|
||||
RtlToUpperWideCharacter(IN WCHAR Character);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimLeftString(IN PCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTrimLeftWideString(IN PWCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimRightString(IN PCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTrimRightWideString(IN PWCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimString(IN PCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
PWCHAR
|
||||
RtlTrimWideString(IN PWCHAR String);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlWideStringLength(IN PCWSTR String,
|
||||
IN SIZE_T MaxLength);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterByte(IN VOLATILE PVOID Register,
|
||||
IN UCHAR Value);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterLong(IN VOLATILE PVOID Register,
|
||||
IN ULONG Value);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterShort(IN VOLATILE PVOID Register,
|
||||
IN USHORT Value);
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
RtlZeroMemory(OUT PVOID Destination,
|
||||
|
@@ -56,17 +56,17 @@ typedef XTSTATUS (*PWRITE_WIDE_CHARACTER)(IN WCHAR Character);
|
||||
/* Variable types enumeration list */
|
||||
typedef enum _RTL_VARIABLE_TYPE
|
||||
{
|
||||
Unknown,
|
||||
AnsiString,
|
||||
Boolean,
|
||||
Char,
|
||||
Float,
|
||||
Guid,
|
||||
Integer,
|
||||
String,
|
||||
UnicodeString,
|
||||
WideChar,
|
||||
WideString
|
||||
TypeUnknown,
|
||||
TypeAnsiString,
|
||||
TypeBoolean,
|
||||
TypeChar,
|
||||
TypeFloat,
|
||||
TypeGuid,
|
||||
TypeInteger,
|
||||
TypeString,
|
||||
TypeUnicodeString,
|
||||
TypeWideChar,
|
||||
TypeWideString
|
||||
} RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
||||
|
||||
/* Bit Map structure definition */
|
||||
|
@@ -33,9 +33,11 @@ list(APPEND XTOSKRNL_SOURCE
|
||||
${XTOSKRNL_SOURCE_DIR}/ex/rundown.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/acpi.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/cport.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/exports.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/fbdev.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/globals.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/init.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/ioreg.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/cpu.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/pic.c
|
||||
${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/ioport.c
|
||||
@@ -73,19 +75,19 @@ list(APPEND XTOSKRNL_SOURCE
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/pages.c
|
||||
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/pmap.c
|
||||
${XTOSKRNL_SOURCE_DIR}/po/idle.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/atomic.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/bitmap.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/byteswap.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/globals.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/guid.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/ioreg.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/math.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/memory.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/plist.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/string.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/widestr.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/dispatch.c
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/exsup.c)
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/dispatch.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/exsup.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/atomic.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/bitmap.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/data.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/endian.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/exports.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/guid.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/llist.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/math.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/memory.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/string.cc
|
||||
${XTOSKRNL_SOURCE_DIR}/rtl/widestr.cc)
|
||||
|
||||
# Set module definition SPEC file
|
||||
set_specfile(xtoskrnl.spec xtoskrnl.exe)
|
||||
|
130
xtoskrnl/hl/exports.cc
Normal file
130
xtoskrnl/hl/exports.cc
Normal file
@@ -0,0 +1,130 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/hl/exports.cc
|
||||
* DESCRIPTION: C-compatible API wrappers for exported kernel functions
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Reads an 8-bit data from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns a value at the specified register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
UCHAR
|
||||
HlReadRegister8(IN PVOID Register)
|
||||
{
|
||||
return HL::IoRegister::ReadRegister8(Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a 16-bit data from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns a value at the specified register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
USHORT
|
||||
HlReadRegister16(IN PVOID Register)
|
||||
{
|
||||
return HL::IoRegister::ReadRegister16(Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a 32-bit data from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns a value at the specified register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
ULONG
|
||||
HlReadRegister32(IN PVOID Register)
|
||||
{
|
||||
return HL::IoRegister::ReadRegister32(Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an 8-bit value into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister8(IN PVOID Register,
|
||||
IN UCHAR Value)
|
||||
{
|
||||
HL::IoRegister::WriteRegister8(Register, Value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a 16-bit value into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister16(IN PVOID Register,
|
||||
IN USHORT Value)
|
||||
{
|
||||
HL::IoRegister::WriteRegister16(Register, Value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a 32-bit value into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTCLINK
|
||||
XTAPI
|
||||
VOID
|
||||
HlWriteRegister32(IN PVOID Register,
|
||||
IN ULONG Value)
|
||||
{
|
||||
HL::IoRegister::WriteRegister32(Register, Value);
|
||||
}
|
@@ -1,73 +1,73 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/ioreg.c
|
||||
* DESCRIPTION: I/O registers related routines
|
||||
* FILE: xtoskrnl/hl/ioreg.cc
|
||||
* DESCRIPTION: Basic I/O registers access functionality
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Reads a byte from a specified register address.
|
||||
* Reads an 8-bit data from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns UCHAR byte read from the register.
|
||||
* @return This routine returns a value at the specified register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
UCHAR
|
||||
RtlReadRegisterByte(IN VOLATILE PVOID Register)
|
||||
HL::IoRegister::ReadRegister8(IN PVOID Register)
|
||||
{
|
||||
return *((VOLATILE PUCHAR)Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a byte from a specified register address.
|
||||
* Reads a 16-bit data from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns ULONG byte read from the register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlReadRegisterLong(IN VOLATILE PVOID Register)
|
||||
{
|
||||
return *((VOLATILE PULONG)Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a byte from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns USHORT byte read from the register.
|
||||
* @return This routine returns a value at the specified register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
USHORT
|
||||
RtlReadRegisterShort(IN VOLATILE PVOID Register)
|
||||
HL::IoRegister::ReadRegister16(IN PVOID Register)
|
||||
{
|
||||
return *((VOLATILE PUSHORT)Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a byte into a specified register address.
|
||||
* Reads a 32-bit data from a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address holding data to read.
|
||||
*
|
||||
* @return This routine returns a value at the specified register.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
HL::IoRegister::ReadRegister32(IN PVOID Register)
|
||||
{
|
||||
return *((VOLATILE PULONG)Register);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an 8-bit value into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new UCHAR value that will be stored into a register.
|
||||
* Supplies a new value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
@@ -75,20 +75,20 @@ RtlReadRegisterShort(IN VOLATILE PVOID Register)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterByte(IN VOLATILE PVOID Register,
|
||||
HL::IoRegister::WriteRegister8(IN PVOID Register,
|
||||
IN UCHAR Value)
|
||||
{
|
||||
*((VOLATILE PUCHAR)Register) = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a byte into a specified register address.
|
||||
* Writes a 16-bit value into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new ULONG value that will be stored into a register.
|
||||
* Supplies a new value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
@@ -96,29 +96,29 @@ RtlWriteRegisterByte(IN VOLATILE PVOID Register,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterLong(IN VOLATILE PVOID Register,
|
||||
IN ULONG Value)
|
||||
{
|
||||
*((VOLATILE PULONG)Register) = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a byte into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new USHORT value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlWriteRegisterShort(IN VOLATILE PVOID Register,
|
||||
HL::IoRegister::WriteRegister16(IN PVOID Register,
|
||||
IN USHORT Value)
|
||||
{
|
||||
*((VOLATILE PUSHORT)Register) = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a 32-bit value into a specified register address.
|
||||
*
|
||||
* @param Register
|
||||
* Supplies a pointer to register address where data will be written.
|
||||
*
|
||||
* @param Value
|
||||
* Supplies a new value that will be stored into a register.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
HL::IoRegister::WriteRegister32(IN PVOID Register,
|
||||
IN ULONG Value)
|
||||
{
|
||||
*((VOLATILE PULONG)Register) = Value;
|
||||
}
|
@@ -2,7 +2,7 @@
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ar.hh
|
||||
* DESCRIPTION:
|
||||
* DESCRIPTION: Architecture Library
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/ex.hh
|
||||
* DESCRIPTION:
|
||||
* DESCRIPTION: Kernel Executive
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
|
25
xtoskrnl/includes/rtl.hh
Normal file
25
xtoskrnl/includes/rtl.hh
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl.hh
|
||||
* DESCRIPTION: Runtime Library
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_HH
|
||||
#define __XTOSKRNL_RTL_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
#include <rtl/atomic.hh>
|
||||
#include <rtl/bitmap.hh>
|
||||
#include <rtl/dispatch.hh>
|
||||
#include <rtl/endian.hh>
|
||||
#include <rtl/guid.hh>
|
||||
#include <rtl/llist.hh>
|
||||
#include <rtl/math.hh>
|
||||
#include <rtl/memory.hh>
|
||||
#include <rtl/string.hh>
|
||||
#include <rtl/widestr.hh>
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_HH */
|
97
xtoskrnl/includes/rtl/atomic.hh
Normal file
97
xtoskrnl/includes/rtl/atomic.hh
Normal file
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/atomic.hh
|
||||
* DESCRIPTION: Atomic operations support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_ATOMIC_HH
|
||||
#define __XTOSKRNL_RTL_ATOMIC_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Atomic
|
||||
{
|
||||
public:
|
||||
STATIC XTFASTCALL CHAR And8(IN PCHAR Address,
|
||||
IN CHAR Mask);
|
||||
STATIC XTFASTCALL SHORT And16(IN PSHORT Address,
|
||||
IN SHORT Mask);
|
||||
STATIC XTFASTCALL LONG And32(IN PLONG Address,
|
||||
IN LONG Mask);
|
||||
STATIC XTFASTCALL LONG_PTR And64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask);
|
||||
STATIC XTFASTCALL UCHAR BitTestAndSet(IN PLONG Base,
|
||||
IN LONG Offset);
|
||||
STATIC XTFASTCALL UCHAR BitTestAndSet64(IN PLONGLONG Base,
|
||||
IN LONGLONG Offset);
|
||||
STATIC XTFASTCALL CHAR CompareExchange8(IN PCHAR Address,
|
||||
IN CHAR Comperand,
|
||||
IN CHAR Exchange);
|
||||
STATIC XTFASTCALL SHORT CompareExchange16(IN PSHORT Address,
|
||||
IN SHORT Comperand,
|
||||
IN SHORT Exchange);
|
||||
STATIC XTFASTCALL LONG CompareExchange32(IN PLONG Address,
|
||||
IN LONG Comperand,
|
||||
IN LONG Exchange);
|
||||
STATIC XTFASTCALL LONG_PTR CompareExchange64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Comperand,
|
||||
IN LONG_PTR Exchange);
|
||||
STATIC XTFASTCALL PVOID CompareExchangePointer(IN PVOID *Address,
|
||||
IN PVOID Comperand,
|
||||
IN PVOID Exchange);
|
||||
STATIC XTFASTCALL CHAR Decrement8(IN PCHAR Address);
|
||||
STATIC XTFASTCALL SHORT Decrement16(IN PSHORT Address);
|
||||
STATIC XTFASTCALL LONG Decrement32(IN PLONG Address);
|
||||
STATIC XTFASTCALL LONG_PTR Decrement64(IN PLONG_PTR Address);
|
||||
STATIC XTFASTCALL CHAR Exchange8(IN PCHAR Address,
|
||||
IN CHAR Exchange);
|
||||
STATIC XTFASTCALL SHORT Exchange16(IN PSHORT Address,
|
||||
IN SHORT Exchange);
|
||||
STATIC XTFASTCALL LONG Exchange32(IN PLONG Address,
|
||||
IN LONG Exchange);
|
||||
STATIC XTFASTCALL LONG_PTR Exchange64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Exchange);
|
||||
STATIC XTFASTCALL CHAR ExchangeAdd8(IN PCHAR Address,
|
||||
IN CHAR Value);
|
||||
STATIC XTFASTCALL SHORT ExchangeAdd16(IN PSHORT Address,
|
||||
IN SHORT Value);
|
||||
STATIC XTFASTCALL LONG ExchangeAdd32(IN PLONG Address,
|
||||
IN LONG Value);
|
||||
STATIC XTFASTCALL LONG_PTR ExchangeAdd64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Value);
|
||||
STATIC XTFASTCALL PVOID ExchangePointer(IN PVOID *Address,
|
||||
IN PVOID Exchange);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY FlushSingleList(IN PSINGLE_LIST_HEADER Header);
|
||||
STATIC XTFASTCALL CHAR Increment8(IN PCHAR Address);
|
||||
STATIC XTFASTCALL SHORT Increment16(IN PSHORT Address);
|
||||
STATIC XTFASTCALL LONG Increment32(IN PLONG Address);
|
||||
STATIC XTFASTCALL LONG_PTR Increment64(IN PLONG_PTR Address);
|
||||
STATIC XTFASTCALL CHAR Or8(IN PCHAR Address,
|
||||
IN CHAR Mask);
|
||||
STATIC XTFASTCALL SHORT Or16(IN PSHORT Address,
|
||||
IN SHORT Mask);
|
||||
STATIC XTFASTCALL LONG Or32(IN PLONG Address,
|
||||
IN LONG Mask);
|
||||
STATIC XTFASTCALL LONG_PTR Or64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask);
|
||||
STATIC XTFASTCALL XTFASTCALL PSINGLE_LIST_ENTRY PopEntrySingleList(IN PSINGLE_LIST_HEADER Header);
|
||||
STATIC XTFASTCALL PSINGLE_LIST_ENTRY PushEntrySingleList(IN PSINGLE_LIST_HEADER Header,
|
||||
IN PSINGLE_LIST_ENTRY Entry);
|
||||
STATIC XTFASTCALL CHAR Xor8(IN PCHAR Address,
|
||||
IN CHAR Mask);
|
||||
STATIC XTFASTCALL SHORT Xor16(IN PSHORT Address,
|
||||
IN SHORT Mask);
|
||||
STATIC XTFASTCALL LONG Xor32(IN PLONG Address,
|
||||
IN LONG Mask);
|
||||
STATIC XTFASTCALL LONG_PTR Xor64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_ATOMIC_HH */
|
64
xtoskrnl/includes/rtl/bitmap.hh
Normal file
64
xtoskrnl/includes/rtl/bitmap.hh
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/bitmap.hh
|
||||
* DESCRIPTION: Bit maps support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_BITMAP_HH
|
||||
#define __XTOSKRNL_RTL_BITMAP_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class BitMap
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID ClearAllBits(IN PRTL_BITMAP BitMap);
|
||||
STATIC XTAPI VOID ClearBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
STATIC XTAPI VOID ClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length);
|
||||
STATIC XTAPI ULONG ClearSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
STATIC XTAPI VOID DumpBitMap(IN PRTL_BITMAP BitMap);
|
||||
STATIC XTAPI ULONG_PTR FindClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
STATIC XTAPI ULONG_PTR FindSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
STATIC XTAPI VOID InitializeBitMap(IN PRTL_BITMAP BitMap,
|
||||
IN PULONG_PTR Buffer,
|
||||
IN ULONG Size);
|
||||
STATIC XTAPI VOID SetAllBits(IN PRTL_BITMAP BitMap);
|
||||
STATIC XTAPI VOID SetBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
STATIC XTAPI VOID SetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length);
|
||||
STATIC XTAPI ULONG SetClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index);
|
||||
STATIC XTAPI BOOLEAN TestBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit);
|
||||
|
||||
private:
|
||||
STATIC XTAPI ULONG_PTR CountBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN BOOLEAN SetBits);
|
||||
STATIC XTAPI ULONG_PTR FindBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN BOOLEAN SetBits);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_BITMAP_HH */
|
26
xtoskrnl/includes/rtl/dispatch.hh
Normal file
26
xtoskrnl/includes/rtl/dispatch.hh
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/dispatch.hh
|
||||
* DESCRIPTION: Dispatching support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_DISPATCH_HH
|
||||
#define __XTOSKRNL_RTL_DISPATCH_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Dispatcher
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI VOID GetStackLimits(OUT PULONG_PTR StackBase,
|
||||
OUT PULONG_PTR StackLimit);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_DISPATCH_HH */
|
27
xtoskrnl/includes/rtl/endian.hh
Normal file
27
xtoskrnl/includes/rtl/endian.hh
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/endian.hh
|
||||
* DESCRIPTION: Endian conversion routines
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_ENDIAN_HH
|
||||
#define __XTOSKRNL_RTL_ENDIAN_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Endianness
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI USHORT SwapByte16(IN USHORT Source);
|
||||
STATIC XTAPI ULONG SwapByte32(IN ULONG Source);
|
||||
STATIC XTAPI ULONGLONG SwapByte64(IN ULONGLONG Source);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_ENDIAN_HH */
|
26
xtoskrnl/includes/rtl/guid.hh
Normal file
26
xtoskrnl/includes/rtl/guid.hh
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/gui.hh
|
||||
* DESCRIPTION: Endian conversion routines
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_GUID_HH
|
||||
#define __XTOSKRNL_RTL_GUID_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Guid
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI BOOLEAN CompareGuids(IN PGUID Guid1,
|
||||
IN PGUID Guid2);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_GUID_HH */
|
33
xtoskrnl/includes/rtl/llist.hh
Normal file
33
xtoskrnl/includes/rtl/llist.hh
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/llist.hh
|
||||
* DESCRIPTION: Linked list manipulation routines
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_LLIST_HH
|
||||
#define __XTOSKRNL_RTL_LLIST_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class LinkedList
|
||||
{
|
||||
public:
|
||||
STATIC XTCDECL VOID InitializeListHead(IN PLIST_ENTRY ListHead);
|
||||
STATIC XTCDECL VOID InitializeListHead32(IN PLIST_ENTRY32 ListHead);
|
||||
STATIC XTCDECL VOID InsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
STATIC XTCDECL VOID InsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry);
|
||||
STATIC XTCDECL BOOLEAN ListEmpty(IN PLIST_ENTRY ListHead);
|
||||
STATIC XTCDECL BOOLEAN ListLoop(IN PLIST_ENTRY ListHead);
|
||||
STATIC XTCDECL VOID RemoveEntryList(IN PLIST_ENTRY Entry);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_LLIST_HH */
|
51
xtoskrnl/includes/rtl/math.hh
Normal file
51
xtoskrnl/includes/rtl/math.hh
Normal file
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/math.hh
|
||||
* DESCRIPTION: Kernel math support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_MATH_HH
|
||||
#define __XTOSKRNL_RTL_MATH_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Math
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI LARGE_INTEGER ConvertToLargeInteger32(IN LONG Value);
|
||||
STATIC XTAPI LARGE_INTEGER ConvertToLargeIntegerUnsigned32(IN ULONG Value);
|
||||
STATIC XTAPI INT CountLeadingZeroes32(IN ULONG Value);
|
||||
STATIC XTAPI INT CountLeadingZeroes64(IN ULONGLONG Value);
|
||||
STATIC XTAPI INT CountTrailingZeroes32(IN ULONG Value);
|
||||
STATIC XTAPI INT CountTrailingZeroes64(IN ULONGLONG Value);
|
||||
STATIC XTAPI LONGLONG Divide32(IN LONG Dividend,
|
||||
IN LONG Divisor,
|
||||
OUT PLONG Remainder);
|
||||
STATIC XTAPI LONGLONG Divide64(IN LONGLONG Dividend,
|
||||
IN LONGLONG Divisor,
|
||||
OUT PLONGLONG Remainder);
|
||||
STATIC XTAPI ULONGLONG DivideUnsigned32(IN ULONG Dividend,
|
||||
IN ULONG Divisor,
|
||||
OUT PULONG Remainder);
|
||||
STATIC XTAPI ULONGLONG DivideUnsigned64(IN ULONGLONG Dividend,
|
||||
IN ULONGLONG Divisor,
|
||||
OUT PULONGLONG Remainder);
|
||||
STATIC XTAPI LARGE_INTEGER DivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
IN ULONG Divisor,
|
||||
OUT PULONG Remainder);
|
||||
STATIC XTAPI LONG GetBaseExponent(IN DOUBLE Value,
|
||||
OUT PDOUBLE PowerOfTen);
|
||||
STATIC XTAPI BOOLEAN InfiniteDouble(IN DOUBLE Value);
|
||||
STATIC XTAPI LARGE_INTEGER MultiplyLargeInteger(IN LARGE_INTEGER Multiplicand,
|
||||
IN LONG Multiplier);
|
||||
STATIC XTAPI BOOLEAN NanDouble(IN DOUBLE Value);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_MATH_HH */
|
41
xtoskrnl/includes/rtl/memory.hh
Normal file
41
xtoskrnl/includes/rtl/memory.hh
Normal file
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/memory.hh
|
||||
* DESCRIPTION: Memory related routines
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_MEMORY_HH
|
||||
#define __XTOSKRNL_RTL_MEMORY_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class Memory
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI SIZE_T CompareMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID CopyMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID MoveMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI BOOLEAN SameMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID SetMemory(OUT PVOID Destination,
|
||||
IN UCHAR Byte,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI VOID ZeroMemory(OUT PVOID Destination,
|
||||
IN SIZE_T Length);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_MEMORY_HH */
|
55
xtoskrnl/includes/rtl/string.hh
Normal file
55
xtoskrnl/includes/rtl/string.hh
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/string.hh
|
||||
* DESCRIPTION: String support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_STRING_HH
|
||||
#define __XTOSKRNL_RTL_STRING_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class String
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI SIZE_T CompareString(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI SIZE_T CompareStringInsensitive(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI PCHAR ConcatenateString(OUT PCHAR Destination,
|
||||
IN PCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
STATIC XTAPI VOID CopyString(IN PCHAR Destination,
|
||||
IN PCSTR Source,
|
||||
IN ULONG Length);
|
||||
STATIC XTAPI PCSTR FindString(IN PCSTR Source,
|
||||
IN PCSTR Search);
|
||||
STATIC XTAPI PCSTR FindStringInsensitive(IN PCSTR Source,
|
||||
IN PCSTR Search);
|
||||
STATIC XTAPI VOID ReverseString(IN OUT PCHAR String,
|
||||
IN ULONG Length);
|
||||
STATIC XTAPI SIZE_T StringLength(IN PCSTR String,
|
||||
IN SIZE_T MaxLength);
|
||||
STATIC XTAPI SIZE_T StringToWideString(OUT PWCHAR Destination,
|
||||
IN PCSTR *Source,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI PCHAR TokenizeString(IN PCHAR String,
|
||||
IN PCSTR Delimiter,
|
||||
IN OUT PCHAR *SavePtr);
|
||||
STATIC XTAPI CHAR ToLowerCharacter(IN CHAR Character);
|
||||
STATIC XTAPI CHAR ToUpperCharacter(IN CHAR Character);
|
||||
STATIC XTAPI PCHAR TrimLeftString(IN PCHAR String);
|
||||
STATIC XTAPI PCHAR TrimRightString(IN PCHAR String);
|
||||
STATIC XTAPI PCHAR TrimString(IN PCHAR String);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_STRING_HH */
|
87
xtoskrnl/includes/rtl/widestr.hh
Normal file
87
xtoskrnl/includes/rtl/widestr.hh
Normal file
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/rtl/widestr.hh
|
||||
* DESCRIPTION: Wide string support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_RTL_WIDESTR_HH
|
||||
#define __XTOSKRNL_RTL_WIDESTR_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Runtime Library */
|
||||
namespace RTL
|
||||
{
|
||||
class WideString
|
||||
{
|
||||
public:
|
||||
STATIC XTAPI SIZE_T CompareWideString(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI SIZE_T CompareWideStringInsensitive(IN PCWSTR String1,
|
||||
IN PCWSTR String2,
|
||||
IN SIZE_T Length);
|
||||
STATIC XTAPI PWCHAR ConcatenateWideString(OUT PWCHAR Destination,
|
||||
IN PWCHAR Source,
|
||||
IN SIZE_T Count);
|
||||
STATIC XTAPI VOID CopyWideString(IN PWCHAR Destination,
|
||||
IN PCWSTR Source,
|
||||
IN ULONG Length);
|
||||
STATIC XTAPI PCWSTR FindWideString(IN PCWSTR Source,
|
||||
IN PCWSTR Search);
|
||||
STATIC XTAPI PCWSTR FindWideStringInsensitive(IN PCWSTR Source,
|
||||
IN PCWSTR Search);
|
||||
STATIC XTAPI XTSTATUS FormatWideString(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PCWSTR Format,
|
||||
IN VA_LIST ArgumentList);
|
||||
STATIC XTAPI VOID ReverseWideString(IN OUT PWCHAR String,
|
||||
IN ULONG Length);
|
||||
STATIC XTAPI PWCHAR TokenizeWideString(IN PWCHAR String,
|
||||
IN PCWSTR Delimiter,
|
||||
IN OUT PWCHAR *SavePtr);
|
||||
STATIC XTAPI WCHAR ToLowerWideCharacter(IN WCHAR Character);
|
||||
STATIC XTAPI WCHAR ToUpperWideCharacter(IN WCHAR Character);
|
||||
STATIC XTAPI PWCHAR TrimLeftWideString(IN PWCHAR String);
|
||||
STATIC XTAPI PWCHAR TrimRightWideString(IN PWCHAR String);
|
||||
STATIC XTAPI PWCHAR TrimWideString(IN PWCHAR String);
|
||||
STATIC XTAPI SIZE_T WideStringLength(IN PCWSTR String,
|
||||
IN SIZE_T MaxLength);
|
||||
|
||||
private:
|
||||
STATIC XTAPI XTSTATUS FormatArgumentSpecifier(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PCWSTR Format,
|
||||
IN PVA_LIST ArgumentList,
|
||||
IN OUT PULONG Index);
|
||||
STATIC XTAPI ULONGLONG GetArgument(IN PVA_LIST ArgumentList,
|
||||
IN ULONG ArgumentNumber,
|
||||
IN LONG ArgumentSize);
|
||||
STATIC XTAPI ULONGLONG GetSpecifierValue(IN PWCHAR *Format);
|
||||
STATIC XTAPI XTSTATUS WriteWideCharacter(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN WCHAR Character);
|
||||
STATIC XTCDECL XTSTATUS WriteCustomValue(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PCWSTR Format,
|
||||
IN ...);
|
||||
STATIC XTAPI XTSTATUS WriteDoubleValue(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PRTL_PRINT_FORMAT_PROPERTIES FormatProperties,
|
||||
IN DOUBLE Value);
|
||||
STATIC XTAPI XTSTATUS WriteHexDoubleValue(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PRTL_PRINT_FORMAT_PROPERTIES FormatProperties,
|
||||
IN DOUBLE Double);
|
||||
STATIC XTAPI XTSTATUS WriteIntegerValue(IN PRTL_PRINT_CONTEXT Context,
|
||||
IN PRTL_PRINT_FORMAT_PROPERTIES FormatProperties,
|
||||
IN ULONGLONG Integer);
|
||||
STATIC XTAPI XTSTATUS WriteStringValue(PRTL_PRINT_CONTEXT Context,
|
||||
PRTL_PRINT_FORMAT_PROPERTIES FormatProperties,
|
||||
PCSTR String,
|
||||
SIZE_T StringLength);
|
||||
STATIC XTAPI XTSTATUS WriteValue(PRTL_PRINT_CONTEXT Context,
|
||||
PRTL_PRINT_FORMAT_PROPERTIES FormatProperties,
|
||||
PCWSTR String,
|
||||
SIZE_T StringLength);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_RTL_WIDESTR_HH */
|
@@ -28,4 +28,6 @@ extern "C" {
|
||||
|
||||
#include <ar.hh>
|
||||
#include <ex.hh>
|
||||
#include <hl.hh>
|
||||
#include <ke.hh>
|
||||
#include <rtl.hh>
|
||||
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/amd64/dispatch.c
|
||||
* FILE: xtoskrnl/rtl/amd64/dispatch.cc
|
||||
* DESCRIPTION: Dispatching support for AMD64 architecture
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -24,7 +24,7 @@
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlGetStackLimits(OUT PULONG_PTR StackBase,
|
||||
RTL::Dispatcher::GetStackLimits(OUT PULONG_PTR StackBase,
|
||||
OUT PULONG_PTR StackLimit)
|
||||
{
|
||||
PKTHREAD Thread = KeGetCurrentThread();
|
@@ -1,14 +1,15 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/amd64/exsup.c
|
||||
* FILE: xtoskrnl/rtl/amd64/exsup.cc
|
||||
* DESCRIPTION: Exception handling for AMD64 architecture
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
XTCLINK
|
||||
XTAPI
|
||||
EXCEPTION_DISPOSITION
|
||||
__C_specific_handler(IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
@@ -22,6 +23,7 @@ __C_specific_handler(IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
return ExceptionContinueExecution;
|
||||
}
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
INT
|
||||
_except_handler3(PEXCEPTION_RECORD ExceptionRecord,
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/atomic.c
|
||||
* FILE: xtoskrnl/rtl/atomic.cc
|
||||
* DESCRIPTION: Atomic operations support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -24,7 +24,7 @@
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicAnd8(IN VOLATILE PCHAR Address,
|
||||
RTL::Atomic::And8(IN PCHAR Address,
|
||||
IN CHAR Mask)
|
||||
{
|
||||
return __sync_fetch_and_and(Address, Mask);
|
||||
@@ -45,7 +45,7 @@ RtlAtomicAnd8(IN VOLATILE PCHAR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicAnd16(IN VOLATILE PSHORT Address,
|
||||
RTL::Atomic::And16(IN PSHORT Address,
|
||||
IN SHORT Mask)
|
||||
{
|
||||
return __sync_fetch_and_and(Address, Mask);
|
||||
@@ -66,7 +66,7 @@ RtlAtomicAnd16(IN VOLATILE PSHORT Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicAnd32(IN VOLATILE PLONG Address,
|
||||
RTL::Atomic::And32(IN PLONG Address,
|
||||
IN LONG Mask)
|
||||
{
|
||||
return __sync_fetch_and_and(Address, Mask);
|
||||
@@ -87,7 +87,7 @@ RtlAtomicAnd32(IN VOLATILE PLONG Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicAnd64(IN VOLATILE PLONG_PTR Address,
|
||||
RTL::Atomic::And64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask)
|
||||
{
|
||||
return __sync_fetch_and_and(Address, Mask);
|
||||
@@ -108,7 +108,7 @@ RtlAtomicAnd64(IN VOLATILE PLONG_PTR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
UCHAR
|
||||
RtlAtomicBitTestAndSet(IN VOLATILE PLONG Base,
|
||||
RTL::Atomic::BitTestAndSet(IN PLONG Base,
|
||||
IN LONG Offset)
|
||||
{
|
||||
return (__atomic_fetch_or(Base, 1l << Offset, __ATOMIC_SEQ_CST) >> Offset) & 1;
|
||||
@@ -129,7 +129,7 @@ RtlAtomicBitTestAndSet(IN VOLATILE PLONG Base,
|
||||
*/
|
||||
XTFASTCALL
|
||||
UCHAR
|
||||
RtlAtomicBitTestAndSet64(IN VOLATILE PLONGLONG Base,
|
||||
RTL::Atomic::BitTestAndSet64(IN PLONGLONG Base,
|
||||
IN LONGLONG Offset)
|
||||
{
|
||||
return (__atomic_fetch_or(Base, 1ll << Offset, __ATOMIC_SEQ_CST) >> Offset) & 1;
|
||||
@@ -153,7 +153,7 @@ RtlAtomicBitTestAndSet64(IN VOLATILE PLONGLONG Base,
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicCompareExchange8(IN VOLATILE PCHAR Address,
|
||||
RTL::Atomic::CompareExchange8(IN PCHAR Address,
|
||||
IN CHAR Comperand,
|
||||
IN CHAR Exchange)
|
||||
{
|
||||
@@ -178,7 +178,7 @@ RtlAtomicCompareExchange8(IN VOLATILE PCHAR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicCompareExchange16(IN VOLATILE PSHORT Address,
|
||||
RTL::Atomic::CompareExchange16(IN PSHORT Address,
|
||||
IN SHORT Comperand,
|
||||
IN SHORT Exchange)
|
||||
{
|
||||
@@ -203,7 +203,7 @@ RtlAtomicCompareExchange16(IN VOLATILE PSHORT Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicCompareExchange32(IN VOLATILE PLONG Address,
|
||||
RTL::Atomic::CompareExchange32(IN PLONG Address,
|
||||
IN LONG Comperand,
|
||||
IN LONG Exchange)
|
||||
{
|
||||
@@ -228,7 +228,7 @@ RtlAtomicCompareExchange32(IN VOLATILE PLONG Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicCompareExchange64(IN VOLATILE PLONG_PTR Address,
|
||||
RTL::Atomic::CompareExchange64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Comperand,
|
||||
IN LONG_PTR Exchange)
|
||||
{
|
||||
@@ -253,7 +253,7 @@ RtlAtomicCompareExchange64(IN VOLATILE PLONG_PTR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
PVOID
|
||||
RtlAtomicCompareExchangePointer(IN VOLATILE PVOID *Address,
|
||||
RTL::Atomic::CompareExchangePointer(IN PVOID *Address,
|
||||
IN PVOID Comperand,
|
||||
IN PVOID Exchange)
|
||||
{
|
||||
@@ -272,7 +272,7 @@ RtlAtomicCompareExchangePointer(IN VOLATILE PVOID *Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicDecrement8(IN VOLATILE PCHAR Address)
|
||||
RTL::Atomic::Decrement8(IN PCHAR Address)
|
||||
{
|
||||
return __sync_sub_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -289,7 +289,7 @@ RtlAtomicDecrement8(IN VOLATILE PCHAR Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicDecrement16(IN VOLATILE PSHORT Address)
|
||||
RTL::Atomic::Decrement16(IN PSHORT Address)
|
||||
{
|
||||
return __sync_sub_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -306,7 +306,7 @@ RtlAtomicDecrement16(IN VOLATILE PSHORT Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicDecrement32(IN VOLATILE PLONG Address)
|
||||
RTL::Atomic::Decrement32(IN PLONG Address)
|
||||
{
|
||||
return __sync_sub_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -323,7 +323,7 @@ RtlAtomicDecrement32(IN VOLATILE PLONG Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicDecrement64(IN VOLATILE PLONG_PTR Address)
|
||||
RTL::Atomic::Decrement64(IN PLONG_PTR Address)
|
||||
{
|
||||
return __sync_sub_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -343,7 +343,7 @@ RtlAtomicDecrement64(IN VOLATILE PLONG_PTR Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicExchange8(IN VOLATILE PCHAR Address,
|
||||
RTL::Atomic::Exchange8(IN PCHAR Address,
|
||||
IN CHAR Exchange)
|
||||
{
|
||||
return __sync_lock_test_and_set(Address, Exchange);
|
||||
@@ -364,7 +364,7 @@ RtlAtomicExchange8(IN VOLATILE PCHAR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicExchange16(IN VOLATILE PSHORT Address,
|
||||
RTL::Atomic::Exchange16(IN PSHORT Address,
|
||||
IN SHORT Exchange)
|
||||
{
|
||||
return __sync_lock_test_and_set(Address, Exchange);
|
||||
@@ -385,7 +385,7 @@ RtlAtomicExchange16(IN VOLATILE PSHORT Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicExchange32(IN VOLATILE PLONG Address,
|
||||
RTL::Atomic::Exchange32(IN PLONG Address,
|
||||
IN LONG Exchange)
|
||||
{
|
||||
return __sync_lock_test_and_set(Address, Exchange);
|
||||
@@ -406,7 +406,7 @@ RtlAtomicExchange32(IN VOLATILE PLONG Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicExchange64(IN VOLATILE PLONG_PTR Address,
|
||||
RTL::Atomic::Exchange64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Exchange)
|
||||
{
|
||||
return __sync_lock_test_and_set(Address, Exchange);
|
||||
@@ -427,7 +427,7 @@ RtlAtomicExchange64(IN VOLATILE PLONG_PTR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicExchangeAdd8(IN VOLATILE PCHAR Address,
|
||||
RTL::Atomic::ExchangeAdd8(IN PCHAR Address,
|
||||
IN CHAR Value)
|
||||
{
|
||||
return __sync_fetch_and_add(Address, Value);
|
||||
@@ -448,7 +448,7 @@ RtlAtomicExchangeAdd8(IN VOLATILE PCHAR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicExchangeAdd16(IN VOLATILE PSHORT Address,
|
||||
RTL::Atomic::ExchangeAdd16(IN PSHORT Address,
|
||||
IN SHORT Value)
|
||||
{
|
||||
return __sync_fetch_and_add(Address, Value);
|
||||
@@ -469,7 +469,7 @@ RtlAtomicExchangeAdd16(IN VOLATILE PSHORT Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicExchangeAdd32(IN VOLATILE PLONG Address,
|
||||
RTL::Atomic::ExchangeAdd32(IN PLONG Address,
|
||||
IN LONG Value)
|
||||
{
|
||||
return __sync_fetch_and_add(Address, Value);
|
||||
@@ -490,7 +490,7 @@ RtlAtomicExchangeAdd32(IN VOLATILE PLONG Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicExchangeAdd64(IN VOLATILE PLONG_PTR Address,
|
||||
RTL::Atomic::ExchangeAdd64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Value)
|
||||
{
|
||||
return __sync_fetch_and_add(Address, Value);
|
||||
@@ -511,7 +511,7 @@ RtlAtomicExchangeAdd64(IN VOLATILE PLONG_PTR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
PVOID
|
||||
RtlAtomicExchangePointer(IN VOLATILE PVOID *Address,
|
||||
RTL::Atomic::ExchangePointer(IN PVOID *Address,
|
||||
IN PVOID Exchange)
|
||||
{
|
||||
__sync_synchronize();
|
||||
@@ -530,9 +530,9 @@ RtlAtomicExchangePointer(IN VOLATILE PVOID *Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
PSINGLE_LIST_ENTRY
|
||||
RtlAtomicFlushSingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
RTL::Atomic::FlushSingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
{
|
||||
return (PSINGLE_LIST_ENTRY)RtlAtomicExchange64((PLONG_PTR)&Header->Alignment, (LONGLONG)NULL);
|
||||
return (PSINGLE_LIST_ENTRY)Exchange64((PLONG_PTR)&Header->Alignment, (LONGLONG)NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -547,7 +547,7 @@ RtlAtomicFlushSingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicIncrement8(IN VOLATILE PCHAR Address)
|
||||
RTL::Atomic::Increment8(IN PCHAR Address)
|
||||
{
|
||||
return __sync_add_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -564,7 +564,7 @@ RtlAtomicIncrement8(IN VOLATILE PCHAR Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicIncrement16(IN VOLATILE PSHORT Address)
|
||||
RTL::Atomic::Increment16(IN PSHORT Address)
|
||||
{
|
||||
return __sync_add_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -581,7 +581,7 @@ RtlAtomicIncrement16(IN VOLATILE PSHORT Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicIncrement32(IN VOLATILE PLONG Address)
|
||||
RTL::Atomic::Increment32(IN PLONG Address)
|
||||
{
|
||||
return __sync_add_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -598,7 +598,7 @@ RtlAtomicIncrement32(IN VOLATILE PLONG Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicIncrement64(IN VOLATILE PLONG_PTR Address)
|
||||
RTL::Atomic::Increment64(IN PLONG_PTR Address)
|
||||
{
|
||||
return __sync_add_and_fetch(Address, 1);
|
||||
}
|
||||
@@ -618,7 +618,7 @@ RtlAtomicIncrement64(IN VOLATILE PLONG_PTR Address)
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicOr8(IN VOLATILE PCHAR Address,
|
||||
RTL::Atomic::Or8(IN PCHAR Address,
|
||||
IN CHAR Mask)
|
||||
{
|
||||
return __sync_fetch_and_or(Address, Mask);
|
||||
@@ -639,7 +639,7 @@ RtlAtomicOr8(IN VOLATILE PCHAR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicOr16(IN VOLATILE PSHORT Address,
|
||||
RTL::Atomic::Or16(IN PSHORT Address,
|
||||
IN SHORT Mask)
|
||||
{
|
||||
return __sync_fetch_and_or(Address, Mask);
|
||||
@@ -660,7 +660,7 @@ RtlAtomicOr16(IN VOLATILE PSHORT Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicOr32(IN VOLATILE PLONG Address,
|
||||
RTL::Atomic::Or32(IN PLONG Address,
|
||||
IN LONG Mask)
|
||||
{
|
||||
return __sync_fetch_and_or(Address, Mask);
|
||||
@@ -681,7 +681,7 @@ RtlAtomicOr32(IN VOLATILE PLONG Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicOr64(IN VOLATILE PLONG_PTR Address,
|
||||
RTL::Atomic::Or64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask)
|
||||
{
|
||||
return __sync_fetch_and_or(Address, Mask);
|
||||
@@ -699,12 +699,12 @@ RtlAtomicOr64(IN VOLATILE PLONG_PTR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
PSINGLE_LIST_ENTRY
|
||||
RtlAtomicPopEntrySingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
RTL::Atomic::PopEntrySingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
{
|
||||
PSINGLE_LIST_ENTRY ListHead, FirstEntry, NextEntry;
|
||||
|
||||
/* Save header and first entry */
|
||||
ListHead = (PVOID)Header;
|
||||
ListHead = (PSINGLE_LIST_ENTRY)Header;
|
||||
FirstEntry = ListHead->Next;
|
||||
do
|
||||
{
|
||||
@@ -712,14 +712,14 @@ RtlAtomicPopEntrySingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
if(!FirstEntry)
|
||||
{
|
||||
/* Empty list */
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* Update link */
|
||||
NextEntry = FirstEntry;
|
||||
|
||||
/* Compare and exchange */
|
||||
FirstEntry = (PVOID)RtlAtomicCompareExchange64((PLONG_PTR)ListHead,
|
||||
FirstEntry = (PSINGLE_LIST_ENTRY)CompareExchange64((PLONG_PTR)ListHead,
|
||||
(LONG_PTR)FirstEntry->Next,
|
||||
(LONG_PTR)FirstEntry);
|
||||
} while(FirstEntry != NextEntry);
|
||||
@@ -743,14 +743,14 @@ RtlAtomicPopEntrySingleList(IN PSINGLE_LIST_HEADER Header)
|
||||
*/
|
||||
XTFASTCALL
|
||||
PSINGLE_LIST_ENTRY
|
||||
RtlAtomicPushEntrySingleList(IN PSINGLE_LIST_HEADER Header,
|
||||
RTL::Atomic::PushEntrySingleList(IN PSINGLE_LIST_HEADER Header,
|
||||
IN PSINGLE_LIST_ENTRY Entry)
|
||||
{
|
||||
PSINGLE_LIST_ENTRY ListHead, ListEntry, FirstEntry, NextEntry;
|
||||
|
||||
/* Save header and new entry */
|
||||
ListHead = (PVOID)Header;
|
||||
ListEntry = (PVOID)Entry;
|
||||
ListHead = (PSINGLE_LIST_ENTRY)Header;
|
||||
ListEntry = Entry;
|
||||
|
||||
/* Save next link in new first element */
|
||||
FirstEntry = ListHead->Next;
|
||||
@@ -761,7 +761,7 @@ RtlAtomicPushEntrySingleList(IN PSINGLE_LIST_HEADER Header,
|
||||
NextEntry = FirstEntry;
|
||||
|
||||
/* Compare and exchange */
|
||||
FirstEntry = (PVOID)RtlAtomicCompareExchange64((PLONG_PTR)ListHead,
|
||||
FirstEntry = (PSINGLE_LIST_ENTRY)CompareExchange64((PLONG_PTR)ListHead,
|
||||
(LONG_PTR)ListEntry,
|
||||
(LONG_PTR)FirstEntry);
|
||||
} while(FirstEntry != NextEntry);
|
||||
@@ -785,7 +785,7 @@ RtlAtomicPushEntrySingleList(IN PSINGLE_LIST_HEADER Header,
|
||||
*/
|
||||
XTFASTCALL
|
||||
CHAR
|
||||
RtlAtomicXor8(IN VOLATILE PCHAR Address,
|
||||
RTL::Atomic::Xor8(IN PCHAR Address,
|
||||
IN CHAR Mask)
|
||||
{
|
||||
return __sync_fetch_and_xor(Address, Mask);
|
||||
@@ -806,7 +806,7 @@ RtlAtomicXor8(IN VOLATILE PCHAR Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
SHORT
|
||||
RtlAtomicXor16(IN VOLATILE PSHORT Address,
|
||||
RTL::Atomic::Xor16(IN PSHORT Address,
|
||||
IN SHORT Mask)
|
||||
{
|
||||
return __sync_fetch_and_xor(Address, Mask);
|
||||
@@ -827,7 +827,7 @@ RtlAtomicXor16(IN VOLATILE PSHORT Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG
|
||||
RtlAtomicXor32(IN VOLATILE PLONG Address,
|
||||
RTL::Atomic::Xor32(IN PLONG Address,
|
||||
IN LONG Mask)
|
||||
{
|
||||
return __sync_fetch_and_xor(Address, Mask);
|
||||
@@ -848,7 +848,7 @@ RtlAtomicXor32(IN VOLATILE PLONG Address,
|
||||
*/
|
||||
XTFASTCALL
|
||||
LONG_PTR
|
||||
RtlAtomicXor64(IN VOLATILE PLONG_PTR Address,
|
||||
RTL::Atomic::Xor64(IN PLONG_PTR Address,
|
||||
IN LONG_PTR Mask)
|
||||
{
|
||||
return __sync_fetch_and_xor(Address, Mask);
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/bitmap.c
|
||||
* FILE: xtoskrnl/rtl/bitmap.cc
|
||||
* DESCRIPTION: Bit maps support related routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,10 +21,10 @@
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearAllBits(IN PRTL_BITMAP BitMap)
|
||||
RTL::BitMap::ClearAllBits(IN PRTL_BITMAP BitMap)
|
||||
{
|
||||
/* Clear all bits */
|
||||
RtlSetMemory(BitMap->Buffer, 0, ((BitMap->Size + BITS_PER_LONG - 1) / BITS_PER_LONG) * sizeof(ULONG_PTR));
|
||||
RTL::Memory::SetMemory(BitMap->Buffer, 0, ((BitMap->Size + BITS_PER_LONG - 1) / BITS_PER_LONG) * sizeof(ULONG_PTR));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,7 +42,7 @@ RtlClearAllBits(IN PRTL_BITMAP BitMap)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearBit(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::ClearBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit)
|
||||
{
|
||||
/* Check if bit is in range */
|
||||
@@ -74,7 +74,7 @@ RtlClearBit(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlClearBits(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::ClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length)
|
||||
{
|
||||
@@ -118,7 +118,7 @@ RtlClearBits(IN PRTL_BITMAP BitMap,
|
||||
}
|
||||
|
||||
/* Clear remaining bits */
|
||||
RtlSetMemory(Buffer, 0, Length >> 3);
|
||||
RTL::Memory::SetMemory(Buffer, 0, Length >> 3);
|
||||
|
||||
/* Look for any remaining bits to clear */
|
||||
Buffer += Length / BITS_PER_LONG;
|
||||
@@ -148,26 +148,85 @@ RtlClearBits(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlClearSetBits(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::ClearSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index)
|
||||
{
|
||||
ULONG_PTR StartingIndex;
|
||||
|
||||
/* Find set bits */
|
||||
StartingIndex = RtlFindSetBits(BitMap, Length, Index);
|
||||
StartingIndex = FindSetBits(BitMap, Length, Index);
|
||||
|
||||
/* Check if set bits were found */
|
||||
if(StartingIndex != MAXULONG_PTR)
|
||||
{
|
||||
/* Clear bits */
|
||||
RtlClearBits(BitMap, StartingIndex, Length);
|
||||
ClearBits(BitMap, StartingIndex, Length);
|
||||
}
|
||||
|
||||
/* Return position of bits found */
|
||||
return StartingIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of either set or clear bits in the contiguous region of the bit map.
|
||||
*
|
||||
* @param BitMap
|
||||
* Supplies a pointer to the bit map.
|
||||
*
|
||||
* @param Length
|
||||
* Supplies the maximum length (number of bits) to count.
|
||||
*
|
||||
* @param StartingIndex
|
||||
* Supplies the starting index of the first bit to count.
|
||||
*
|
||||
* @param SetBits
|
||||
* Specifies whether count bits that are set or clear.
|
||||
*
|
||||
* @return This routine returns the number of equal bits found in the contiguous region.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RTL::BitMap::CountBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN BOOLEAN SetBits)
|
||||
{
|
||||
PULONG_PTR Buffer, BufferEnd;
|
||||
ULONG_PTR BitOffset, Size;
|
||||
ULONGLONG Value;
|
||||
|
||||
/* Get pointers to first and last bytes to check */
|
||||
Buffer = &BitMap->Buffer[StartingIndex / BITS_PER_LONG];
|
||||
BufferEnd = Buffer + ((Length + BITS_PER_LONG - 1) / BITS_PER_LONG);
|
||||
|
||||
/* Get offset and value */
|
||||
BitOffset = StartingIndex & (BITS_PER_LONG - 1);
|
||||
Value = (SetBits ? ~*Buffer : *Buffer) >> BitOffset << BitOffset;
|
||||
|
||||
/* Find first bit set until the end of the buffer */
|
||||
while(!Value && Buffer + 1 < BufferEnd)
|
||||
{
|
||||
/* Advance buffer pointer and get value */
|
||||
Value = SetBits ? ~*(++Buffer) : *(++Buffer);
|
||||
}
|
||||
|
||||
/* Check if value found */
|
||||
if(!Value)
|
||||
{
|
||||
/* No bits found, return length */
|
||||
return Length;
|
||||
}
|
||||
|
||||
/* Calculate size */
|
||||
Size = ((Buffer - BitMap->Buffer) * BITS_PER_LONG) - StartingIndex + (ULONG_PTR)RTL::Math::CountTrailingZeroes64(Value);
|
||||
|
||||
/* Return whatever is smaller */
|
||||
return Size > Length ? Length : Size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dumps the contents of the bit map.
|
||||
*
|
||||
@@ -180,7 +239,7 @@ RtlClearSetBits(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlDumpBitMap(IN PRTL_BITMAP BitMap)
|
||||
RTL::BitMap::DumpBitMap(IN PRTL_BITMAP BitMap)
|
||||
{
|
||||
ULONG_PTR Index;
|
||||
|
||||
@@ -194,6 +253,99 @@ RtlDumpBitMap(IN PRTL_BITMAP BitMap)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches the bit map for a contiguous region of either set or clear bits.
|
||||
*
|
||||
* @param BitMap
|
||||
* Supplies a pointer to the bit map.
|
||||
*
|
||||
* @param Length
|
||||
* Supplies the length (number of equal bits) to look for.
|
||||
*
|
||||
* @param StartingIndex
|
||||
* Supplies the starting index of the first bit to start the search at a given position.
|
||||
*
|
||||
* @param SetBits
|
||||
* Specifies whether count bits that are set or clear.
|
||||
*
|
||||
* @return This routine returns the bit map index position of the contiguous region found, or MAXULONG_PTR if not found.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RTL::BitMap::FindBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN BOOLEAN SetBits)
|
||||
{
|
||||
ULONG_PTR BitMapEnd, BitOffset, Size;
|
||||
ULONG Tries;
|
||||
|
||||
/* Validate length */
|
||||
if(Length > BitMap->Size)
|
||||
{
|
||||
/* Length exceeds bit map size, return MAXULONG_PTR */
|
||||
return (ULONG_PTR)-1;
|
||||
}
|
||||
else if(!Length)
|
||||
{
|
||||
/* Length not specified, return starting index */
|
||||
return StartingIndex;
|
||||
}
|
||||
|
||||
/* Check if starting index is in range of bit map size */
|
||||
if(StartingIndex >= BitMap->Size)
|
||||
{
|
||||
/* Starting index exceeds bit map size, start from the beginning */
|
||||
StartingIndex = 0;
|
||||
}
|
||||
|
||||
/* Try from starting index */
|
||||
BitOffset = StartingIndex;
|
||||
BitMapEnd = BitMap->Size;
|
||||
|
||||
/* At least two tries are required */
|
||||
Tries = (StartingIndex != 0) + 2;
|
||||
while(Tries)
|
||||
{
|
||||
/* Find until the end of the bit map */
|
||||
while(BitOffset + Length < BitMapEnd)
|
||||
{
|
||||
/* Increment offset */
|
||||
BitOffset += CountBits(BitMap, BitMap->Size - BitOffset, BitOffset, (BOOLEAN)!SetBits);
|
||||
if(BitOffset + Length > BitMapEnd)
|
||||
{
|
||||
/* No match found, break loop execution */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Count bits in the contiguous region and check if match found */
|
||||
Size = CountBits(BitMap, Length, BitOffset, SetBits);
|
||||
if(Size >= Length)
|
||||
{
|
||||
/* Match found, return offset */
|
||||
return BitOffset;
|
||||
}
|
||||
|
||||
/* Increment offset */
|
||||
BitOffset += Size;
|
||||
}
|
||||
|
||||
/* Try again if possible */
|
||||
Tries--;
|
||||
if(Tries)
|
||||
{
|
||||
/* Restart from the beginning up to the starting index */
|
||||
BitOffset = 0;
|
||||
BitMapEnd = StartingIndex;
|
||||
}
|
||||
}
|
||||
|
||||
/* No match found, return MAXULONG_PTR */
|
||||
return (ULONG_PTR)-1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches the bit map for a contiguous region of clear bits.
|
||||
*
|
||||
@@ -212,12 +364,12 @@ RtlDumpBitMap(IN PRTL_BITMAP BitMap)
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlFindClearBits(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::FindClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index)
|
||||
{
|
||||
/* Find clear bits */
|
||||
return RtlpFindBits(BitMap, Length, Index, FALSE);
|
||||
return FindBits(BitMap, Length, Index, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -238,12 +390,12 @@ RtlFindClearBits(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlFindSetBits(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::FindSetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index)
|
||||
{
|
||||
/* Find set bits */
|
||||
return RtlpFindBits(BitMap, Length, Index, TRUE);
|
||||
return FindBits(BitMap, Length, Index, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -264,7 +416,7 @@ RtlFindSetBits(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlInitializeBitMap(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::InitializeBitMap(IN PRTL_BITMAP BitMap,
|
||||
IN PULONG_PTR Buffer,
|
||||
IN ULONG Size)
|
||||
{
|
||||
@@ -285,10 +437,10 @@ RtlInitializeBitMap(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetAllBits(IN PRTL_BITMAP BitMap)
|
||||
RTL::BitMap::SetAllBits(IN PRTL_BITMAP BitMap)
|
||||
{
|
||||
/* Set all bits */
|
||||
RtlSetMemory(BitMap->Buffer, 0xFF, ((BitMap->Size + BITS_PER_LONG - 1) / BITS_PER_LONG) * sizeof(ULONG_PTR));
|
||||
RTL::Memory::SetMemory(BitMap->Buffer, 0xFF, ((BitMap->Size + BITS_PER_LONG - 1) / BITS_PER_LONG) * sizeof(ULONG_PTR));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -306,7 +458,7 @@ RtlSetAllBits(IN PRTL_BITMAP BitMap)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetBit(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::SetBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit)
|
||||
{
|
||||
/* Check if bit is in range */
|
||||
@@ -338,7 +490,7 @@ RtlSetBit(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetBits(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::SetBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN ULONG_PTR Length)
|
||||
{
|
||||
@@ -382,7 +534,7 @@ RtlSetBits(IN PRTL_BITMAP BitMap,
|
||||
}
|
||||
|
||||
/* Set remaining bits */
|
||||
RtlSetMemory(Buffer, 0xFF, Length >> 3);
|
||||
RTL::Memory::SetMemory(Buffer, 0xFF, Length >> 3);
|
||||
|
||||
/* Look for any remaining bits to set */
|
||||
Buffer += Length / BITS_PER_LONG;
|
||||
@@ -412,20 +564,20 @@ RtlSetBits(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
RtlSetClearBits(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::SetClearBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR Index)
|
||||
{
|
||||
ULONG_PTR StartingIndex;
|
||||
|
||||
/* Find clear bits */
|
||||
StartingIndex = RtlFindClearBits(BitMap, Length, Index);
|
||||
StartingIndex = FindClearBits(BitMap, Length, Index);
|
||||
|
||||
/* Check if clear bits were found */
|
||||
if(StartingIndex != MAXULONG_PTR)
|
||||
{
|
||||
/* Set bits */
|
||||
RtlSetBits(BitMap, StartingIndex, Length);
|
||||
SetBits(BitMap, StartingIndex, Length);
|
||||
}
|
||||
|
||||
/* Return position of bits found */
|
||||
@@ -447,7 +599,7 @@ RtlSetClearBits(IN PRTL_BITMAP BitMap,
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlTestBit(IN PRTL_BITMAP BitMap,
|
||||
RTL::BitMap::TestBit(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Bit)
|
||||
{
|
||||
/* Check if bit is in range */
|
||||
@@ -460,155 +612,3 @@ RtlTestBit(IN PRTL_BITMAP BitMap,
|
||||
/* Test specified bit and return result */
|
||||
return ((BitMap->Buffer[Bit / BITS_PER_LONG] >> (Bit & (BITS_PER_LONG - 1))) & 1) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts the number of either set or clear bits in the contiguous region of the bit map.
|
||||
*
|
||||
* @param BitMap
|
||||
* Supplies a pointer to the bit map.
|
||||
*
|
||||
* @param Length
|
||||
* Supplies the maximum length (number of bits) to count.
|
||||
*
|
||||
* @param StartingIndex
|
||||
* Supplies the starting index of the first bit to count.
|
||||
*
|
||||
* @param SetBits
|
||||
* Specifies whether count bits that are set or clear.
|
||||
*
|
||||
* @return This routine returns the number of equal bits found in the contiguous region.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlpCountBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN BOOLEAN SetBits)
|
||||
{
|
||||
PULONG_PTR Buffer, BufferEnd;
|
||||
ULONG_PTR BitOffset, Size;
|
||||
ULONGLONG Value;
|
||||
|
||||
/* Get pointers to first and last bytes to check */
|
||||
Buffer = &BitMap->Buffer[StartingIndex / BITS_PER_LONG];
|
||||
BufferEnd = Buffer + ((Length + BITS_PER_LONG - 1) / BITS_PER_LONG);
|
||||
|
||||
/* Get offset and value */
|
||||
BitOffset = StartingIndex & (BITS_PER_LONG - 1);
|
||||
Value = (SetBits ? ~*Buffer : *Buffer) >> BitOffset << BitOffset;
|
||||
|
||||
/* Find first bit set until the end of the buffer */
|
||||
while(!Value && Buffer + 1 < BufferEnd)
|
||||
{
|
||||
/* Advance buffer pointer and get value */
|
||||
Value = SetBits ? ~*(++Buffer) : *(++Buffer);
|
||||
}
|
||||
|
||||
/* Check if value found */
|
||||
if(!Value)
|
||||
{
|
||||
/* No bits found, return length */
|
||||
return Length;
|
||||
}
|
||||
|
||||
/* Calculate size */
|
||||
Size = ((Buffer - BitMap->Buffer) * BITS_PER_LONG) - StartingIndex + (ULONG_PTR)RtlCountTrailingZeroes64(Value);
|
||||
|
||||
/* Return whatever is smaller */
|
||||
return Size > Length ? Length : Size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches the bit map for a contiguous region of either set or clear bits.
|
||||
*
|
||||
* @param BitMap
|
||||
* Supplies a pointer to the bit map.
|
||||
*
|
||||
* @param Length
|
||||
* Supplies the length (number of equal bits) to look for.
|
||||
*
|
||||
* @param StartingIndex
|
||||
* Supplies the starting index of the first bit to start the search at a given position.
|
||||
*
|
||||
* @param SetBits
|
||||
* Specifies whether count bits that are set or clear.
|
||||
*
|
||||
* @return This routine returns the bit map index position of the contiguous region found, or MAXULONG_PTR if not found.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
RtlpFindBits(IN PRTL_BITMAP BitMap,
|
||||
IN ULONG_PTR Length,
|
||||
IN ULONG_PTR StartingIndex,
|
||||
IN BOOLEAN SetBits)
|
||||
{
|
||||
ULONG_PTR BitMapEnd, BitOffset, Size;
|
||||
ULONG Tries;
|
||||
|
||||
/* Validate length */
|
||||
if(Length > BitMap->Size)
|
||||
{
|
||||
/* Length exceeds bit map size, return MAXULONG_PTR */
|
||||
return (ULONG_PTR)-1;
|
||||
}
|
||||
else if(!Length)
|
||||
{
|
||||
/* Length not specified, return starting index */
|
||||
return StartingIndex;
|
||||
}
|
||||
|
||||
/* Check if starting index is in range of bit map size */
|
||||
if(StartingIndex >= BitMap->Size)
|
||||
{
|
||||
/* Starting index exceeds bit map size, start from the beginning */
|
||||
StartingIndex = 0;
|
||||
}
|
||||
|
||||
/* Try from starting index */
|
||||
BitOffset = StartingIndex;
|
||||
BitMapEnd = BitMap->Size;
|
||||
|
||||
/* At least two tries are required */
|
||||
Tries = (StartingIndex != 0) + 2;
|
||||
while(Tries)
|
||||
{
|
||||
/* Find until the end of the bit map */
|
||||
while(BitOffset + Length < BitMapEnd)
|
||||
{
|
||||
/* Increment offset */
|
||||
BitOffset += RtlpCountBits(BitMap, BitMap->Size - BitOffset, BitOffset, !SetBits);
|
||||
if(BitOffset + Length > BitMapEnd)
|
||||
{
|
||||
/* No match found, break loop execution */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Count bits in the contiguous region and check if match found */
|
||||
Size = RtlpCountBits(BitMap, Length, BitOffset, SetBits);
|
||||
if(Size >= Length)
|
||||
{
|
||||
/* Match found, return offset */
|
||||
return BitOffset;
|
||||
}
|
||||
|
||||
/* Increment offset */
|
||||
BitOffset += Size;
|
||||
}
|
||||
|
||||
/* Try again if possible */
|
||||
Tries--;
|
||||
if(Tries)
|
||||
{
|
||||
/* Restart from the beginning up to the starting index */
|
||||
BitOffset = 0;
|
||||
BitMapEnd = StartingIndex;
|
||||
}
|
||||
}
|
||||
|
||||
/* No match found, return MAXULONG_PTR */
|
||||
return (ULONG_PTR)-1;
|
||||
}
|
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/globals.c
|
||||
* DESCRIPTION: Kernel runtime library global variables
|
||||
* FILE: xtoskrnl/rtl/data.cc
|
||||
* DESCRIPTION: Runtime Library global and static data
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
|
||||
|
||||
/* This is required for floating numbers to keep LLVM happy */
|
||||
int _fltused = 0xFEEDBULL;
|
||||
XTCLINK INT _fltused = 0xFEEDBULL;
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/byteswap.c
|
||||
* FILE: xtoskrnl/rtl/endian.cc
|
||||
* DESCRIPTION: Endian conversion routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
XTFASTCALL
|
||||
USHORT
|
||||
RtlByteSwap16(IN USHORT Source)
|
||||
RTL::Endianness::SwapByte16(IN USHORT Source)
|
||||
{
|
||||
return (USHORT)(((Source >> 8) & 0x00FF) |
|
||||
((Source << 8) & 0xFF00));
|
||||
@@ -39,7 +39,7 @@ RtlByteSwap16(IN USHORT Source)
|
||||
*/
|
||||
XTFASTCALL
|
||||
ULONG
|
||||
RtlByteSwap32(IN ULONG Source)
|
||||
RTL::Endianness::SwapByte32(IN ULONG Source)
|
||||
{
|
||||
return (ULONG)(((Source >> 24) & 0x000000FF) |
|
||||
((Source >> 8) & 0x0000FF00) |
|
||||
@@ -59,7 +59,7 @@ RtlByteSwap32(IN ULONG Source)
|
||||
*/
|
||||
XTFASTCALL
|
||||
ULONGLONG
|
||||
RtlByteSwap64(IN ULONGLONG Source)
|
||||
RTL::Endianness::SwapByte64(IN ULONGLONG Source)
|
||||
{
|
||||
return (ULONGLONG)(((Source >> 56) & 0x00000000000000FF) |
|
||||
((Source >> 40) & 0x000000000000FF00) |
|
1310
xtoskrnl/rtl/exports.cc
Normal file
1310
xtoskrnl/rtl/exports.cc
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/guid.c
|
||||
* FILE: xtoskrnl/rtl/guid.cc
|
||||
* DESCRIPTION: GUID manipulation routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -24,7 +24,7 @@
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlCompareGuids(IN PGUID Guid1,
|
||||
RTL::Guid::CompareGuids(IN PGUID Guid1,
|
||||
IN PGUID Guid2)
|
||||
{
|
||||
PUINT Guid1Ptr, Guid2Ptr;
|
||||
@@ -34,6 +34,6 @@ RtlCompareGuids(IN PGUID Guid1,
|
||||
Guid2Ptr = (PUINT)Guid2;
|
||||
|
||||
/* Compare GUIDs */
|
||||
return(Guid1Ptr[0] == Guid2Ptr[0] && Guid1Ptr[1] == Guid2Ptr[1] &&
|
||||
return (BOOLEAN)(Guid1Ptr[0] == Guid2Ptr[0] && Guid1Ptr[1] == Guid2Ptr[1] &&
|
||||
Guid1Ptr[2] == Guid2Ptr[2] && Guid1Ptr[3] == Guid2Ptr[3]);
|
||||
}
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/i686/dispatch.c
|
||||
* FILE: xtoskrnl/rtl/i686/dispatch.cc
|
||||
* DESCRIPTION: Dispatching support for i686 architecture
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -24,7 +24,7 @@
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlGetStackLimits(OUT PULONG_PTR StackBase,
|
||||
RTL::Dispatcher::GetStackLimits(OUT PULONG_PTR StackBase,
|
||||
OUT PULONG_PTR StackLimit)
|
||||
{
|
||||
PKTHREAD Thread = KeGetCurrentThread();
|
@@ -1,14 +1,15 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/i686/exsup.c
|
||||
* FILE: xtoskrnl/rtl/i686/exsup.cc
|
||||
* DESCRIPTION: Exception handling for i686 architecture
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
EXCEPTION_DISPOSITION
|
||||
__C_specific_handler(IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
@@ -22,6 +23,7 @@ __C_specific_handler(IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
return ExceptionContinueExecution;
|
||||
}
|
||||
|
||||
XTCLINK
|
||||
XTCDECL
|
||||
INT
|
||||
_except_handler3(PEXCEPTION_RECORD ExceptionRecord,
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/plist.c
|
||||
* FILE: xtoskrnl/rtl/llist.cc
|
||||
* DESCRIPTION: Linked list manipulation routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead(IN PLIST_ENTRY ListHead)
|
||||
RTL::LinkedList::InitializeListHead(IN PLIST_ENTRY ListHead)
|
||||
{
|
||||
ListHead->Blink = ListHead;
|
||||
ListHead->Flink = ListHead;
|
||||
@@ -39,7 +39,7 @@ RtlInitializeListHead(IN PLIST_ENTRY ListHead)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInitializeListHead32(IN PLIST_ENTRY32 ListHead)
|
||||
RTL::LinkedList::InitializeListHead32(IN PLIST_ENTRY32 ListHead)
|
||||
{
|
||||
ListHead->Blink = PtrToUlong(ListHead);
|
||||
ListHead->Flink = PtrToUlong(ListHead);
|
||||
@@ -60,7 +60,7 @@ RtlInitializeListHead32(IN PLIST_ENTRY32 ListHead)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
RTL::LinkedList::InsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry)
|
||||
{
|
||||
Entry->Flink = ListHead->Flink;
|
||||
@@ -84,7 +84,7 @@ RtlInsertHeadList(IN OUT PLIST_ENTRY ListHead,
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlInsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
RTL::LinkedList::InsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
IN PLIST_ENTRY Entry)
|
||||
{
|
||||
Entry->Flink = ListHead;
|
||||
@@ -105,9 +105,9 @@ RtlInsertTailList(IN OUT PLIST_ENTRY ListHead,
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlListEmpty(IN PLIST_ENTRY ListHead)
|
||||
RTL::LinkedList::ListEmpty(IN PLIST_ENTRY ListHead)
|
||||
{
|
||||
return (((ListHead->Flink == NULL) && (ListHead->Blink == NULL)) || (ListHead->Flink == ListHead));
|
||||
return (BOOLEAN)(((ListHead->Flink == NULL) && (ListHead->Blink == NULL)) || (ListHead->Flink == ListHead));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -122,7 +122,7 @@ RtlListEmpty(IN PLIST_ENTRY ListHead)
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlListLoop(IN PLIST_ENTRY ListHead)
|
||||
RTL::LinkedList::ListLoop(IN PLIST_ENTRY ListHead)
|
||||
{
|
||||
PLIST_ENTRY SlowEntry, FastEntry;
|
||||
|
||||
@@ -168,7 +168,7 @@ RtlListLoop(IN PLIST_ENTRY ListHead)
|
||||
*/
|
||||
XTCDECL
|
||||
VOID
|
||||
RtlRemoveEntryList(IN PLIST_ENTRY Entry)
|
||||
RTL::LinkedList::RemoveEntryList(IN PLIST_ENTRY Entry)
|
||||
{
|
||||
Entry->Flink->Blink = Entry->Blink;
|
||||
Entry->Blink->Flink = Entry->Flink;
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/math.c
|
||||
* FILE: xtoskrnl/rtl/math.cc
|
||||
* DESCRIPTION: Kernel math support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlConvertToLargeInteger32(IN LONG Value)
|
||||
RTL::Math::ConvertToLargeInteger32(IN LONG Value)
|
||||
{
|
||||
LARGE_INTEGER LargeInt;
|
||||
|
||||
@@ -42,7 +42,7 @@ RtlConvertToLargeInteger32(IN LONG Value)
|
||||
*/
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlConvertToLargeIntegerUnsigned32(IN ULONG Value)
|
||||
RTL::Math::ConvertToLargeIntegerUnsigned32(IN ULONG Value)
|
||||
{
|
||||
LARGE_INTEGER LargeInt;
|
||||
|
||||
@@ -63,7 +63,7 @@ RtlConvertToLargeIntegerUnsigned32(IN ULONG Value)
|
||||
*/
|
||||
XTAPI
|
||||
INT
|
||||
RtlCountLeadingZeroes32(IN ULONG Value)
|
||||
RTL::Math::CountLeadingZeroes32(IN ULONG Value)
|
||||
{
|
||||
/* Return a number of leading zero bits */
|
||||
return __builtin_clzl(Value);
|
||||
@@ -81,7 +81,7 @@ RtlCountLeadingZeroes32(IN ULONG Value)
|
||||
*/
|
||||
XTAPI
|
||||
INT
|
||||
RtlCountLeadingZeroes64(IN ULONGLONG Value)
|
||||
RTL::Math::CountLeadingZeroes64(IN ULONGLONG Value)
|
||||
{
|
||||
/* Return a number of leading zero bits */
|
||||
return __builtin_clzll(Value);
|
||||
@@ -99,7 +99,7 @@ RtlCountLeadingZeroes64(IN ULONGLONG Value)
|
||||
*/
|
||||
XTAPI
|
||||
INT
|
||||
RtlCountTrailingZeroes32(IN ULONG Value)
|
||||
RTL::Math::CountTrailingZeroes32(IN ULONG Value)
|
||||
{
|
||||
/* Return a number of trailing zero bits */
|
||||
return __builtin_ctzl(Value);
|
||||
@@ -117,7 +117,7 @@ RtlCountTrailingZeroes32(IN ULONG Value)
|
||||
*/
|
||||
XTAPI
|
||||
INT
|
||||
RtlCountTrailingZeroes64(IN ULONGLONG Value)
|
||||
RTL::Math::CountTrailingZeroes64(IN ULONGLONG Value)
|
||||
{
|
||||
/* Return a number of trailing zero bits */
|
||||
return __builtin_ctzll(Value);
|
||||
@@ -141,7 +141,7 @@ RtlCountTrailingZeroes64(IN ULONGLONG Value)
|
||||
*/
|
||||
XTAPI
|
||||
LONGLONG
|
||||
RtlDivide32(IN LONG Dividend,
|
||||
RTL::Math::Divide32(IN LONG Dividend,
|
||||
IN LONG Divisor,
|
||||
OUT PLONG Remainder)
|
||||
{
|
||||
@@ -179,7 +179,7 @@ RtlDivide32(IN LONG Dividend,
|
||||
*/
|
||||
XTAPI
|
||||
LONGLONG
|
||||
RtlDivide64(IN LONGLONG Dividend,
|
||||
RTL::Math::Divide64(IN LONGLONG Dividend,
|
||||
IN LONGLONG Divisor,
|
||||
OUT PLONGLONG Remainder)
|
||||
{
|
||||
@@ -193,7 +193,7 @@ RtlDivide64(IN LONGLONG Dividend,
|
||||
|
||||
/* Calculate the quotient */
|
||||
DividendSign ^= DivisorSign;
|
||||
Quotient = (RtlDivideUnsigned64(UDividend, UDivisor, NULL) ^ DividendSign) - DividendSign;
|
||||
Quotient = (DivideUnsigned64(UDividend, UDivisor, nullptr) ^ DividendSign) - DividendSign;
|
||||
|
||||
/* Make sure a pointer to remainder provided */
|
||||
if(Remainder)
|
||||
@@ -224,7 +224,7 @@ RtlDivide64(IN LONGLONG Dividend,
|
||||
*/
|
||||
XTAPI
|
||||
ULONGLONG
|
||||
RtlDivideUnsigned32(IN ULONG Dividend,
|
||||
RTL::Math::DivideUnsigned32(IN ULONG Dividend,
|
||||
IN ULONG Divisor,
|
||||
OUT PULONG Remainder)
|
||||
{
|
||||
@@ -257,7 +257,7 @@ RtlDivideUnsigned32(IN ULONG Dividend,
|
||||
*/
|
||||
XTAPI
|
||||
ULONGLONG
|
||||
RtlDivideUnsigned64(IN ULONGLONG Dividend,
|
||||
RTL::Math::DivideUnsigned64(IN ULONGLONG Dividend,
|
||||
IN ULONGLONG Divisor,
|
||||
OUT PULONGLONG Remainder)
|
||||
{
|
||||
@@ -312,7 +312,7 @@ RtlDivideUnsigned64(IN ULONGLONG Dividend,
|
||||
if(DivisorParts.u.HighPart != 0)
|
||||
{
|
||||
/* Divisor is 64-bit value, calculate the shift count */
|
||||
Shift = RtlCountLeadingZeroes32(DivisorParts.u.HighPart) - RtlCountLeadingZeroes32(DividendParts.u.HighPart);
|
||||
Shift = CountLeadingZeroes32(DivisorParts.u.HighPart) - CountLeadingZeroes32(DividendParts.u.HighPart);
|
||||
|
||||
/* Check if shift count exceeds 32-bits */
|
||||
if(Shift > ((sizeof(ULONG) * BITS_PER_BYTE) - 1))
|
||||
@@ -349,8 +349,8 @@ RtlDivideUnsigned64(IN ULONGLONG Dividend,
|
||||
{
|
||||
/* Divisor is 32-bit value, calculate the shift count */
|
||||
Shift = (sizeof(ULONG) * BITS_PER_BYTE) + 1 +
|
||||
RtlCountLeadingZeroes32(DivisorParts.u.LowPart) -
|
||||
RtlCountLeadingZeroes32(DividendParts.u.HighPart);
|
||||
CountLeadingZeroes32(DivisorParts.u.LowPart) -
|
||||
CountLeadingZeroes32(DividendParts.u.HighPart);
|
||||
|
||||
/* Check if shift is 32-bit */
|
||||
if(Shift == (sizeof(ULONG) * BITS_PER_BYTE))
|
||||
@@ -401,7 +401,7 @@ RtlDivideUnsigned64(IN ULONGLONG Dividend,
|
||||
}
|
||||
|
||||
/* Calculate the shift count */
|
||||
Shift = RtlCountLeadingZeroes32(DivisorParts.u.HighPart) - RtlCountLeadingZeroes32(DividendParts.u.HighPart);
|
||||
Shift = CountLeadingZeroes32(DivisorParts.u.HighPart) - CountLeadingZeroes32(DividendParts.u.HighPart);
|
||||
|
||||
/* Check if shift exceeds 32-bits */
|
||||
if(Shift > ((sizeof(ULONG) * BITS_PER_BYTE) - 2))
|
||||
@@ -485,7 +485,7 @@ RtlDivideUnsigned64(IN ULONGLONG Dividend,
|
||||
*/
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlDivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
RTL::Math::DivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
IN ULONG Divisor,
|
||||
OUT PULONG Remainder)
|
||||
{
|
||||
@@ -497,7 +497,7 @@ RtlDivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
UDividend = (Dividend.QuadPart ^ DividendSign) - DividendSign;
|
||||
|
||||
/* Calculate the quotient */
|
||||
LargeInt.QuadPart = (RtlDivideUnsigned64(UDividend, Divisor, NULL) ^ DividendSign) - DividendSign;
|
||||
LargeInt.QuadPart = (DivideUnsigned64(UDividend, Divisor, nullptr) ^ DividendSign) - DividendSign;
|
||||
|
||||
/* Make sure a pointer to remainder provided */
|
||||
if(Remainder)
|
||||
@@ -525,7 +525,7 @@ RtlDivideLargeInteger(IN LARGE_INTEGER Dividend,
|
||||
*/
|
||||
XTAPI
|
||||
LONG
|
||||
RtlGetBaseExponent(IN DOUBLE Value,
|
||||
RTL::Math::GetBaseExponent(IN DOUBLE Value,
|
||||
OUT PDOUBLE PowerOfTen)
|
||||
{
|
||||
LONG BaseExponent, CurrentExponent, Exponent;
|
||||
@@ -612,7 +612,7 @@ RtlGetBaseExponent(IN DOUBLE Value,
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlInfiniteDouble(IN DOUBLE Value)
|
||||
RTL::Math::InfiniteDouble(IN DOUBLE Value)
|
||||
{
|
||||
/* DOUBLE argument in IEEE 754 standard format */
|
||||
union
|
||||
@@ -631,7 +631,7 @@ RtlInfiniteDouble(IN DOUBLE Value)
|
||||
Var.Double = &Value;
|
||||
|
||||
/* Return TRUE if it is infinite, or FALSE otherwise */
|
||||
return ((Var.DoubleS->Exponent & 0x7FF) == 0x7FF);
|
||||
return (BOOLEAN)((Var.DoubleS->Exponent & 0x7FF) == 0x7FF);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -649,7 +649,7 @@ RtlInfiniteDouble(IN DOUBLE Value)
|
||||
*/
|
||||
XTAPI
|
||||
LARGE_INTEGER
|
||||
RtlMultiplyLargeInteger(IN LARGE_INTEGER Multiplicand,
|
||||
RTL::Math::MultiplyLargeInteger(IN LARGE_INTEGER Multiplicand,
|
||||
IN LONG Multiplier)
|
||||
{
|
||||
LARGE_INTEGER LargeInt;
|
||||
@@ -671,7 +671,7 @@ RtlMultiplyLargeInteger(IN LARGE_INTEGER Multiplicand,
|
||||
*/
|
||||
XTCDECL
|
||||
BOOLEAN
|
||||
RtlNanDouble(IN DOUBLE Value)
|
||||
RTL::Math::NanDouble(IN DOUBLE Value)
|
||||
{
|
||||
/* DOUBLE argument in IEEE 754 standard format */
|
||||
union
|
||||
@@ -690,5 +690,5 @@ RtlNanDouble(IN DOUBLE Value)
|
||||
Var.Double = &Value;
|
||||
|
||||
/* Return TRUE if it is NaN, or FALSE otherwise */
|
||||
return (Var.DoubleS->Exponent == 0x7FF && (Var.DoubleS->MantissaHigh != 0 || Var.DoubleS->MantissaLow != 0));
|
||||
return (BOOLEAN)(Var.DoubleS->Exponent == 0x7FF && (Var.DoubleS->MantissaHigh != 0 || Var.DoubleS->MantissaLow != 0));
|
||||
}
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/memory.c
|
||||
* FILE: xtoskrnl/rtl/memory.cc
|
||||
* DESCRIPTION: Memory related routines
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -27,7 +27,7 @@
|
||||
*/
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareMemory(IN PCVOID LeftBuffer,
|
||||
RTL::Memory::CompareMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -73,7 +73,7 @@ RtlCompareMemory(IN PCVOID LeftBuffer,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyMemory(OUT PVOID Destination,
|
||||
RTL::Memory::CopyMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -106,7 +106,7 @@ RtlCopyMemory(OUT PVOID Destination,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlMoveMemory(OUT PVOID Destination,
|
||||
RTL::Memory::MoveMemory(OUT PVOID Destination,
|
||||
IN PCVOID Source,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -154,11 +154,11 @@ RtlMoveMemory(OUT PVOID Destination,
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
RtlSameMemory(IN PCVOID LeftBuffer,
|
||||
RTL::Memory::SameMemory(IN PCVOID LeftBuffer,
|
||||
IN PCVOID RightBuffer,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
return (RtlCompareMemory(LeftBuffer, RightBuffer, Length) == Length) ? TRUE : FALSE;
|
||||
return (CompareMemory(LeftBuffer, RightBuffer, Length) == Length) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -179,7 +179,7 @@ RtlSameMemory(IN PCVOID LeftBuffer,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlSetMemory(OUT PVOID Destination,
|
||||
RTL::Memory::SetMemory(OUT PVOID Destination,
|
||||
IN UCHAR Byte,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -207,9 +207,9 @@ RtlSetMemory(OUT PVOID Destination,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlZeroMemory(OUT PVOID Destination,
|
||||
RTL::Memory::ZeroMemory(OUT PVOID Destination,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
/* Fill the buffer with zeroes */
|
||||
RtlSetMemory(Destination, 0, Length);
|
||||
SetMemory(Destination, 0, Length);
|
||||
}
|
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/rtl/string.c
|
||||
* FILE: xtoskrnl/rtl/string.cc
|
||||
* DESCRIPTION: String support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
*/
|
||||
|
||||
#include <xtos.h>
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
@@ -27,7 +27,7 @@
|
||||
*/
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareString(IN PCSTR String1,
|
||||
RTL::String::CompareString(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -79,7 +79,7 @@ RtlCompareString(IN PCSTR String1,
|
||||
*/
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlCompareStringInsensitive(IN PCSTR String1,
|
||||
RTL::String::CompareStringInsensitive(IN PCSTR String1,
|
||||
IN PCSTR String2,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -146,7 +146,7 @@ RtlCompareStringInsensitive(IN PCSTR String1,
|
||||
*/
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlConcatenateString(OUT PCHAR Destination,
|
||||
RTL::String::ConcatenateString(OUT PCHAR Destination,
|
||||
IN PCHAR Source,
|
||||
IN SIZE_T Count)
|
||||
{
|
||||
@@ -205,7 +205,7 @@ RtlConcatenateString(OUT PCHAR Destination,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlCopyString(IN PCHAR Destination,
|
||||
RTL::String::CopyString(IN PCHAR Destination,
|
||||
IN PCSTR Source,
|
||||
IN ULONG Length)
|
||||
{
|
||||
@@ -244,7 +244,7 @@ RtlCopyString(IN PCHAR Destination,
|
||||
*/
|
||||
XTAPI
|
||||
PCSTR
|
||||
RtlFindString(IN PCSTR Source,
|
||||
RTL::String::FindString(IN PCSTR Source,
|
||||
IN PCSTR Search)
|
||||
{
|
||||
PCSTR CurrentSource;
|
||||
@@ -254,7 +254,7 @@ RtlFindString(IN PCSTR Source,
|
||||
if(!Source || !Search)
|
||||
{
|
||||
/* Invalid input parameters, return NULL */
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* Check if search string is empty */
|
||||
@@ -288,7 +288,7 @@ RtlFindString(IN PCSTR Source,
|
||||
}
|
||||
|
||||
/* No match found, return NULL */
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -306,7 +306,7 @@ RtlFindString(IN PCSTR Source,
|
||||
*/
|
||||
XTAPI
|
||||
PCSTR
|
||||
RtlFindStringInsensitive(IN PCSTR Source,
|
||||
RTL::String::FindStringInsensitive(IN PCSTR Source,
|
||||
IN PCSTR Search)
|
||||
{
|
||||
PCSTR CurrentSource;
|
||||
@@ -316,7 +316,7 @@ RtlFindStringInsensitive(IN PCSTR Source,
|
||||
if(!Source || !Search)
|
||||
{
|
||||
/* Invalid input parameters, return NULL */
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* Check if search string is empty */
|
||||
@@ -335,7 +335,7 @@ RtlFindStringInsensitive(IN PCSTR Source,
|
||||
|
||||
/* Check if the substring matches starting at the current position */
|
||||
while(*CurrentSource != '\0' && *CurrentSearch != '\0' &&
|
||||
RtlToLowerCharacter(*CurrentSource) == RtlToLowerCharacter(*CurrentSearch))
|
||||
ToLowerCharacter(*CurrentSource) == ToLowerCharacter(*CurrentSearch))
|
||||
{
|
||||
/* Go to the next character */
|
||||
CurrentSource++;
|
||||
@@ -351,7 +351,7 @@ RtlFindStringInsensitive(IN PCSTR Source,
|
||||
}
|
||||
|
||||
/* No match found, return NULL */
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -369,7 +369,7 @@ RtlFindStringInsensitive(IN PCSTR Source,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
RtlReverseString(IN OUT PCHAR String,
|
||||
RTL::String::ReverseString(IN OUT PCHAR String,
|
||||
IN ULONG Length)
|
||||
{
|
||||
UCHAR TempChar;
|
||||
@@ -400,7 +400,7 @@ RtlReverseString(IN OUT PCHAR String,
|
||||
*/
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlStringLength(IN PCSTR String,
|
||||
RTL::String::StringLength(IN PCSTR String,
|
||||
IN SIZE_T MaxLength)
|
||||
{
|
||||
SIZE_T Length;
|
||||
@@ -445,7 +445,7 @@ RtlStringLength(IN PCSTR String,
|
||||
*/
|
||||
XTAPI
|
||||
SIZE_T
|
||||
RtlStringToWideString(OUT PWCHAR Destination,
|
||||
RTL::String::StringToWideString(OUT PWCHAR Destination,
|
||||
IN PCSTR *Source,
|
||||
IN SIZE_T Length)
|
||||
{
|
||||
@@ -466,7 +466,7 @@ RtlStringToWideString(OUT PWCHAR Destination,
|
||||
if((*Destination = *LocalSource) == 0)
|
||||
{
|
||||
/* End of string reached */
|
||||
LocalSource = NULL;
|
||||
LocalSource = nullptr;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -505,7 +505,7 @@ RtlStringToWideString(OUT PWCHAR Destination,
|
||||
*/
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTokenizeString(IN PCHAR String,
|
||||
RTL::String::TokenizeString(IN PCHAR String,
|
||||
IN PCSTR Delimiter,
|
||||
IN OUT PCHAR *SavePtr)
|
||||
{
|
||||
@@ -516,15 +516,15 @@ RtlTokenizeString(IN PCHAR String,
|
||||
if(String == NULL && (String = *SavePtr) == NULL)
|
||||
{
|
||||
/* Empty string given */
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/* Check non-delimiter characters */
|
||||
Char = *String++;
|
||||
if(Char == '\0')
|
||||
{
|
||||
*SavePtr = NULL;
|
||||
return NULL;
|
||||
*SavePtr = nullptr;
|
||||
return nullptr;
|
||||
}
|
||||
Token = String - 1;
|
||||
|
||||
@@ -542,7 +542,7 @@ RtlTokenizeString(IN PCHAR String,
|
||||
if(Char == '\0')
|
||||
{
|
||||
/* End of string reached, no more tokens */
|
||||
String = NULL;
|
||||
String = nullptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -573,7 +573,7 @@ RtlTokenizeString(IN PCHAR String,
|
||||
*/
|
||||
XTAPI
|
||||
CHAR
|
||||
RtlToLowerCharacter(IN CHAR Character)
|
||||
RTL::String::ToLowerCharacter(IN CHAR Character)
|
||||
{
|
||||
/* Check if character is uppercase */
|
||||
if(Character >= 'A' && Character <= 'Z')
|
||||
@@ -598,7 +598,7 @@ RtlToLowerCharacter(IN CHAR Character)
|
||||
*/
|
||||
XTAPI
|
||||
CHAR
|
||||
RtlToUpperCharacter(IN CHAR Character)
|
||||
RTL::String::ToUpperCharacter(IN CHAR Character)
|
||||
{
|
||||
/* Check if character is lowercase */
|
||||
if(Character >= 'a' && Character <= 'z')
|
||||
@@ -623,7 +623,7 @@ RtlToUpperCharacter(IN CHAR Character)
|
||||
*/
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimLeftString(IN PCHAR String)
|
||||
RTL::String::TrimLeftString(IN PCHAR String)
|
||||
{
|
||||
PCHAR Start;
|
||||
|
||||
@@ -653,12 +653,12 @@ RtlTrimLeftString(IN PCHAR String)
|
||||
*/
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimRightString(IN PCHAR String)
|
||||
RTL::String::TrimRightString(IN PCHAR String)
|
||||
{
|
||||
PCHAR End;
|
||||
|
||||
/* Find end of the string */
|
||||
End = String + RtlStringLength(String, 0);
|
||||
End = String + StringLength(String, 0);
|
||||
|
||||
/* Skip all trailing whitespaces */
|
||||
while((End != String) && (*End == ' ' || *End == '\n' || *End == '\t' || *End == '\r' || *End == '\v' || *End == '\f'))
|
||||
@@ -686,7 +686,7 @@ RtlTrimRightString(IN PCHAR String)
|
||||
*/
|
||||
XTAPI
|
||||
PCHAR
|
||||
RtlTrimString(IN PCHAR String)
|
||||
RTL::String::TrimString(IN PCHAR String)
|
||||
{
|
||||
return RtlTrimLeftString(RtlTrimRightString(String));
|
||||
return TrimLeftString(TrimRightString(String));
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user