- Convert pure inline assembler .c files to .S files.

- Move SMP IRQ handlers to irqhand.s (at the same place where the UP ones are).

svn path=/trunk/; revision=16428
This commit is contained in:
Filip Navara 2005-07-05 16:40:01 +00:00
parent 7afd05c217
commit 51c604714a
7 changed files with 626 additions and 1042 deletions

View file

@ -0,0 +1,143 @@
/* $Id: interlck.c 15557 2005-05-28 07:26:38Z hbirr $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ex/i386/interlck.c
* PURPOSE: No purpose listed.
*
* PROGRAMMERS: No programmer listed.
*/
#ifdef CONFIG_SMP
#define LOCK lock
#else
#define LOCK
#endif
.global @Exfi386InterlockedIncrementLong@4
@Exfi386InterlockedIncrementLong@4:
LOCK
addl $1,(%ecx)
lahf
andl $0xC000, %eax
ret
.global @Exfi386InterlockedDecrementLong@4
@Exfi386InterlockedDecrementLong@4:
LOCK
subl $1,(%ecx)
lahf
andl $0xC000, %eax
ret
.global @Exfi386InterlockedExchangeUlong@8
@Exfi386InterlockedExchangeUlong@8:
LOCK
xchgl %edx,(%ecx)
movl %edx,%eax
ret
.global _Exi386InterlockedIncrementLong@4
_Exi386InterlockedIncrementLong@4:
movl 4(%esp),%eax
LOCK
addl $1,(%eax)
lahf
andl $0xC000, %eax
ret $4
.global _Exi386InterlockedDecrementLong@4
_Exi386InterlockedDecrementLong@4:
movl 4(%esp),%eax
LOCK
subl $1,(%eax)
lahf
andl $0xC000, %eax
ret $4
.global _Exi386InterlockedExchangeUlong@8
_Exi386InterlockedExchangeUlong@8:
movl 4(%esp),%edx
movl 8(%esp),%eax
LOCK
xchgl %eax,(%edx)
ret $8
.global @InterlockedIncrement@4
@InterlockedIncrement@4:
movl $1,%eax
LOCK
xaddl %eax,(%ecx)
incl %eax
ret
.global @InterlockedDecrement@4
@InterlockedDecrement@4:
movl $-1,%eax
LOCK
xaddl %eax,(%ecx)
decl %eax
ret
.global @InterlockedExchange@8
@InterlockedExchange@8:
LOCK
xchgl %edx,(%ecx)
movl %edx,%eax
ret
.global @InterlockedExchangeAdd@8
@InterlockedExchangeAdd@8:
LOCK
xaddl %edx,(%ecx)
movl %edx,%eax
ret
.global @InterlockedClearBit@8
@InterlockedClearBit@8:
LOCK
btr %edx,(%ecx)
setc %al
ret
.global @InterlockedCompareExchange@12
@InterlockedCompareExchange@12:
movl 4(%esp),%eax
LOCK
cmpxchg %edx,(%ecx)
ret $4
.global @ExfpInterlockedExchange64@8
@ExfpInterlockedExchange64@8:
pushl %ebx
pushl %esi
movl %ecx,%esi
movl (%edx),%ebx
movl 4(%edx),%ecx
1:
movl (%esi),%eax
movl 4(%esi),%edx
LOCK
cmpxchg8b (%esi)
jnz 1b
popl %esi
popl %ebx
ret
.global @ExfInterlockedCompareExchange64@12
@ExfInterlockedCompareExchange64@12:
pushl %ebx
pushl %esi
movl %ecx,%esi
movl (%edx),%ebx
movl 4(%edx),%ecx
movl 12(%esp),%edx
movl (%edx),%eax
movl 4(%edx),%edx
LOCK
cmpxchg8b (%esi)
popl %esi
popl %ebx
ret $4
/* EOF */

View file

@ -1,536 +0,0 @@
/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ex/i386/interlck.c
* PURPOSE: No purpose listed.
*
* PROGRAMMERS: No programmer listed.
*/
#include <ntoskrnl.h>
#ifdef LOCK
#undef LOCK
#endif
#if defined(__GNUC__)
/*
* Do not declare any variable after this point!!
*/
__asm__("\n\t.text\n\t");
#ifdef CONFIG_SMP
#define LOCK "lock ; "
#else
#define LOCK ""
#endif
#elif defined(_MSC_VER)
#ifdef CONFIG_SMP
#define LOCK lock
#else
#define LOCK
#endif
#endif
#if defined(__GNUC__)
/*
* @implemented
*/
INTERLOCKED_RESULT FASTCALL
Exfi386InterlockedIncrementLong(IN PLONG Addend);
__asm__("\n\t.global @Exfi386InterlockedIncrementLong@4\n\t"
"@Exfi386InterlockedIncrementLong@4:\n\t"
LOCK
"addl $1,(%ecx)\n\t"
"lahf\n\t"
"andl $0xC000, %eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
INTERLOCKED_RESULT FASTCALL
Exfi386InterlockedIncrementLong(IN PLONG Addend)
{
__asm LOCK add dword ptr [ecx], 1
__asm lahf
__asm and eax, 0xC000
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
#if defined(__GNUC__)
/*
* @implemented
*/
INTERLOCKED_RESULT FASTCALL
Exfi386InterlockedDecrementLong(IN PLONG Addend);
__asm__("\n\t.global @Exfi386InterlockedDecrementLong@4\n\t"
"@Exfi386InterlockedDecrementLong@4:\n\t"
LOCK
"subl $1,(%ecx)\n\t"
"lahf\n\t"
"andl $0xC000, %eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
INTERLOCKED_RESULT FASTCALL
Exfi386InterlockedDecrementLong(IN PLONG Addend)
{
__asm LOCK sub dword ptr [ecx], 1
__asm lahf
__asm and eax, 0xC000
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
#if defined(__GNUC__)
/*
* @implemented
*/
ULONG FASTCALL
Exfi386InterlockedExchangeUlong(IN PULONG Target,
IN ULONG Value);
__asm__("\n\t.global @Exfi386InterlockedExchangeUlong@8\n\t"
"@Exfi386InterlockedExchangeUlong@8:\n\t"
LOCK
"xchgl %edx,(%ecx)\n\t"
"movl %edx,%eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
ULONG FASTCALL
Exfi386InterlockedExchangeUlong(IN PULONG Target,
IN ULONG Value)
{
__asm LOCK xchg [ecx], edx
__asm mov eax, edx
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
#if defined(__GNUC__)
INTERLOCKED_RESULT STDCALL
Exi386InterlockedIncrementLong(IN PLONG Addend);
__asm__("\n\t.global _Exi386InterlockedIncrementLong@4\n\t"
"_Exi386InterlockedIncrementLong@4:\n\t"
"movl 4(%esp),%eax\n\t"
LOCK
"addl $1,(%eax)\n\t"
"lahf\n\t"
"andl $0xC000, %eax\n\t"
"ret $4\n\t");
#elif defined(_MSC_VER)
__declspec(naked)
INTERLOCKED_RESULT STDCALL
Exi386InterlockedIncrementLong(IN PLONG Addend)
{
__asm mov eax, Addend
__asm LOCK add dword ptr [eax], 1
__asm lahf
__asm and eax, 0xC000
__asm ret 4
}
#else
#error Unknown compiler for inline assembler
#endif
#if defined(__GNUC__)
INTERLOCKED_RESULT STDCALL
Exi386InterlockedDecrementLong(IN PLONG Addend);
__asm__("\n\t.global _Exi386InterlockedDecrementLong@4\n\t"
"_Exi386InterlockedDecrementLong@4:\n\t"
"movl 4(%esp),%eax\n\t"
LOCK
"subl $1,(%eax)\n\t"
"lahf\n\t"
"andl $0xC000, %eax\n\t"
"ret $4\n\t");
#elif defined(_MSC_VER)
__declspec(naked)
INTERLOCKED_RESULT STDCALL
Exi386InterlockedDecrementLong(IN PLONG Addend)
{
__asm mov eax, Addend
__asm LOCK sub dword ptr [eax], 1
__asm lahf
__asm and eax, 0xC000
__asm ret 4
}
#else
#error Unknown compiler for inline assembler
#endif
#if defined(__GNUC__)
ULONG STDCALL
Exi386InterlockedExchangeUlong(IN PULONG Target,
IN ULONG Value);
__asm__("\n\t.global _Exi386InterlockedExchangeUlong@8\n\t"
"_Exi386InterlockedExchangeUlong@8:\n\t"
"movl 4(%esp),%edx\n\t"
"movl 8(%esp),%eax\n\t"
LOCK
"xchgl %eax,(%edx)\n\t"
"ret $8\n\t");
#elif defined(_MSC_VER)
__declspec(naked)
ULONG STDCALL
Exi386InterlockedExchangeUlong(IN PULONG Target,
IN ULONG Value)
{
__asm mov edx, Value
__asm mov eax, Target
__asm LOCK xchg [edx], eax
__asm ret 8
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedIncrement@4
* STDCALL : _InterlockedIncrement@4
*/
#if defined(__GNUC__)
/*
* @implemented
*/
LONG FASTCALL
InterlockedIncrement(PLONG Addend);
/*
* FUNCTION: Increments a caller supplied variable of type LONG as an
* atomic operation
* ARGUMENTS:
* Addend = Points to a variable whose value is to be increment
* RETURNS: The incremented value
*/
__asm__("\n\t.global @InterlockedIncrement@4\n\t"
"@InterlockedIncrement@4:\n\t"
"movl $1,%eax\n\t"
LOCK
"xaddl %eax,(%ecx)\n\t"
"incl %eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
LONG FASTCALL
InterlockedIncrement(PLONG Addend)
{
__asm mov eax, 1
__asm LOCK xadd [ecx], eax
__asm inc eax
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedDecrement@4
* STDCALL : _InterlockedDecrement@4
*/
#if defined(__GNUC__)
/*
* @implemented
*/
LONG FASTCALL
InterlockedDecrement(PLONG Addend);
__asm__("\n\t.global @InterlockedDecrement@4\n\t"
"@InterlockedDecrement@4:\n\t"
"movl $-1,%eax\n\t"
LOCK
"xaddl %eax,(%ecx)\n\t"
"decl %eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
LONG FASTCALL
InterlockedDecrement(PLONG Addend)
{
__asm mov eax, -1
__asm LOCK xadd [ecx], eax
__asm dec eax
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedExchange@8
* STDCALL : _InterlockedExchange@8
*/
#if defined(__GNUC__)
/*
* @implemented
*/
LONG FASTCALL
InterlockedExchange(PLONG Target,
LONG Value);
__asm__("\n\t.global @InterlockedExchange@8\n\t"
"@InterlockedExchange@8:\n\t"
LOCK
"xchgl %edx,(%ecx)\n\t"
"movl %edx,%eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
LONG FASTCALL
InterlockedExchange(PLONG Target,
LONG Value)
{
__asm LOCK xchg [ecx], edx
__asm mov eax, edx
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedExchangeAdd@8
* STDCALL: _InterlockedExchangeAdd@8
*/
#if defined(__GNUC__)
/*
* @implemented
*/
LONG FASTCALL
InterlockedExchangeAdd(PLONG Addend,
LONG Value);
__asm__("\n\t.global @InterlockedExchangeAdd@8\n\t"
"@InterlockedExchangeAdd@8:\n\t"
LOCK
"xaddl %edx,(%ecx)\n\t"
"movl %edx,%eax\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
LONG FASTCALL
InterlockedExchangeAdd(PLONG Addend,
LONG Value)
{
__asm LOCK xadd [ecx], edx
__asm mov eax, edx
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedClearBit@8
* STDCALL: _InterlockedClearBit@8
*/
#if defined(__GNUC__)
/*
* @implemented
*/
UCHAR
FASTCALL
InterlockedClearBit(PLONG Destination,
LONG Bit);
__asm__("\n\t.global @InterlockedClearBit@8\n\t"
"@InterlockedClearBit@8:\n\t"
LOCK
"btr %edx,(%ecx)\n\t"
"setc %al\n\t"
"ret\n\t");
#elif defined(_MSC_VER)
/*
* @implemented
*/
__declspec(naked)
UCHAR
FASTCALL
InterlockedClearBit(PUCHAR Destination,
UCHAR Bit)
{
__asm LOCK btr [ecx], edx
__asm setc al
__asm ret
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedCompareExchange@12
* STDCALL: _InterlockedCompareExchange@12
*/
#if defined(__GNUC__)
LONG FASTCALL
InterlockedCompareExchange(PLONG Destination,
LONG Exchange,
LONG Comperand);
__asm__("\n\t.global @InterlockedCompareExchange@12\n\t"
"@InterlockedCompareExchange@12:\n\t"
"movl 4(%esp),%eax\n\t"
LOCK
"cmpxchg %edx,(%ecx)\n\t"
"ret $4\n\t");
#elif defined(_MSC_VER)
__declspec(naked)
LONG FASTCALL
InterlockedCompareExchange(PLONG Destination,
LONG Exchange,
LONG Comperand)
{
__asm mov eax, Comperand
__asm LOCK cmpxchg [ecx], edx
__asm ret 4
}
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @InterlockedCompareExchange64@8
*/
#if defined(__GNUC__)
LONGLONG FASTCALL
ExfpInterlockedExchange64(LONGLONG volatile * Destination,
PLONGLONG Exchange);
__asm__("\n\t.global @ExfpInterlockedExchange64@8\n\t"
"@ExfpInterlockedExchange64@8:\n\t"
"pushl %ebx\n\t"
"pushl %esi\n\t"
"movl %ecx,%esi\n\t"
"movl (%edx),%ebx\n\t"
"movl 4(%edx),%ecx\n\t"
"\n1:\t"
"movl (%esi),%eax\n\t"
"movl 4(%esi),%edx\n\t"
LOCK
"cmpxchg8b (%esi)\n\t"
"jnz 1b\n\t"
"popl %esi\n\t"
"popl %ebx\n\t"
"ret\n\t");
#else
#error Unknown compiler for inline assembler
#endif
/**********************************************************************
* FASTCALL: @ExfInterlockedCompareExchange@12
*/
#if defined(__GNUC__)
LONGLONG FASTCALL
ExfInterlockedCompareExchange64(LONGLONG volatile * Destination,
PLONGLONG Exchange,
PLONGLONG Comperand);
__asm__("\n\t.global @ExfInterlockedCompareExchange64@12\n\t"
"@ExfInterlockedCompareExchange64@12:\n\t"
"pushl %ebx\n\t"
"pushl %esi\n\t"
"movl %ecx,%esi\n\t"
"movl (%edx),%ebx\n\t"
"movl 4(%edx),%ecx\n\t"
"movl 12(%esp),%edx\n\t"
"movl (%edx),%eax\n\t"
"movl 4(%edx),%edx\n\t"
LOCK
"cmpxchg8b (%esi)\n\t"
"popl %esi\n\t"
"popl %ebx\n\t"
"ret $4\n\t");
#else
#error Unknown compiler for inline assembler
#endif
/* EOF */

View file

@ -0,0 +1,22 @@
/* $Id: brkpoint.c 15164 2005-05-09 01:38:29Z sedwards $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/i386/brkpoint.c
* PURPOSE: Handles breakpoints
*
* PROGRAMMERS: No programmer listed.
*/
.global _DbgBreakPoint@0
_DbgBreakPoint@0:
.global _DbgBreakPointNoBugCheck@0
_DbgBreakPointNoBugCheck@0:
int $3
ret
.global _DbgBreakPointWithStatus@4
_DbgBreakPointWithStatus@4:
mov 0x4(%esp), %eax
int $3
ret $4

View file

@ -1,59 +0,0 @@
/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/i386/brkpoint.c
* PURPOSE: Handles breakpoints
*
* PROGRAMMERS: No programmer listed.
*/
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
#include <internal/debug.h>
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
VOID STDCALL
DbgBreakPoint(VOID)
{
#if defined(__GNUC__)
__asm__("int $3\n\t");
#elif defined(_MSC_VER)
__asm int 3;
#else
#error Unknown compiler for inline assembler
#endif
}
/*
* @implemented
*/
#if defined(__GNUC__)
__asm__(".globl _DbgBreakPointNoBugCheck@0\n\t"
"_DbgBreakPointNoBugCheck@0:\n\t"
"int $3\n\t"
"ret\n\t");
#endif
/*
* @implemented
*/
VOID STDCALL
DbgBreakPointWithStatus(ULONG Status)
{
#if defined(__GNUC__)
__asm__("mov %0, %%eax\n\t"
"int $3\n\t"
::"m"(Status));
#elif defined(_MSC_VER)
__asm mov eax, Status
__asm int 3;
#else
#error Unknown compiler for inline assembler
#endif
}

View file

@ -26,73 +26,28 @@
/* GLOBALS *****************************************************************/
/* Interrupt handler list */
#ifdef CONFIG_SMP
#define __STR(x) #x
#define STR(x) __STR(x)
#define INT_NAME(intnum) _KiUnexpectedInterrupt##intnum
#define INT_NAME2(intnum) KiUnexpectedInterrupt##intnum
#define BUILD_COMMON_INTERRUPT_HANDLER() \
__asm__( \
"_KiCommonInterrupt:\n\t" \
"cld\n\t" \
"pushl %ds\n\t" \
"pushl %es\n\t" \
"pushl %fs\n\t" \
"pushl %gs\n\t" \
"movl $0xceafbeef,%eax\n\t" \
"pushl %eax\n\t" \
"movl $" STR(KERNEL_DS) ",%eax\n\t" \
"movl %eax,%ds\n\t" \
"movl %eax,%es\n\t" \
"movl %eax,%gs\n\t" \
"movl $" STR(PCR_SELECTOR) ",%eax\n\t" \
"movl %eax,%fs\n\t" \
"pushl %esp\n\t" \
"pushl %ebx\n\t" \
"call _KiInterruptDispatch\n\t" \
"addl $0xC, %esp\n\t" \
"popl %gs\n\t" \
"popl %fs\n\t" \
"popl %es\n\t" \
"popl %ds\n\t" \
"popa\n\t" \
"iret\n\t");
#define BUILD_INTERRUPT_HANDLER(intnum) \
VOID INT_NAME2(intnum)(VOID); \
__asm__( \
STR(INT_NAME(intnum)) ":\n\t" \
"pusha\n\t" \
"movl $0x" STR(intnum) ",%ebx\n\t" \
"jmp _KiCommonInterrupt");
VOID INT_NAME2(intnum)(VOID);
/* Interrupt handlers and declarations */
#define B(x,y) \
#define D(x,y) \
BUILD_INTERRUPT_HANDLER(x##y)
#define B16(x) \
B(x,0) B(x,1) B(x,2) B(x,3) \
B(x,4) B(x,5) B(x,6) B(x,7) \
B(x,8) B(x,9) B(x,A) B(x,B) \
B(x,C) B(x,D) B(x,E) B(x,F)
#define D16(x) \
D(x,0) D(x,1) D(x,2) D(x,3) \
D(x,4) D(x,5) D(x,6) D(x,7) \
D(x,8) D(x,9) D(x,A) D(x,B) \
D(x,C) D(x,D) D(x,E) D(x,F)
BUILD_COMMON_INTERRUPT_HANDLER()
B16(3) B16(4) B16(5) B16(6)
B16(7) B16(8) B16(9) B16(A)
B16(B) B16(C) B16(D) B16(E)
B16(F)
#undef B
#undef B16
/* Interrupt handler list */
D16(3) D16(4) D16(5) D16(6)
D16(7) D16(8) D16(9) D16(A)
D16(B) D16(C) D16(D) D16(E)
D16(F)
#define L(x,y) \
(ULONG)& INT_NAME2(x##y)
@ -111,45 +66,47 @@ static ULONG irq_handler[ROUND_UP(NR_IRQS, 16)] = {
#undef L
#undef L16
#undef D
#undef D16
#else /* CONFIG_SMP */
void irq_handler_0(void);
void irq_handler_1(void);
void irq_handler_2(void);
void irq_handler_3(void);
void irq_handler_4(void);
void irq_handler_5(void);
void irq_handler_6(void);
void irq_handler_7(void);
void irq_handler_8(void);
void irq_handler_9(void);
void irq_handler_10(void);
void irq_handler_11(void);
void irq_handler_12(void);
void irq_handler_13(void);
void irq_handler_14(void);
void irq_handler_15(void);
void irq_handler_0(void);
void irq_handler_1(void);
void irq_handler_2(void);
void irq_handler_3(void);
void irq_handler_4(void);
void irq_handler_5(void);
void irq_handler_6(void);
void irq_handler_7(void);
void irq_handler_8(void);
void irq_handler_9(void);
void irq_handler_10(void);
void irq_handler_11(void);
void irq_handler_12(void);
void irq_handler_13(void);
void irq_handler_14(void);
void irq_handler_15(void);
static unsigned int irq_handler[NR_IRQS]=
{
(int)&irq_handler_0,
(int)&irq_handler_1,
(int)&irq_handler_2,
(int)&irq_handler_3,
(int)&irq_handler_4,
(int)&irq_handler_5,
(int)&irq_handler_6,
(int)&irq_handler_7,
(int)&irq_handler_8,
(int)&irq_handler_9,
(int)&irq_handler_10,
(int)&irq_handler_11,
(int)&irq_handler_12,
(int)&irq_handler_13,
(int)&irq_handler_14,
(int)&irq_handler_15,
};
{
(int)&irq_handler_0,
(int)&irq_handler_1,
(int)&irq_handler_2,
(int)&irq_handler_3,
(int)&irq_handler_4,
(int)&irq_handler_5,
(int)&irq_handler_6,
(int)&irq_handler_7,
(int)&irq_handler_8,
(int)&irq_handler_9,
(int)&irq_handler_10,
(int)&irq_handler_11,
(int)&irq_handler_12,
(int)&irq_handler_13,
(int)&irq_handler_14,
(int)&irq_handler_15,
};
#endif /* CONFIG_SMP */

View file

@ -1,6 +1,61 @@
#include <ndk/i386/segment.h>
#include <../hal/halx86/include/halirq.h>
#ifdef CONFIG_SMP
#define BUILD_INTERRUPT_HANDLER(intnum) \
.global _KiUnexpectedInterrupt##intnum; \
_KiUnexpectedInterrupt##intnum:; \
pusha; \
movl $0x##intnum, %ebx; \
jmp _KiCommonInterrupt;
/* Interrupt handlers and declarations */
#define B(x,y) \
BUILD_INTERRUPT_HANDLER(x##y)
#define B16(x) \
B(x,0) B(x,1) B(x,2) B(x,3) \
B(x,4) B(x,5) B(x,6) B(x,7) \
B(x,8) B(x,9) B(x,A) B(x,B) \
B(x,C) B(x,D) B(x,E) B(x,F)
_KiCommonInterrupt:
cld
pushl %ds
pushl %es
pushl %fs
pushl %gs
movl $0xceafbeef,%eax
pushl %eax
movl $KERNEL_DS,%eax
movl %eax,%ds
movl %eax,%es
movl %eax,%gs
movl $PCR_SELECTOR,%eax
movl %eax,%fs
pushl %esp
pushl %ebx
call _KiInterruptDispatch
addl $0xC, %esp
popl %gs
popl %fs
popl %es
popl %ds
popa
iret
B16(3) B16(4) B16(5) B16(6)
B16(7) B16(8) B16(9) B16(A)
B16(B) B16(C) B16(D) B16(E)
B16(F)
#undef B
#undef B16
#else /* CONFIG_SMP */
.global _irq_handler_0
_irq_handler_0:
cld
@ -432,3 +487,5 @@ _irq_handler_15:
popl %ds
popa
iret
#endif /* CONFIG_SMP */

View file

@ -1,355 +1,355 @@
<module name="ntoskrnl" type="kernel" installbase="system32" installname="ntoskrnl.exe">
<bootstrap base="reactos" />
<importlibrary definition="ntoskrnl.def" />
<define name="_SEH_NO_NATIVE_NLG" />
<define name="_DISABLE_TIDENTS" />
<define name="__NTOSKRNL__" />
<define name="_NTOSKRNL_" />
<define name="__NO_CTYPE_INLINES" />
<define name="__USE_W32API" />
<include base="kjs">include</include>
<include base="ntoskrnl">include</include>
<library>csq</library>
<library>hal</library>
<library>kjs</library>
<library>pseh</library>
<library>rtl</library>
<library>rosrtl</library>
<library>rossym</library>
<library>string</library>
<library>wdmguid</library>
<directory name="include">
<pch>ntoskrnl.h</pch>
</directory>
<directory name="ke">
<if property="ARCH" value="i386">
<directory name="i386">
<file first="true">main.S</file>
<file>bios.c</file>
<file>brkpoint.c</file>
<file>ctxswitch.S</file>
<file>exp.c</file>
<file>fpu.c</file>
<file>gdt.c</file>
<file>idt.c</file>
<file>irq.c</file>
<file>irqhand.s</file>
<file>kernel.c</file>
<file>ldt.c</file>
<file>stkswitch.S</file>
<file>syscall.S</file>
<file>thread.c</file>
<file>tlbflush.S</file>
<file>trap.s</file>
<file>tss.c</file>
<file>usercall.S</file>
<file>usertrap.c</file>
<file>v86m.c</file>
<file>v86m_sup.S</file>
<file>vdm.c</file>
</directory>
</if>
<file>apc.c</file>
<file>bug.c</file>
<file>catch.c</file>
<file>clock.c</file>
<file>device.c</file>
<file>dpc.c</file>
<file>event.c</file>
<file>gate.c</file>
<file>gmutex.c</file>
<file>ipi.c</file>
<file>kqueue.c</file>
<file>kthread.c</file>
<file>main.c</file>
<file>mutex.c</file>
<file>process.c</file>
<file>profile.c</file>
<file>queue.c</file>
<file>sem.c</file>
<file>spinlock.c</file>
<file>timer.c</file>
<file>usercall.c</file>
<file>wait.c</file>
</directory>
<directory name="cc">
<file>cacheman.c</file>
<file>copy.c</file>
<file>fs.c</file>
<file>mdl.c</file>
<file>pin.c</file>
<file>view.c</file>
</directory>
<directory name="cm">
<file>import.c</file>
<file>ntfunc.c</file>
<file>regfile.c</file>
<file>registry.c</file>
<file>regobj.c</file>
</directory>
<directory name="kdbg">
<if property="ARCH" value="i386">
<directory name="i386">
<if property="KDBG" value="1">
<group>
<file>i386-dis.c</file>
<file>kdb_help.S</file>
<file>longjmp.S</file>
<file>setjmp.S</file>
</group>
</if>
</directory>
</if>
<if property="KDBG" value="1">
<file>kdb.c</file>
<file>kdb_cli.c</file>
<file>kdb_expr.c</file>
<file>kdb_keyboard.c</file>
<file>kdb_serial.c</file>
<file>kdb_string.c</file>
</if>
<if property="DBG_OR_KDBG" value="true">
<file>kdb_symbols.c</file>
</if>
</directory>
<directory name="dbgk">
<file>dbgkutil.c</file>
<file>debug.c</file>
</directory>
<directory name="ex">
<if property="ARCH" value="i386">
<directory name="i386">
<file>interlck.c</file>
</directory>
</if>
<file>callback.c</file>
<file>dbgctrl.c</file>
<file>error.c</file>
<file>event.c</file>
<file>evtpair.c</file>
<file>fmutex.c</file>
<file>handle.c</file>
<file>init.c</file>
<file>interlck.c</file>
<file>list.c</file>
<file>lookas.c</file>
<file>mutant.c</file>
<file>power.c</file>
<file>profile.c</file>
<file>resource.c</file>
<file>rundown.c</file>
<file>sem.c</file>
<file>synch.c</file>
<file>sysinfo.c</file>
<file>time.c</file>
<file>timer.c</file>
<file>util.c</file>
<file>uuid.c</file>
<file>win32k.c</file>
<file>work.c</file>
<file>zone.c</file>
<file>zw.S</file>
</directory>
<directory name="fs">
<file>context.c</file>
<file>fastio.c</file>
<file>filelock.c</file>
<file>mcb.c</file>
<file>name.c</file>
<file>notify.c</file>
<file>oplock.c</file>
<file>pool.c</file>
<file>tunnel.c</file>
<file>unc.c</file>
<file>util.c</file>
</directory>
<directory name="inbv">
<file>inbv.c</file>
</directory>
<directory name="io">
<file>adapter.c</file>
<file>arcname.c</file>
<file>bootlog.c</file>
<file>controller.c</file>
<file>device.c</file>
<file>deviface.c</file>
<file>disk.c</file>
<file>driver.c</file>
<file>efi.c</file>
<file>error.c</file>
<file>event.c</file>
<file>file.c</file>
<file>fs.c</file>
<file>iocomp.c</file>
<file>iomgr.c</file>
<file>iowork.c</file>
<file>irp.c</file>
<file>irq.c</file>
<file>mdl.c</file>
<file>plugplay.c</file>
<file>pnpdma.c</file>
<file>pnpmgr.c</file>
<file>pnpnotify.c</file>
<file>pnpreport.c</file>
<file>pnproot.c</file>
<file>rawfs.c</file>
<file>remlock.c</file>
<file>resource.c</file>
<file>share.c</file>
<file>symlink.c</file>
<file>timer.c</file>
<file>vpb.c</file>
<file>wmi.c</file>
</directory>
<directory name="kd">
<directory name="wrappers">
<if property="DBG" value="1">
<file>bochs.c</file>
<file>gdbstub.c</file>
</if>
</directory>
<file>kdinit.c</file>
<file>kdio.c</file>
<file>kdmain.c</file>
</directory>
<directory name="ldr">
<file>init.c</file>
<file>loader.c</file>
<file>resource.c</file>
<file>rtl.c</file>
<file>sysdll.c</file>
<file>userldr.c</file>
</directory>
<directory name="lpc">
<file>close.c</file>
<file>complete.c</file>
<file>connect.c</file>
<file>create.c</file>
<file>listen.c</file>
<file>port.c</file>
<file>query.c</file>
<file>queue.c</file>
<file>receive.c</file>
<file>reply.c</file>
<file>send.c</file>
</directory>
<directory name="mm">
<if property="ARCH" value="i386">
<directory name="i386">
<file>memsafe.s</file>
<file>page.c</file>
<file>pfault.c</file>
</directory>
</if>
<file>anonmem.c</file>
<file>aspace.c</file>
<file>balance.c</file>
<file>cont.c</file>
<file>drvlck.c</file>
<file>elf32.c</file>
<file>elf64.c</file>
<file>freelist.c</file>
<file>iospace.c</file>
<file>kmap.c</file>
<file>marea.c</file>
<file>mdl.c</file>
<file>mm.c</file>
<file>process.c</file>
<file>mminit.c</file>
<file>mpw.c</file>
<file>ncache.c</file>
<file>npool.c</file>
<file>pagefile.c</file>
<file>pageop.c</file>
<file>pager.c</file>
<file>pagfault.c</file>
<file>paging.c</file>
<file>pe.c</file>
<file>physical.c</file>
<file>pool.c</file>
<file>ppool.c</file>
<file>region.c</file>
<file>rmap.c</file>
<file>section.c</file>
<file>verifier.c</file>
<file>virtual.c</file>
<file>wset.c</file>
</directory>
<directory name="ob">
<file>dirobj.c</file>
<file>handle.c</file>
<file>namespc.c</file>
<file>ntobj.c</file>
<file>object.c</file>
<file>sdcache.c</file>
<file>security.c</file>
<file>symlink.c</file>
<file>wait.c</file>
</directory>
<directory name="po">
<file>power.c</file>
</directory>
<directory name="ps">
<if property="ARCH" value="i386">
<directory name="i386">
<file>continue.c</file>
</directory>
</if>
<file>cid.c</file>
<file>debug.c</file>
<file>idle.c</file>
<file>job.c</file>
<file>kill.c</file>
<file>locale.c</file>
<file>notify.c</file>
<file>process.c</file>
<file>psmgr.c</file>
<file>query.c</file>
<file>quota.c</file>
<file>security.c</file>
<file>suspend.c</file>
<file>thread.c</file>
<file>win32.c</file>
</directory>
<directory name="rtl">
<if property="ARCH" value="i386">
<directory name="i386">
<file>exception.c</file>
<file>seh.s</file>
</directory>
</if>
<file>atom.c</file>
<file>capture.c</file>
<file>ctype.c</file>
<file>debug.c</file>
<file>libsupp.c</file>
<file>message.c</file>
<file>misc.c</file>
<file>nls.c</file>
<file>purecall.c</file>
<file>rangelist.c</file>
<file>regio.c</file>
<file>sprintf.c</file>
<file>stdlib.c</file>
<file>string.c</file>
<file>strtok.c</file>
<file>swprintf.c</file>
<file>wstring.c</file>
</directory>
<directory name="se">
<file>access.c</file>
<file>acl.c</file>
<file>audit.c</file>
<file>lsa.c</file>
<file>luid.c</file>
<file>priv.c</file>
<file>sd.c</file>
<file>semgr.c</file>
<file>sid.c</file>
<file>token.c</file>
</directory>
<file>ntoskrnl.rc</file>
<linkerflag>-nostartfiles</linkerflag>
<linkerflag>-nostdlib</linkerflag>
<linkerflag>-lgcc</linkerflag>
</module>
<module name="ntoskrnl" type="kernel" installbase="system32" installname="ntoskrnl.exe">
<bootstrap base="reactos" />
<importlibrary definition="ntoskrnl.def" />
<define name="_SEH_NO_NATIVE_NLG" />
<define name="_DISABLE_TIDENTS" />
<define name="__NTOSKRNL__" />
<define name="_NTOSKRNL_" />
<define name="__NO_CTYPE_INLINES" />
<define name="__USE_W32API" />
<include base="kjs">include</include>
<include base="ntoskrnl">include</include>
<library>csq</library>
<library>hal</library>
<library>kjs</library>
<library>pseh</library>
<library>rtl</library>
<library>rosrtl</library>
<library>rossym</library>
<library>string</library>
<library>wdmguid</library>
<directory name="include">
<pch>ntoskrnl.h</pch>
</directory>
<directory name="ke">
<if property="ARCH" value="i386">
<directory name="i386">
<file first="true">main.S</file>
<file>bios.c</file>
<file>brkpoint.S</file>
<file>ctxswitch.S</file>
<file>exp.c</file>
<file>fpu.c</file>
<file>gdt.c</file>
<file>idt.c</file>
<file>irq.c</file>
<file>irqhand.s</file>
<file>kernel.c</file>
<file>ldt.c</file>
<file>stkswitch.S</file>
<file>syscall.S</file>
<file>thread.c</file>
<file>tlbflush.S</file>
<file>trap.s</file>
<file>tss.c</file>
<file>usercall.S</file>
<file>usertrap.c</file>
<file>v86m.c</file>
<file>v86m_sup.S</file>
<file>vdm.c</file>
</directory>
</if>
<file>apc.c</file>
<file>bug.c</file>
<file>catch.c</file>
<file>clock.c</file>
<file>device.c</file>
<file>dpc.c</file>
<file>event.c</file>
<file>gate.c</file>
<file>gmutex.c</file>
<file>ipi.c</file>
<file>kqueue.c</file>
<file>kthread.c</file>
<file>main.c</file>
<file>mutex.c</file>
<file>process.c</file>
<file>profile.c</file>
<file>queue.c</file>
<file>sem.c</file>
<file>spinlock.c</file>
<file>timer.c</file>
<file>usercall.c</file>
<file>wait.c</file>
</directory>
<directory name="cc">
<file>cacheman.c</file>
<file>copy.c</file>
<file>fs.c</file>
<file>mdl.c</file>
<file>pin.c</file>
<file>view.c</file>
</directory>
<directory name="cm">
<file>import.c</file>
<file>ntfunc.c</file>
<file>regfile.c</file>
<file>registry.c</file>
<file>regobj.c</file>
</directory>
<directory name="kdbg">
<if property="ARCH" value="i386">
<directory name="i386">
<if property="KDBG" value="1">
<group>
<file>i386-dis.c</file>
<file>kdb_help.S</file>
<file>longjmp.S</file>
<file>setjmp.S</file>
</group>
</if>
</directory>
</if>
<if property="KDBG" value="1">
<file>kdb.c</file>
<file>kdb_cli.c</file>
<file>kdb_expr.c</file>
<file>kdb_keyboard.c</file>
<file>kdb_serial.c</file>
<file>kdb_string.c</file>
</if>
<if property="DBG_OR_KDBG" value="true">
<file>kdb_symbols.c</file>
</if>
</directory>
<directory name="dbgk">
<file>dbgkutil.c</file>
<file>debug.c</file>
</directory>
<directory name="ex">
<if property="ARCH" value="i386">
<directory name="i386">
<file>interlck.S</file>
</directory>
</if>
<file>callback.c</file>
<file>dbgctrl.c</file>
<file>error.c</file>
<file>event.c</file>
<file>evtpair.c</file>
<file>fmutex.c</file>
<file>handle.c</file>
<file>init.c</file>
<file>interlck.c</file>
<file>list.c</file>
<file>lookas.c</file>
<file>mutant.c</file>
<file>power.c</file>
<file>profile.c</file>
<file>resource.c</file>
<file>rundown.c</file>
<file>sem.c</file>
<file>synch.c</file>
<file>sysinfo.c</file>
<file>time.c</file>
<file>timer.c</file>
<file>util.c</file>
<file>uuid.c</file>
<file>win32k.c</file>
<file>work.c</file>
<file>zone.c</file>
<file>zw.S</file>
</directory>
<directory name="fs">
<file>context.c</file>
<file>fastio.c</file>
<file>filelock.c</file>
<file>mcb.c</file>
<file>name.c</file>
<file>notify.c</file>
<file>oplock.c</file>
<file>pool.c</file>
<file>tunnel.c</file>
<file>unc.c</file>
<file>util.c</file>
</directory>
<directory name="inbv">
<file>inbv.c</file>
</directory>
<directory name="io">
<file>adapter.c</file>
<file>arcname.c</file>
<file>bootlog.c</file>
<file>controller.c</file>
<file>device.c</file>
<file>deviface.c</file>
<file>disk.c</file>
<file>driver.c</file>
<file>efi.c</file>
<file>error.c</file>
<file>event.c</file>
<file>file.c</file>
<file>fs.c</file>
<file>iocomp.c</file>
<file>iomgr.c</file>
<file>iowork.c</file>
<file>irp.c</file>
<file>irq.c</file>
<file>mdl.c</file>
<file>plugplay.c</file>
<file>pnpdma.c</file>
<file>pnpmgr.c</file>
<file>pnpnotify.c</file>
<file>pnpreport.c</file>
<file>pnproot.c</file>
<file>rawfs.c</file>
<file>remlock.c</file>
<file>resource.c</file>
<file>share.c</file>
<file>symlink.c</file>
<file>timer.c</file>
<file>vpb.c</file>
<file>wmi.c</file>
</directory>
<directory name="kd">
<directory name="wrappers">
<if property="DBG" value="1">
<file>bochs.c</file>
<file>gdbstub.c</file>
</if>
</directory>
<file>kdinit.c</file>
<file>kdio.c</file>
<file>kdmain.c</file>
</directory>
<directory name="ldr">
<file>init.c</file>
<file>loader.c</file>
<file>resource.c</file>
<file>rtl.c</file>
<file>sysdll.c</file>
<file>userldr.c</file>
</directory>
<directory name="lpc">
<file>close.c</file>
<file>complete.c</file>
<file>connect.c</file>
<file>create.c</file>
<file>listen.c</file>
<file>port.c</file>
<file>query.c</file>
<file>queue.c</file>
<file>receive.c</file>
<file>reply.c</file>
<file>send.c</file>
</directory>
<directory name="mm">
<if property="ARCH" value="i386">
<directory name="i386">
<file>memsafe.s</file>
<file>page.c</file>
<file>pfault.c</file>
</directory>
</if>
<file>anonmem.c</file>
<file>aspace.c</file>
<file>balance.c</file>
<file>cont.c</file>
<file>drvlck.c</file>
<file>elf32.c</file>
<file>elf64.c</file>
<file>freelist.c</file>
<file>iospace.c</file>
<file>kmap.c</file>
<file>marea.c</file>
<file>mdl.c</file>
<file>mm.c</file>
<file>process.c</file>
<file>mminit.c</file>
<file>mpw.c</file>
<file>ncache.c</file>
<file>npool.c</file>
<file>pagefile.c</file>
<file>pageop.c</file>
<file>pager.c</file>
<file>pagfault.c</file>
<file>paging.c</file>
<file>pe.c</file>
<file>physical.c</file>
<file>pool.c</file>
<file>ppool.c</file>
<file>region.c</file>
<file>rmap.c</file>
<file>section.c</file>
<file>verifier.c</file>
<file>virtual.c</file>
<file>wset.c</file>
</directory>
<directory name="ob">
<file>dirobj.c</file>
<file>handle.c</file>
<file>namespc.c</file>
<file>ntobj.c</file>
<file>object.c</file>
<file>sdcache.c</file>
<file>security.c</file>
<file>symlink.c</file>
<file>wait.c</file>
</directory>
<directory name="po">
<file>power.c</file>
</directory>
<directory name="ps">
<if property="ARCH" value="i386">
<directory name="i386">
<file>continue.c</file>
</directory>
</if>
<file>cid.c</file>
<file>debug.c</file>
<file>idle.c</file>
<file>job.c</file>
<file>kill.c</file>
<file>locale.c</file>
<file>notify.c</file>
<file>process.c</file>
<file>psmgr.c</file>
<file>query.c</file>
<file>quota.c</file>
<file>security.c</file>
<file>suspend.c</file>
<file>thread.c</file>
<file>win32.c</file>
</directory>
<directory name="rtl">
<if property="ARCH" value="i386">
<directory name="i386">
<file>exception.c</file>
<file>seh.s</file>
</directory>
</if>
<file>atom.c</file>
<file>capture.c</file>
<file>ctype.c</file>
<file>debug.c</file>
<file>libsupp.c</file>
<file>message.c</file>
<file>misc.c</file>
<file>nls.c</file>
<file>purecall.c</file>
<file>rangelist.c</file>
<file>regio.c</file>
<file>sprintf.c</file>
<file>stdlib.c</file>
<file>string.c</file>
<file>strtok.c</file>
<file>swprintf.c</file>
<file>wstring.c</file>
</directory>
<directory name="se">
<file>access.c</file>
<file>acl.c</file>
<file>audit.c</file>
<file>lsa.c</file>
<file>luid.c</file>
<file>priv.c</file>
<file>sd.c</file>
<file>semgr.c</file>
<file>sid.c</file>
<file>token.c</file>
</directory>
<file>ntoskrnl.rc</file>
<linkerflag>-nostartfiles</linkerflag>
<linkerflag>-nostdlib</linkerflag>
<linkerflag>-lgcc</linkerflag>
</module>