mirror of
https://github.com/vivier/EMILE.git
synced 2024-06-12 19:22:46 +00:00
add bank.[ch], move memory bank management into them
This commit is contained in:
parent
644f629761
commit
09aa0fdf33
|
@ -16,3 +16,7 @@
|
|||
add TRACE(), correct Table Indices extraction in decode_[48]_PD(),
|
||||
correct LIMIT management in decode_8_PD(), correct computing of
|
||||
physical address
|
||||
|
||||
19 Feb 2004 - Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||
|
||||
* add bank.[ch], move memory bank management into them
|
||||
|
|
|
@ -21,7 +21,7 @@ second: second.o
|
|||
-O binary second.o second
|
||||
|
||||
OBJS = head.o MMU_asm.o image.o console.o printf.o font_8x16.o memory.o \
|
||||
uncompress.o MMU.o bootinfo.o misc.o glue.o enter_kernel.o
|
||||
uncompress.o MMU.o bootinfo.o misc.o glue.o enter_kernel.o bank.o
|
||||
|
||||
second.o: $(OBJS) ld.script
|
||||
$(LD) -T ld.script -Ttext 0x00200000 \
|
||||
|
|
95
second/bank.c
Normal file
95
second/bank.c
Normal file
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
*
|
||||
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||
*
|
||||
* portion from penguin booter
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lowmem.h"
|
||||
#include "MMU.h"
|
||||
#include "bank.h"
|
||||
|
||||
static void bank_add_mem(memory_map_t* map, unsigned long logiAddr,
|
||||
unsigned long physAddr, unsigned long size)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0; i < map->bank_number; i++)
|
||||
{
|
||||
if ( (map->bank[i].physAddr <= physAddr) &&
|
||||
(physAddr < map->bank[i].physAddr + map->bank[i].size) )
|
||||
return; /* several logical address to one physical */
|
||||
|
||||
if (map->bank[i].physAddr + map->bank[i].size == physAddr)
|
||||
{
|
||||
map->bank[i].size += size;
|
||||
|
||||
/* can we merge 2 banks */
|
||||
|
||||
for (j = 0; j < map->bank_number; j++)
|
||||
{
|
||||
if (map->bank[i].physAddr + map->bank[i].size == map->bank[j].physAddr)
|
||||
{
|
||||
map->bank[i].size += map->bank[j].size;
|
||||
|
||||
/* remove bank */
|
||||
|
||||
map->bank_number--;
|
||||
map->bank[j].physAddr = map->bank[map->bank_number].physAddr;
|
||||
map->bank[j].logiAddr = map->bank[map->bank_number].logiAddr;
|
||||
map->bank[j].size = map->bank[map->bank_number].size;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else if (physAddr + size == map->bank[i].physAddr)
|
||||
{
|
||||
map->bank[i].physAddr = physAddr;
|
||||
map->bank[i].logiAddr = logiAddr;
|
||||
map->bank[i].size += size;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* not found, create new bank */
|
||||
|
||||
if (map->bank_number >= MAX_MEM_MAP_SIZE)
|
||||
return;
|
||||
|
||||
map->bank[map->bank_number].physAddr = physAddr;
|
||||
map->bank[map->bank_number].logiAddr = logiAddr;
|
||||
map->bank[map->bank_number].size = size;
|
||||
map->bank_number++;
|
||||
}
|
||||
|
||||
void get_memory_map(memory_map_t* map)
|
||||
{
|
||||
unsigned long logical;
|
||||
unsigned long physical;
|
||||
int ps = get_page_size();
|
||||
|
||||
#ifdef DUMP_MEMMAP
|
||||
for (logical = 0; logical < MemTop ; logical += ps)
|
||||
{
|
||||
printf("%08lx->", logical);
|
||||
if (logical2physical(logical, &physical) == 0)
|
||||
printf("%08lx ", physical);
|
||||
else
|
||||
printf("INVALID! ");
|
||||
}
|
||||
while(1);
|
||||
#endif
|
||||
map->bank_number = 0;
|
||||
for (logical = 0; logical < MemTop; logical += ps)
|
||||
{
|
||||
if (logical2physical(logical, &physical) == 0)
|
||||
{
|
||||
bank_add_mem(map, logical, physical, ps);
|
||||
}
|
||||
}
|
||||
}
|
27
second/bank.h
Normal file
27
second/bank.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
*
|
||||
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||
*
|
||||
* portion from penguin booter
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* physical memory information */
|
||||
|
||||
#define MAX_MEM_MAP_SIZE 26
|
||||
|
||||
typedef struct memory_bank {
|
||||
unsigned long physAddr;
|
||||
unsigned long logiAddr;
|
||||
unsigned long size;
|
||||
} memory_bank_t;
|
||||
|
||||
typedef struct memory_map {
|
||||
memory_bank_t bank[MAX_MEM_MAP_SIZE];
|
||||
unsigned long bank_number;
|
||||
} memory_map_t;
|
||||
|
||||
extern memory_map_t memory_map;
|
||||
extern void get_memory_map(memory_map_t* map);
|
||||
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <string.h>
|
||||
|
||||
#include "bank.h"
|
||||
#include "memory.h"
|
||||
#include "glue.h"
|
||||
#include "console.h"
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "lowmem.h"
|
||||
#include "MMU.h"
|
||||
#include "bank.h"
|
||||
#include "memory.h"
|
||||
#include "uncompress.h"
|
||||
#include "bootinfo.h"
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "MMU.h"
|
||||
#include "bank.h"
|
||||
#include "memory.h"
|
||||
#include "lowmem.h"
|
||||
|
||||
|
@ -228,87 +229,3 @@ void free(void *ptr)
|
|||
|
||||
memory_add((unsigned long)ptr, (unsigned long)ptr + *(unsigned long*)ptr);
|
||||
}
|
||||
|
||||
static void bank_add_mem(memory_map_t* map, unsigned long logiAddr,
|
||||
unsigned long physAddr, unsigned long size)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0; i < map->bank_number; i++)
|
||||
{
|
||||
if ( (map->bank[i].physAddr <= physAddr) &&
|
||||
(physAddr < map->bank[i].physAddr + map->bank[i].size) )
|
||||
return; /* several logical address to one physical */
|
||||
|
||||
if (map->bank[i].physAddr + map->bank[i].size == physAddr)
|
||||
{
|
||||
map->bank[i].size += size;
|
||||
|
||||
/* can we merge 2 banks */
|
||||
|
||||
for (j = 0; j < map->bank_number; j++)
|
||||
{
|
||||
if (map->bank[i].physAddr + map->bank[i].size == map->bank[j].physAddr)
|
||||
{
|
||||
map->bank[i].size += map->bank[j].size;
|
||||
|
||||
/* remove bank */
|
||||
|
||||
map->bank_number--;
|
||||
map->bank[j].physAddr = map->bank[map->bank_number].physAddr;
|
||||
map->bank[j].logiAddr = map->bank[map->bank_number].logiAddr;
|
||||
map->bank[j].size = map->bank[map->bank_number].size;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else if (physAddr + size == map->bank[i].physAddr)
|
||||
{
|
||||
map->bank[i].physAddr = physAddr;
|
||||
map->bank[i].logiAddr = logiAddr;
|
||||
map->bank[i].size += size;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* not found, create new bank */
|
||||
|
||||
if (map->bank_number >= MAX_MEM_MAP_SIZE)
|
||||
return;
|
||||
|
||||
map->bank[map->bank_number].physAddr = physAddr;
|
||||
map->bank[map->bank_number].logiAddr = logiAddr;
|
||||
map->bank[map->bank_number].size = size;
|
||||
map->bank_number++;
|
||||
}
|
||||
|
||||
void get_memory_map(memory_map_t* map)
|
||||
{
|
||||
unsigned long logical;
|
||||
unsigned long physical;
|
||||
int ps = get_page_size();
|
||||
|
||||
#ifdef DUMP_MEMMAP
|
||||
for (logical = 0; logical < MemTop ; logical += ps)
|
||||
{
|
||||
printf("%08lx->", logical);
|
||||
if (logical2physical(logical, &physical) == 0)
|
||||
printf("%08lx ", physical);
|
||||
else
|
||||
printf("INVALID! ");
|
||||
}
|
||||
while(1);
|
||||
#endif
|
||||
map->bank_number = 0;
|
||||
for (logical = 0; logical < MemTop; logical += ps)
|
||||
{
|
||||
if (logical2physical(logical, &physical) == 0)
|
||||
{
|
||||
bank_add_mem(map, logical, physical, ps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,26 +2,4 @@
|
|||
*
|
||||
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||
*
|
||||
* portion from penguin booter
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* physical memory information */
|
||||
|
||||
#define MAX_MEM_MAP_SIZE 26
|
||||
|
||||
typedef struct memory_bank {
|
||||
unsigned long physAddr;
|
||||
unsigned long logiAddr;
|
||||
unsigned long size;
|
||||
} memory_bank_t;
|
||||
|
||||
typedef struct memory_map {
|
||||
memory_bank_t bank[MAX_MEM_MAP_SIZE];
|
||||
unsigned long bank_number;
|
||||
} memory_map_t;
|
||||
|
||||
extern memory_map_t memory_map;
|
||||
extern void get_memory_map(memory_map_t* map);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user