xref: /reactos/ntoskrnl/ex/xipdisp.c (revision 7eead935)
1 /*
2  * PROJECT:         ReactOS Kernel
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * FILE:            ntoskrnl/ex/xipdisp.c
5  * PURPOSE:         eXecute In Place (XIP) Support.
6  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
7  */
8 
9 /* INCLUDES ******************************************************************/
10 
11 #include <ntoskrnl.h>
12 #include <debug.h>
13 
14 /* GLOBALS *******************************************************************/
15 
16 /* FUNCTIONS *****************************************************************/
17 
18 NTSTATUS
19 NTAPI
20 XIPDispatch(IN ULONG DispatchCode,
21             OUT PVOID Buffer,
22             IN ULONG BufferSize)
23 {
24     UNIMPLEMENTED;
25     return STATUS_NOT_IMPLEMENTED;
26 }
27 
28 INIT_FUNCTION
29 PMEMORY_ALLOCATION_DESCRIPTOR
30 NTAPI
31 XIPpFindMemoryDescriptor(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
32 {
33     PLIST_ENTRY NextEntry;
34     PMEMORY_ALLOCATION_DESCRIPTOR Descriptor = NULL;
35 
36     /* Loop the memory descriptors */
37     for (NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
38          NextEntry != &LoaderBlock->MemoryDescriptorListHead;
39          NextEntry = NextEntry->Flink)
40     {
41         /* Get the current descriptor and check if it's the XIP ROM */
42         Descriptor = CONTAINING_RECORD(NextEntry,
43                                        MEMORY_ALLOCATION_DESCRIPTOR,
44                                        ListEntry);
45         if (Descriptor->MemoryType == LoaderXIPRom) return Descriptor;
46     }
47 
48     /* Nothing found if we got here */
49     return NULL;
50 }
51 
52 INIT_FUNCTION
53 VOID
54 NTAPI
55 XIPInit(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
56 {
57     PCHAR CommandLine, XipBoot, XipRom, XipMegs, XipVerbose, XipRam;
58     PMEMORY_ALLOCATION_DESCRIPTOR XipDescriptor;
59 
60     /* Get the command line */
61     CommandLine = LoaderBlock->LoadOptions;
62     if (!CommandLine) return;
63 
64     /* Get XIP settings */
65     XipBoot = strstr(CommandLine, "XIPBOOT");
66     XipRam = strstr(CommandLine, "XIPRAM=");
67     XipRom = strstr(CommandLine, "XIPROM=");
68     XipMegs = strstr(CommandLine, "XIPMEGS=");
69     XipVerbose = strstr(CommandLine, "XIPVERBOSE");
70 
71     /* Check if this is a verbose boot */
72     if (XipVerbose)
73     {
74         /* Print out our header */
75         DbgPrint("\n\nXIP: debug timestamp at line %d in %s:   <<<%s %s>>>\n\n",
76                  __LINE__,
77                  __FILE__,
78                  __DATE__,
79                  __TIME__);
80     }
81 
82     /* Find the XIP memory descriptor */
83     XipDescriptor = XIPpFindMemoryDescriptor(LoaderBlock);
84     if (!XipDescriptor) return;
85 
86     //
87     // Make sure this is really XIP, and not RAM Disk -- also validate XIP
88     // Basically, either this is a ROM boot or a RAM boot, but not both nor none
89     //
90     if (!((ULONG_PTR)XipRom ^ (ULONG_PTR)XipRam)) return;
91 
92     /* FIXME: TODO */
93     DPRINT1("ReactOS does not yet support eXecute In Place boot technology\n");
94     DPRINT("%s MB requested (XIP = %s)\n", XipMegs, XipBoot);
95 }
96 
97 /* EOF */
98