ReactOS 0.4.16-dev-311-g9382aa2
xboxmem.c File Reference
#include <freeldr.h>
#include <debug.h>
Include dependency graph for xboxmem.c:

Go to the source code of this file.

Macros

#define TEST_SIZE   0x200
 
#define TEST_PATTERN1   0xAA
 
#define TEST_PATTERN2   0x55
 

Functions

 DBG_DEFAULT_CHANNEL (MEMORY)
 
VOID SetMemory (PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG_PTR BaseAddress, SIZE_T Size, TYPE_OF_MEMORY MemoryType)
 
VOID ReserveMemory (PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG_PTR BaseAddress, SIZE_T Size, TYPE_OF_MEMORY MemoryType, PCHAR Usage)
 
ULONG PcMemFinalizeMemoryMap (PFREELDR_MEMORY_DESCRIPTOR MemoryMap)
 
static VOID XboxInitializePCI (VOID)
 
VOID XboxMemInit (VOID)
 
memory_map_tXboxGetMultibootMemoryMap (INT *Count)
 
TYPE_OF_MEMORY XboxMultibootMemoryType (ULONG Type)
 
PFREELDR_MEMORY_DESCRIPTOR XboxMemGetMemoryMap (ULONG *MemoryMapSize)
 

Variables

static ULONG InstalledMemoryMb = 0
 
static ULONG AvailableMemoryMb = 0
 
multiboot_info_tMultibootInfoPtr
 
ULONG NvBase
 
PVOID FrameBuffer
 
ULONG FrameBufferSize
 
FREELDR_MEMORY_DESCRIPTOR XboxMemoryMap [MAX_BIOS_DESCRIPTORS+1]
 

Macro Definition Documentation

◆ TEST_PATTERN1

#define TEST_PATTERN1   0xAA

Definition at line 35 of file xboxmem.c.

◆ TEST_PATTERN2

#define TEST_PATTERN2   0x55

Definition at line 36 of file xboxmem.c.

◆ TEST_SIZE

#define TEST_SIZE   0x200

Definition at line 34 of file xboxmem.c.

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( MEMORY  )

◆ PcMemFinalizeMemoryMap()

ULONG PcMemFinalizeMemoryMap ( PFREELDR_MEMORY_DESCRIPTOR  MemoryMap)

Definition at line 547 of file pcmem.c.

549{
550 ULONG i;
551
552 /* Reserve some static ranges for freeldr */
553 ReserveMemory(MemoryMap, 0x1000, STACKLOW - 0x1000, LoaderFirmwareTemporary, "BIOS area");
556
557 /* Default to 1 page above freeldr for the disk read buffer */
560
561 /* Scan for free range above freeldr image */
562 for (i = 0; i < PcMapCount; i++)
563 {
564 if ((MemoryMap[i].BasePage > (FREELDR_BASE / PAGE_SIZE)) &&
565 (MemoryMap[i].MemoryType == LoaderFree))
566 {
567 /* Use this range for the disk read buffer */
568 DiskReadBuffer = (PVOID)(MemoryMap[i].BasePage * PAGE_SIZE);
571 break;
572 }
573 }
574
575 TRACE("DiskReadBuffer=0x%p, DiskReadBufferSize=0x%lx\n",
577
579
580 /* Now reserve the range for the disk read buffer */
585 "Disk read buffer");
586
587 TRACE("Dumping resulting memory map:\n");
588 for (i = 0; i < PcMapCount; i++)
589 {
590 TRACE("BasePage=0x%lx, PageCount=0x%lx, Type=%s\n",
591 MemoryMap[i].BasePage,
592 MemoryMap[i].PageCount,
593 MmGetSystemMemoryMapTypeString(MemoryMap[i].MemoryType));
594 }
595 return PcMapCount;
596}
#define ALIGN_UP_BY(size, align)
BIOS_MEMORY_MAP MemoryMap[32]
Definition: loader.c:11
#define DiskReadBuffer
Definition: hardware.h:33
#define FREELDR_BASE
Definition: hardware.h:18
SIZE_T FrLdrImageSize
Definition: meminit.c:35
#define PAGE_SIZE
Definition: env_spec_w32.h:49
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
SIZE_T DiskReadBufferSize
Definition: hwdisk.c:50
#define ASSERT(a)
Definition: mode.c:44
#define min(a, b)
Definition: monoChain.cc:55
VOID ReserveMemory(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG_PTR BaseAddress, SIZE_T Size, TYPE_OF_MEMORY MemoryType, PCHAR Usage)
Definition: pcmem.c:484
ULONG PcMapCount
Definition: pcmem.c:41
@ LoaderFree
Definition: arc.h:176
@ LoaderFirmwareTemporary
Definition: arc.h:179
@ LoaderLoadedProgram
Definition: arc.h:178
@ LoaderOsloaderStack
Definition: arc.h:182
#define TRACE(s)
Definition: solgame.cpp:4
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG_PTR
Definition: typedefs.h:65
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STACKLOW
Definition: x86common.h:15
#define STACKADDR
Definition: x86common.h:16
#define MAX_DISKREADBUFFER_SIZE
Definition: x86common.h:30

Referenced by PcMemGetMemoryMap(), and XboxMemGetMemoryMap().

◆ ReserveMemory()

VOID ReserveMemory ( PFREELDR_MEMORY_DESCRIPTOR  MemoryMap,
ULONG_PTR  BaseAddress,
SIZE_T  Size,
TYPE_OF_MEMORY  MemoryType,
PCHAR  Usage 
)

Definition at line 484 of file pcmem.c.

490{
491 ULONG_PTR BasePage, PageCount;
492 ULONG i;
493
494 BasePage = BaseAddress / PAGE_SIZE;
496
497 for (i = 0; i < PcMapCount; i++)
498 {
499 /* Check for conflicting descriptor */
500 if ((MemoryMap[i].BasePage < BasePage + PageCount) &&
501 (MemoryMap[i].BasePage + MemoryMap[i].PageCount > BasePage))
502 {
503 /* Check if the memory is free */
504 if (MemoryMap[i].MemoryType != LoaderFree)
505 {
508 __FILE__,
509 __LINE__,
510 "Failed to reserve memory in the range 0x%Ix - 0x%Ix for %s",
512 Size,
513 Usage);
514 }
515 }
516 }
517
518 /* Add the memory descriptor */
521 BasePage,
522 PageCount,
523 MemoryType);
524}
VOID FrLdrBugCheckWithMessage(ULONG BugCode, PCHAR File, ULONG Line, PSTR Format,...)
Definition: debug.c:28
@ MEMORY_INIT_FAILURE
Definition: debug.h:146
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE Usage
Definition: hidpi.h:384
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define MAX_BIOS_DESCRIPTORS
Definition: pcbios.h:12
ULONG AddMemoryDescriptor(IN OUT PFREELDR_MEMORY_DESCRIPTOR List, IN ULONG MaxCount, IN PFN_NUMBER BasePage, IN PFN_NUMBER PageCount, IN TYPE_OF_MEMORY MemoryType)
Definition: meminit.c:102
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size)

Referenced by PcMemFinalizeMemoryMap(), and XboxMemGetMemoryMap().

◆ SetMemory()

VOID SetMemory ( PFREELDR_MEMORY_DESCRIPTOR  MemoryMap,
ULONG_PTR  BaseAddress,
SIZE_T  Size,
TYPE_OF_MEMORY  MemoryType 
)

Definition at line 527 of file pcmem.c.

532{
533 ULONG_PTR BasePage, PageCount;
534
535 BasePage = BaseAddress / PAGE_SIZE;
537
538 /* Add the memory descriptor */
541 BasePage,
542 PageCount,
543 MemoryType);
544}

Referenced by PcMemGetMemoryMap(), and XboxMemGetMemoryMap().

◆ XboxGetMultibootMemoryMap()

memory_map_t * XboxGetMultibootMemoryMap ( INT Count)

Definition at line 175 of file xboxmem.c.

176{
178
179 if (!MultibootInfoPtr)
180 {
181 ERR("Multiboot info structure not found!\n");
182 return NULL;
183 }
184
186 {
187 ERR("Multiboot memory map is not passed!\n");
188 return NULL;
189 }
190
192
193 if (!MemoryMap ||
196 {
197 ERR("Multiboot memory map structure is malformed!\n");
198 return NULL;
199 }
200
202 return MemoryMap;
203}
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
if(dx< 0)
Definition: linetemp.h:194
#define MB_INFO_FLAG_MEMORY_MAP
Definition: multiboot.h:50
struct memory_map memory_map_t
int Count
Definition: noreturn.cpp:7
unsigned long mmap_addr
Definition: multiboot.h:109
unsigned long mmap_length
Definition: multiboot.h:108
unsigned long flags
Definition: multiboot.h:96
multiboot_info_t * MultibootInfoPtr

Referenced by XboxMemGetMemoryMap().

◆ XboxInitializePCI()

static VOID XboxInitializePCI ( VOID  )
static

Definition at line 59 of file xboxmem.c.

60{
61 PCI_TYPE1_CFG_BITS PciCfg1;
62 ULONG PciData;
63
64 /* Select PCI to PCI bridge */
65 PciCfg1.u.bits.Enable = 1;
66 PciCfg1.u.bits.BusNumber = 0;
67 PciCfg1.u.bits.DeviceNumber = 8;
68 PciCfg1.u.bits.FunctionNumber = 0;
69 /* Select register VendorID & DeviceID */
70 PciCfg1.u.bits.RegisterNumber = 0x00;
71 PciCfg1.u.bits.Reserved = 0;
72
75
76 if (PciData == 0x01B810DE)
77 {
78 /* Select register PrimaryBus/SecondaryBus/SubordinateBus/SecondaryLatency */
79 PciCfg1.u.bits.RegisterNumber = 0x18;
81
82 /* Link uninitialized PCI bridge to the empty PCI bus 2,
83 * it's not supposed to have any devices attached anyway */
85 PciData &= 0xFF0000FF;
86 PciData |= 0x00020200;
88 }
89
90 /* Select AGP to PCI bridge */
91 PciCfg1.u.bits.DeviceNumber = 30;
92 /* Select register VendorID & DeviceID */
93 PciCfg1.u.bits.RegisterNumber = 0x00;
94
97
98 if (PciData == 0x01B710DE)
99 {
100 /* Zero out uninitialized AGP Host bridge BARs */
101
102 /* Select register BAR0 */
103 PciCfg1.u.bits.RegisterNumber = 0x10;
105 /* Zero it out */
107
108 /* Select register BAR1 */
109 PciCfg1.u.bits.RegisterNumber = 0x14;
111 /* Zero it out */
113 }
114}
#define PCI_TYPE1_DATA_PORT
Definition: hardware.h:34
#define PCI_TYPE1_ADDRESS_PORT
Definition: hardware.h:33
ULONG NTAPI READ_PORT_ULONG(IN PULONG Port)
Definition: portio.c:70
VOID NTAPI WRITE_PORT_ULONG(IN PULONG Port, IN ULONG Value)
Definition: portio.c:123
struct _PCI_TYPE1_CFG_BITS::@157::@158 bits
union _PCI_TYPE1_CFG_BITS::@157 u
uint32_t * PULONG
Definition: typedefs.h:59

Referenced by XboxMemInit().

◆ XboxMemGetMemoryMap()

PFREELDR_MEMORY_DESCRIPTOR XboxMemGetMemoryMap ( ULONG MemoryMapSize)

Definition at line 228 of file xboxmem.c.

229{
230 memory_map_t * MbMap;
231 INT Count, i;
232
233 TRACE("XboxMemGetMemoryMap()\n");
234
236 if (MbMap)
237 {
238 /* Obtain memory map via multiboot spec */
239
240 for (i = 0; i < Count; i++, MbMap++)
241 {
242 TRACE("i = %d, base_addr_low = 0x%p, length_low = 0x%p\n", i, MbMap->base_addr_low, MbMap->length_low);
243
244 if (MbMap->base_addr_high > 0 || MbMap->length_high > 0)
245 {
246 ERR("Memory descriptor base or size is greater than 4 GB, should not happen on Xbox!\n");
247 ASSERT(FALSE);
248 }
249
251 MbMap->base_addr_low,
252 MbMap->length_low,
254 }
255 }
256 else
257 {
258 /* Synthesize memory map */
259
260 /* Available RAM block */
262 0,
263 AvailableMemoryMb * 1024 * 1024,
264 LoaderFree);
265
266 if (FrameBufferSize != 0)
267 {
268 /* Video memory */
273 "Video memory");
274 }
275 }
276
277 *MemoryMapSize = PcMemFinalizeMemoryMap(XboxMemoryMap);
278 return XboxMemoryMap;
279}
#define FALSE
Definition: types.h:117
@ LoaderFirmwarePermanent
Definition: arc.h:180
unsigned long base_addr_low
Definition: multiboot.h:119
unsigned long length_low
Definition: multiboot.h:121
unsigned long type
Definition: multiboot.h:123
unsigned long base_addr_high
Definition: multiboot.h:120
unsigned long length_high
Definition: multiboot.h:122
int32_t INT
Definition: typedefs.h:58
memory_map_t * XboxGetMultibootMemoryMap(INT *Count)
Definition: xboxmem.c:175
ULONG FrameBufferSize
Definition: xboxvideo.c:29
FREELDR_MEMORY_DESCRIPTOR XboxMemoryMap[MAX_BIOS_DESCRIPTORS+1]
Definition: xboxmem.c:225
ULONG PcMemFinalizeMemoryMap(PFREELDR_MEMORY_DESCRIPTOR MemoryMap)
Definition: pcmem.c:547
PVOID FrameBuffer
Definition: xboxvideo.c:28
static ULONG AvailableMemoryMb
Definition: xboxmem.c:28
VOID ReserveMemory(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG_PTR BaseAddress, SIZE_T Size, TYPE_OF_MEMORY MemoryType, PCHAR Usage)
Definition: pcmem.c:484
TYPE_OF_MEMORY XboxMultibootMemoryType(ULONG Type)
Definition: xboxmem.c:206
VOID SetMemory(PFREELDR_MEMORY_DESCRIPTOR MemoryMap, ULONG_PTR BaseAddress, SIZE_T Size, TYPE_OF_MEMORY MemoryType)
Definition: pcmem.c:527

Referenced by MachInit().

◆ XboxMemInit()

VOID XboxMemInit ( VOID  )

Definition at line 117 of file xboxmem.c.

118{
119 PCI_TYPE1_CFG_BITS PciCfg1;
120 UCHAR ControlRegion[TEST_SIZE];
121 PVOID MembaseTop = (PVOID)(64 * 1024 * 1024);
122 PVOID MembaseLow = (PVOID)0;
123
125 WRITE_REGISTER_ULONG((PULONG)(NvBase + NV2A_FB_CFG0 + 4), 0x11448000);
126
127 /* Select Host to PCI bridge */
128 PciCfg1.u.bits.Enable = 1;
129 PciCfg1.u.bits.BusNumber = 0;
130 PciCfg1.u.bits.DeviceNumber = 0;
131 PciCfg1.u.bits.FunctionNumber = 0;
132 PciCfg1.u.bits.Reserved = 0;
133 /* Prepare hardware for 128 MB */
134 PciCfg1.u.bits.RegisterNumber = 0x84;
135
138
140 memset(ControlRegion, TEST_PATTERN1, TEST_SIZE);
141 memset(MembaseTop, TEST_PATTERN1, TEST_SIZE);
142 __wbinvd();
143
144 if (memcmp(MembaseTop, ControlRegion, TEST_SIZE) == 0)
145 {
146 /* Looks like there is memory .. maybe a 128MB box */
147 memset(ControlRegion, TEST_PATTERN2, TEST_SIZE);
148 memset(MembaseTop, TEST_PATTERN2, TEST_SIZE);
149 __wbinvd();
150 if (memcmp(MembaseTop, ControlRegion, TEST_SIZE) == 0)
151 {
152 /* Definitely looks like there is memory */
153 if (memcmp(MembaseLow, ControlRegion, TEST_SIZE) == 0)
154 {
155 /* Hell, we find the Test-string at 0x0 too! */
157 }
158 else
159 {
160 InstalledMemoryMb = 128;
161 }
162 }
163 }
164
165 /* Set hardware for amount of memory detected */
168
170
172}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define WRITE_REGISTER_ULONG(r, v)
Definition: arm.h:27
PPC_QUAL void __wbinvd(void)
Definition: intrin_ppc.h:759
#define memset(x, y, z)
Definition: compat.h:39
static VOID XboxInitializePCI(VOID)
Definition: xboxmem.c:59
#define TEST_PATTERN2
Definition: xboxmem.c:36
#define TEST_SIZE
Definition: xboxmem.c:34
ULONG NvBase
Definition: xboxvideo.c:27
#define TEST_PATTERN1
Definition: xboxmem.c:35
static ULONG InstalledMemoryMb
Definition: xboxmem.c:27
#define NV2A_FB_CFG0
Definition: xgpu.h:19
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by MachInit().

◆ XboxMultibootMemoryType()

TYPE_OF_MEMORY XboxMultibootMemoryType ( ULONG  Type)

Definition at line 206 of file xboxmem.c.

207{
208 switch (Type)
209 {
210 case 0: // Video RAM
212 case 1: // Available RAM
213 return LoaderFree;
214 case 3: // ACPI area
216 case 4: // Hibernation area
217 return LoaderSpecialMemory;
218 case 5: // Reserved or invalid memory
219 return LoaderSpecialMemory;
220 default:
222 }
223}
Type
Definition: Type.h:7
@ LoaderSpecialMemory
Definition: arc.h:196

Referenced by XboxMemGetMemoryMap().

Variable Documentation

◆ AvailableMemoryMb

ULONG AvailableMemoryMb = 0
static

Definition at line 28 of file xboxmem.c.

Referenced by XboxMemGetMemoryMap(), and XboxMemInit().

◆ FrameBuffer

PVOID FrameBuffer
extern

Definition at line 28 of file xboxvideo.c.

Referenced by XboxMemGetMemoryMap().

◆ FrameBufferSize

ULONG FrameBufferSize
extern

Definition at line 29 of file xboxvideo.c.

Referenced by XboxMemGetMemoryMap(), and XboxVideoInit().

◆ InstalledMemoryMb

ULONG InstalledMemoryMb = 0
static

Definition at line 27 of file xboxmem.c.

Referenced by XboxMemInit().

◆ MultibootInfoPtr

multiboot_info_t* MultibootInfoPtr
extern

◆ NvBase

ULONG NvBase
extern

Definition at line 27 of file xboxvideo.c.

Referenced by NvGetCrtc(), XboxMemInit(), and XboxVideoInit().

◆ XboxMemoryMap

Definition at line 225 of file xboxmem.c.

Referenced by XboxMemGetMemoryMap().