mirror of
https://github.com/vivier/EMILE.git
synced 2024-12-23 01:29:34 +00:00
Rename map to memory_map and export it
This commit is contained in:
parent
09aa0fdf33
commit
9bb63653bf
104
second/bank.c
104
second/bank.c
@ -6,51 +6,55 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "lowmem.h"
|
#include "lowmem.h"
|
||||||
#include "MMU.h"
|
#include "MMU.h"
|
||||||
#include "bank.h"
|
#include "bank.h"
|
||||||
|
|
||||||
static void bank_add_mem(memory_map_t* map, unsigned long logiAddr,
|
memory_map_t memory_map = { { { 0, 0 } }, 0 };
|
||||||
|
|
||||||
|
static void bank_add_mem(unsigned long logiAddr,
|
||||||
unsigned long physAddr, unsigned long size)
|
unsigned long physAddr, unsigned long size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
for (i = 0; i < map->bank_number; i++)
|
for (i = 0; i < memory_map.bank_number; i++)
|
||||||
{
|
{
|
||||||
if ( (map->bank[i].physAddr <= physAddr) &&
|
if ( (memory_map.bank[i].physAddr <= physAddr) &&
|
||||||
(physAddr < map->bank[i].physAddr + map->bank[i].size) )
|
(physAddr < memory_map.bank[i].physAddr + memory_map.bank[i].size) )
|
||||||
return; /* several logical address to one physical */
|
return; /* several logical address to one physical */
|
||||||
|
|
||||||
if (map->bank[i].physAddr + map->bank[i].size == physAddr)
|
if (memory_map.bank[i].physAddr + memory_map.bank[i].size == physAddr)
|
||||||
{
|
{
|
||||||
map->bank[i].size += size;
|
memory_map.bank[i].size += size;
|
||||||
|
|
||||||
/* can we merge 2 banks */
|
/* can we merge 2 banks */
|
||||||
|
|
||||||
for (j = 0; j < map->bank_number; j++)
|
for (j = 0; j < memory_map.bank_number; j++)
|
||||||
{
|
{
|
||||||
if (map->bank[i].physAddr + map->bank[i].size == map->bank[j].physAddr)
|
if (memory_map.bank[i].physAddr + memory_map.bank[i].size == memory_map.bank[j].physAddr)
|
||||||
{
|
{
|
||||||
map->bank[i].size += map->bank[j].size;
|
memory_map.bank[i].size += memory_map.bank[j].size;
|
||||||
|
|
||||||
/* remove bank */
|
/* remove bank */
|
||||||
|
|
||||||
map->bank_number--;
|
memory_map.bank_number--;
|
||||||
map->bank[j].physAddr = map->bank[map->bank_number].physAddr;
|
memory_map.bank[j].physAddr = memory_map.bank[memory_map.bank_number].physAddr;
|
||||||
map->bank[j].logiAddr = map->bank[map->bank_number].logiAddr;
|
memory_map.bank[j].logiAddr = memory_map.bank[memory_map.bank_number].logiAddr;
|
||||||
map->bank[j].size = map->bank[map->bank_number].size;
|
memory_map.bank[j].size = memory_map.bank[memory_map.bank_number].size;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (physAddr + size == map->bank[i].physAddr)
|
else if (physAddr + size == memory_map.bank[i].physAddr)
|
||||||
{
|
{
|
||||||
map->bank[i].physAddr = physAddr;
|
memory_map.bank[i].physAddr = physAddr;
|
||||||
map->bank[i].logiAddr = logiAddr;
|
memory_map.bank[i].logiAddr = logiAddr;
|
||||||
map->bank[i].size += size;
|
memory_map.bank[i].size += size;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -58,16 +62,16 @@ static void bank_add_mem(memory_map_t* map, unsigned long logiAddr,
|
|||||||
|
|
||||||
/* not found, create new bank */
|
/* not found, create new bank */
|
||||||
|
|
||||||
if (map->bank_number >= MAX_MEM_MAP_SIZE)
|
if (memory_map.bank_number >= MAX_MEM_MAP_SIZE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
map->bank[map->bank_number].physAddr = physAddr;
|
memory_map.bank[memory_map.bank_number].physAddr = physAddr;
|
||||||
map->bank[map->bank_number].logiAddr = logiAddr;
|
memory_map.bank[memory_map.bank_number].logiAddr = logiAddr;
|
||||||
map->bank[map->bank_number].size = size;
|
memory_map.bank[memory_map.bank_number].size = size;
|
||||||
map->bank_number++;
|
memory_map.bank_number++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_memory_map(memory_map_t* map)
|
void init_memory_map()
|
||||||
{
|
{
|
||||||
unsigned long logical;
|
unsigned long logical;
|
||||||
unsigned long physical;
|
unsigned long physical;
|
||||||
@ -84,12 +88,62 @@ void get_memory_map(memory_map_t* map)
|
|||||||
}
|
}
|
||||||
while(1);
|
while(1);
|
||||||
#endif
|
#endif
|
||||||
map->bank_number = 0;
|
memory_map.bank_number = 0;
|
||||||
for (logical = 0; logical < MemTop; logical += ps)
|
for (logical = 0; logical < MemTop; logical += ps)
|
||||||
{
|
{
|
||||||
if (logical2physical(logical, &physical) == 0)
|
if (logical2physical(logical, &physical) == 0)
|
||||||
{
|
{
|
||||||
bank_add_mem(map, logical, physical, ps);
|
bank_add_mem(logical, physical, ps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int bank_find_by_physical(unsigned long physical)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < memory_map.bank_number; i++)
|
||||||
|
{
|
||||||
|
if ( (memory_map.bank[i].physAddr <= physical) &&
|
||||||
|
( physical < memory_map.bank[i].physAddr + memory_map.bank[i].size) )
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int physical2logical(unsigned long physical, unsigned long *logical)
|
||||||
|
{
|
||||||
|
int bank;
|
||||||
|
|
||||||
|
bank = bank_find_by_physical(physical);
|
||||||
|
|
||||||
|
if (bank == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (memory_map.bank[bank].physAddr > memory_map.bank[bank].logiAddr)
|
||||||
|
*logical = physical - (memory_map.bank[bank].physAddr -
|
||||||
|
memory_map.bank[bank].logiAddr);
|
||||||
|
else
|
||||||
|
*logical = physical + (memory_map.bank[bank].logiAddr -
|
||||||
|
memory_map.bank[bank].physAddr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bank_dump()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned long size = 0;
|
||||||
|
|
||||||
|
printf("Physical memory map:\n");
|
||||||
|
for (i = 0; i < memory_map.bank_number; i++)
|
||||||
|
{
|
||||||
|
printf("%d: 0x%08lx -> 0x%08lx mapped at 0x%08lx\n", i,
|
||||||
|
memory_map.bank[i].physAddr,
|
||||||
|
memory_map.bank[i].physAddr + memory_map.bank[i].size,
|
||||||
|
memory_map.bank[i].logiAddr);
|
||||||
|
size += memory_map.bank[i].size;
|
||||||
|
}
|
||||||
|
printf("Available Memory: %ld kB\n", size / 1024);
|
||||||
|
}
|
||||||
|
@ -2,11 +2,8 @@
|
|||||||
*
|
*
|
||||||
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
*
|
*
|
||||||
* portion from penguin booter
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* physical memory information */
|
/* physical memory information */
|
||||||
|
|
||||||
#define MAX_MEM_MAP_SIZE 26
|
#define MAX_MEM_MAP_SIZE 26
|
||||||
@ -23,5 +20,6 @@ typedef struct memory_map {
|
|||||||
} memory_map_t;
|
} memory_map_t;
|
||||||
|
|
||||||
extern memory_map_t memory_map;
|
extern memory_map_t memory_map;
|
||||||
extern void get_memory_map(memory_map_t* map);
|
|
||||||
|
|
||||||
|
extern void init_memory_map();
|
||||||
|
extern void bank_dump();
|
||||||
|
@ -30,25 +30,16 @@ int main(int argc, char** argv)
|
|||||||
unsigned long kernel_image_size = &_kernel_end - &_kernel_start;
|
unsigned long kernel_image_size = &_kernel_end - &_kernel_start;
|
||||||
unsigned long kernel_size = (unsigned long)&_KERNEL_SIZE;
|
unsigned long kernel_size = (unsigned long)&_KERNEL_SIZE;
|
||||||
unsigned long physEntry;
|
unsigned long physEntry;
|
||||||
int i;
|
|
||||||
|
|
||||||
printf("Early Macintosh Image LoadEr\n");
|
printf("Early Macintosh Image LoadEr\n");
|
||||||
printf("EMILE v"VERSION" (c) 2004 Laurent Vivier\n");
|
printf("EMILE v"VERSION" (c) 2004 Laurent Vivier\n");
|
||||||
printf("This is free software, redistribute it under GPL\n");
|
printf("This is free software, redistribute it under GPL\n");
|
||||||
|
|
||||||
|
bank_dump();
|
||||||
|
|
||||||
printf("Kernel image found at %p\n", kernel_image_start);
|
printf("Kernel image found at %p\n", kernel_image_start);
|
||||||
printf("Kernel image size is %ld Bytes\n", kernel_image_size);
|
printf("Kernel image size is %ld Bytes\n", kernel_image_size);
|
||||||
|
|
||||||
printf("Available Memory: %ld KB\n", MemTop / 1024);
|
|
||||||
printf("Physical memory map:\n");
|
|
||||||
for (i = 0; i < memory_map.bank_number; i++)
|
|
||||||
{
|
|
||||||
printf("%d: 0x%08lx -> 0x%08lx mapped at 0x%08lx\n", i,
|
|
||||||
memory_map.bank[i].physAddr,
|
|
||||||
memory_map.bank[i].physAddr + memory_map.bank[i].size,
|
|
||||||
memory_map.bank[i].logiAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kernel_image_size != 0)
|
if (kernel_image_size != 0)
|
||||||
{
|
{
|
||||||
/* add KERNEL_ALIGN if we have to align
|
/* add KERNEL_ALIGN if we have to align
|
||||||
|
@ -31,8 +31,6 @@ typedef struct memory_pool {
|
|||||||
|
|
||||||
memory_pool_t* pool = NULL;
|
memory_pool_t* pool = NULL;
|
||||||
|
|
||||||
memory_map_t memory_map = { { { 0, 0 } }, 0 };
|
|
||||||
|
|
||||||
static int memory_find_area_by_addr(unsigned long start)
|
static int memory_find_area_by_addr(unsigned long start)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -175,7 +173,7 @@ void memory_init()
|
|||||||
|
|
||||||
/* we are currently using the MMU to have only one linear memory area */
|
/* we are currently using the MMU to have only one linear memory area */
|
||||||
|
|
||||||
get_memory_map(&memory_map);
|
init_memory_map();
|
||||||
|
|
||||||
/* we put memory pool array just before us */
|
/* we put memory pool array just before us */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user