ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

translate.c
Go to the documentation of this file.
00001 /*
00002 * PROJECT:         ReactOS Kernel
00003 * LICENSE:         GPL - See COPYING in the top level directory
00004 * FILE:            ntoskrnl/fstub/translate.c
00005 * PURPOSE:         Interrupt Translator Routines
00006 * PROGRAMMERS:     Pierre Schweitzer (pierre.schweitzer@reactos.org)
00007 */
00008 
00009 /* INCLUDES ******************************************************************/
00010 
00011 #include <ntoskrnl.h>
00012 #define NDEBUG
00013 #include <debug.h>
00014 
00015 /* PRIVATE FUNCTIONS *********************************************************/
00016 
00017 /*
00018  * @implemented
00019  */
00020 VOID
00021 NTAPI
00022 FstubTranslatorNull(PVOID Context)
00023 {
00024     PAGED_CODE();
00025 
00026     /* Do nothing */
00027     return;
00028 }
00029 
00030 /*
00031  * @implemented
00032  */
00033 NTSTATUS
00034 NTAPI
00035 FstubTranslateResource(IN OUT PVOID Context OPTIONAL,
00036                        IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
00037                        IN RESOURCE_TRANSLATION_DIRECTION Direction,
00038                        IN ULONG AlternativesCount OPTIONAL,
00039                        IN IO_RESOURCE_DESCRIPTOR Alternatives[],
00040                        IN PDEVICE_OBJECT PhysicalDeviceObject,
00041                        OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target)
00042 {
00043     KIRQL Irql;
00044     KAFFINITY Affinity;
00045     ULONG MinimumVector, Vector, k;
00046     PIO_RESOURCE_DESCRIPTOR Alternative;
00047     NTSTATUS Status = STATUS_UNSUCCESSFUL;
00048     PAGED_CODE();
00049 
00050     ASSERT(Source->Type == CmResourceTypeInterrupt);
00051 
00052     /* Copy common information */
00053     Target->Type = Source->Type;
00054     Target->ShareDisposition = Source->ShareDisposition;
00055     Target->Flags = Source->Flags;
00056 
00057     if (Direction == TranslateChildToParent)
00058     {
00059         /* Get IRQL, affinity & system vector for the device vector */
00060         Target->u.Interrupt.Vector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0,
00061                                                            Source->u.Interrupt.Vector,
00062                                                            Source->u.Interrupt.Vector,
00063                                                            &Irql, &Affinity);
00064         Target->u.Interrupt.Level = Irql;
00065         Target->u.Interrupt.Affinity = Affinity;
00066         Status = STATUS_TRANSLATION_COMPLETE;
00067     }
00068     else if (Direction == TranslateParentToChild)
00069     {
00070         /* Browse all the resources */
00071         for (k = 0; k < AlternativesCount; k++)
00072         {
00073             Alternative = &(Alternatives[k]);
00074 
00075             ASSERT(Alternative->Type == CmResourceTypeInterrupt);
00076 
00077             /* Try to find the device vector, proceeding by trial & error
00078              * We try a vector, and translate it
00079              */
00080             MinimumVector = Alternative->u.Interrupt.MinimumVector;
00081             while (MinimumVector <= Alternative->u.Interrupt.MaximumVector)
00082             {
00083                 /* Translate the vector */
00084                 Vector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0,
00085                                                MinimumVector,
00086                                                MinimumVector,
00087                                                &Irql, &Affinity);
00088 
00089                 /* If the translated vector is matching the given translated vector */
00090                 if (Vector == Source->u.Interrupt.Vector)
00091                 {
00092                     /* We are done, send back device vector */
00093                     Target->u.Interrupt.Affinity = -1;
00094                     Target->u.Interrupt.Vector = MinimumVector;
00095                     Target->u.Interrupt.Level = MinimumVector;
00096 
00097                     return STATUS_SUCCESS;
00098                 }
00099 
00100                 MinimumVector++;
00101             }
00102         }
00103     }
00104 
00105     return Status;
00106 }
00107 
00108 /*
00109  * @implemented
00110  */
00111 NTSTATUS
00112 NTAPI
00113 FstubTranslateRequirement(IN OUT PVOID Context OPTIONAL,
00114                           IN PIO_RESOURCE_DESCRIPTOR Source,
00115                           IN PDEVICE_OBJECT PhysicalDeviceObject,
00116                           OUT PULONG TargetCount,
00117                           OUT PIO_RESOURCE_DESCRIPTOR *Target)
00118 {
00119     KIRQL Irql;
00120     KAFFINITY Affinity;
00121     PAGED_CODE();
00122 
00123     ASSERT(Source->Type == CmResourceTypeInterrupt);
00124 
00125     /* Allocate output buffer */
00126     *Target = ExAllocatePoolWithTag(PagedPool, sizeof(IO_RESOURCE_DESCRIPTOR), 'btsF');
00127     if (!*Target)
00128     {
00129         return STATUS_INSUFFICIENT_RESOURCES;
00130     }
00131 
00132     /* Zero & set out count to 1 */
00133     RtlZeroMemory(*Target, sizeof(IO_RESOURCE_DESCRIPTOR));
00134     *TargetCount = 1;
00135 
00136     /* Translate minimum interrupt vector */
00137     (*Target)->u.Interrupt.MinimumVector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0,
00138                                                                  Source->u.Interrupt.MinimumVector,
00139                                                                  Source->u.Interrupt.MinimumVector,
00140                                                                  &Irql, &Affinity);
00141 
00142     /* Translate maximum interrupt vector */
00143     (*Target)->u.Interrupt.MaximumVector = HalGetInterruptVector((INTERFACE_TYPE)Context, 0,
00144                                                                  Source->u.Interrupt.MaximumVector,
00145                                                                  Source->u.Interrupt.MaximumVector,
00146                                                                  &Irql, &Affinity);
00147 
00148     return STATUS_TRANSLATION_COMPLETE;
00149 }
00150 
00151 /*
00152  * @implemented
00153  */
00154 NTSTATUS
00155 NTAPI
00156 xHalGetInterruptTranslator(IN INTERFACE_TYPE ParentInterfaceType,
00157                            IN ULONG ParentBusNumber,
00158                            IN INTERFACE_TYPE BridgeInterfaceType,
00159                            IN USHORT Size,
00160                            IN USHORT Version,
00161                            OUT PTRANSLATOR_INTERFACE Translator,
00162                            OUT PULONG BridgeBusNumber)
00163 {
00164     PAGED_CODE();
00165 
00166     ASSERT(Version == HAL_IRQ_TRANSLATOR_VERSION);
00167     ASSERT(Size >= sizeof(TRANSLATOR_INTERFACE));
00168 
00169     /* Only (E)ISA interfaces are supported */
00170     if (BridgeInterfaceType == Internal || BridgeInterfaceType >= MicroChannel)
00171     {
00172         return STATUS_NOT_IMPLEMENTED;
00173     }
00174 
00175     /* Fill in output struct */
00176     Translator->Size = sizeof(TRANSLATOR_INTERFACE);
00177     Translator->Version = HAL_IRQ_TRANSLATOR_VERSION;
00178     /* In case caller set interface to undefined, faulty it to ISA */
00179     Translator->Context = (PVOID)((BridgeInterfaceType == InterfaceTypeUndefined) ? Isa : BridgeInterfaceType);
00180     Translator->InterfaceReference = FstubTranslatorNull;
00181     Translator->InterfaceDereference = FstubTranslatorNull;
00182     Translator->TranslateResources = FstubTranslateResource;
00183     Translator->TranslateResourceRequirements = FstubTranslateRequirement;
00184 
00185     return STATUS_SUCCESS;
00186 }

Generated on Sun May 27 2012 04:37:12 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.