From: Pierre Schweitzer Date: Thu, 10 Mar 2011 21:02:21 +0000 (+0000) Subject: [NTOSKRNL] X-Git-Tag: ReactOS-0.3.13~31 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=81f9d934ffcd202e60b1880a6e819a55ab91d430 [NTOSKRNL] Implemented FstubTranslatorNull, FstubTranslateResource, FstubTranslateRequirement, xHalGetInterruptTranslator. In other words: please welcome interrupt translator in ReactOS. It's not used yet. svn path=/trunk/; revision=51012 --- diff --git a/reactos/ntoskrnl/fstub/halstub.c b/reactos/ntoskrnl/fstub/halstub.c index 38eec69b014..a449f0b6a88 100644 --- a/reactos/ntoskrnl/fstub/halstub.c +++ b/reactos/ntoskrnl/fstub/halstub.c @@ -32,7 +32,7 @@ HAL_DISPATCH HalDispatchTable = (pHalInitPnpDriver)NULL, (pHalInitPowerManagement)NULL, (pHalGetDmaAdapter) NULL, - (pHalGetInterruptTranslator)NULL, + xHalGetInterruptTranslator, (pHalStartMirroring)NULL, (pHalEndMirroring)NULL, (pHalMirrorPhysicalMemory)NULL, diff --git a/reactos/ntoskrnl/fstub/translate.c b/reactos/ntoskrnl/fstub/translate.c new file mode 100644 index 00000000000..b9d37d266cd --- /dev/null +++ b/reactos/ntoskrnl/fstub/translate.c @@ -0,0 +1,189 @@ +/* +* PROJECT: ReactOS Kernel +* LICENSE: GPL - See COPYING in the top level directory +* FILE: ntoskrnl/fstub/translate.c +* PURPOSE: Interrupt Translator Routines +* PROGRAMMERS: Pierre Schweitzer (pierre.schweitzer@reactos.org) +*/ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +#define HAL_IRQ_TRANSLATOR_VERSION 0x0 + +/* PRIVATE FUNCTIONS *********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +FstubTranslatorNull(PVOID Context) +{ + PAGED_CODE(); + + /* Do nothing */ + return; +} + +/* + * @implemented + */ +NTSTATUS +NTAPI +FstubTranslateResource(IN OUT PVOID Context OPTIONAL, + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + IN RESOURCE_TRANSLATION_DIRECTION Direction, + IN ULONG AlternativesCount OPTIONAL, + IN IO_RESOURCE_DESCRIPTOR Alternatives[], + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target) +{ + INT k; + KIRQL Irql; + KAFFINITY Affinity; + ULONG MinimumVector, Vector; + PIO_RESOURCE_DESCRIPTOR Alternative; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + PAGED_CODE(); + + ASSERT(Source->Type == CmResourceTypeInterrupt); + + /* Copy common information */ + Target->Type = Source->Type; + Target->ShareDisposition = Source->ShareDisposition; + Target->Flags = Source->Flags; + + if (Direction == TranslateChildToParent) + { + /* Get IRQL, affinity & system vector for the device vector */ + Target->u.Interrupt.Vector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, + Source->u.Interrupt.Vector, + Source->u.Interrupt.Vector, + &Irql, &Affinity); + Target->u.Interrupt.Level = Irql; + Target->u.Interrupt.Affinity = Affinity; + Status = STATUS_TRANSLATION_COMPLETE; + } + else if (Direction == TranslateParentToChild) + { + /* Browse all the resources */ + for (k = 0; k < AlternativesCount; k++) + { + Alternative = &(Alternatives[k]); + + ASSERT(Alternative->Type == CmResourceTypeInterrupt); + + /* Try to find the device vector, proceeding by trial & error + * We try a vector, and translate it + */ + MinimumVector = Alternative->u.Interrupt.MinimumVector; + while (MinimumVector <= Alternative->u.Interrupt.MaximumVector) + { + /* Translate the vector */ + Vector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, + MinimumVector, + MinimumVector, + &Irql, &Affinity); + + /* If the translated vector is matching the given translated vector */ + if (Vector == Source->u.Interrupt.Vector) + { + /* We are done, send back device vector */ + Target->u.Interrupt.Affinity = -1; + Target->u.Interrupt.Vector = MinimumVector; + Target->u.Interrupt.Level = MinimumVector; + + return STATUS_SUCCESS; + } + + MinimumVector++; + } + } + } + + return Status; +} + +/* + * @implemented + */ +NTSTATUS +NTAPI +FstubTranslateRequirement(IN OUT PVOID Context OPTIONAL, + IN PIO_RESOURCE_DESCRIPTOR Source, + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PULONG TargetCount, + OUT PIO_RESOURCE_DESCRIPTOR *Target) +{ + KIRQL Irql; + KAFFINITY Affinity; + PAGED_CODE(); + + ASSERT(Source->Type == CmResourceTypeInterrupt); + + /* Allocate output buffer */ + *Target = ExAllocatePoolWithTag(PagedPool, sizeof(IO_RESOURCE_DESCRIPTOR), 'btsF'); + if (!*Target) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Zero & set out count to 1 */ + RtlZeroMemory(*Target, sizeof(IO_RESOURCE_DESCRIPTOR)); + *TargetCount = 1; + + /* Translate minimum interrupt vector */ + (*Target)->u.Interrupt.MinimumVector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, + Source->u.Interrupt.MinimumVector, + Source->u.Interrupt.MinimumVector, + &Irql, &Affinity); + + /* Translate maximum interrupt vector */ + (*Target)->u.Interrupt.MaximumVector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0, + Source->u.Interrupt.MaximumVector, + Source->u.Interrupt.MaximumVector, + &Irql, &Affinity); + + return STATUS_TRANSLATION_COMPLETE; +} + +/* + * @implemented + */ +NTSTATUS +NTAPI +xHalGetInterruptTranslator(IN INTERFACE_TYPE ParentInterfaceType, + IN ULONG ParentBusNumber, + IN INTERFACE_TYPE BridgeInterfaceType, + IN USHORT Size, + IN USHORT Version, + OUT PTRANSLATOR_INTERFACE Translator, + OUT PULONG BridgeBusNumber) +{ + PAGED_CODE(); + + ASSERT(Version == HAL_IRQ_TRANSLATOR_VERSION); + ASSERT(Size >= sizeof(TRANSLATOR_INTERFACE)); + + /* Only (E)ISA interfaces are supported */ + if (BridgeInterfaceType == Internal || BridgeInterfaceType >= MicroChannel) + { + return STATUS_NOT_IMPLEMENTED; + } + + /* Fill in output struct */ + Translator->Size = sizeof(TRANSLATOR_INTERFACE); + Translator->Version = HAL_IRQ_TRANSLATOR_VERSION; + /* In case caller set interface to undefined, faulty it to ISA */ + Translator->Context = (PVOID)((BridgeInterfaceType == InterfaceTypeUndefined) ? Isa : BridgeInterfaceType); + Translator->InterfaceReference = FstubTranslatorNull; + Translator->InterfaceDereference = FstubTranslatorNull; + Translator->TranslateResources = FstubTranslateResource; + Translator->TranslateResourceRequirements = FstubTranslateRequirement; + + return STATUS_SUCCESS; +} diff --git a/reactos/ntoskrnl/include/internal/hal.h b/reactos/ntoskrnl/include/internal/hal.h index 47b76beee48..f465ad71134 100644 --- a/reactos/ntoskrnl/include/internal/hal.h +++ b/reactos/ntoskrnl/include/internal/hal.h @@ -71,6 +71,16 @@ xHalVectorToIDTEntry( IN ULONG Vector ); +NTSTATUS +NTAPI +xHalGetInterruptTranslator(IN INTERFACE_TYPE ParentInterfaceType, + IN ULONG ParentBusNumber, + IN INTERFACE_TYPE BridgeInterfaceType, + IN USHORT Size, + IN USHORT Version, + OUT PTRANSLATOR_INTERFACE Translator, + OUT PULONG BridgeBusNumber); + // // Various offsets in the boot record diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 5d01e44447b..12882439405 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -285,6 +285,7 @@ disksup.c fstubex.c halstub.c + translate.c inbv.c