add USE_MMU, USE_MMU030, USE_MMU040

This commit is contained in:
Laurent Vivier 2005-10-20 21:12:13 +00:00
parent e864052a45
commit 7e7ae6ca7b
5 changed files with 90 additions and 34 deletions

View File

@ -25,8 +25,11 @@ OBJS_CLI = keyboard.o cli.o
# ARCHITECTURE
OBJS_M68K = MMU030_asm.o MMU040_asm.o MMU030.o MMU040.o \
enter_kernel030.o enter_kernel040.o enter_kernelnoMMU.o
OBJS_MMU030 = MMU030_asm.o MMU030.o enter_kernel030.o
OBJS_MMU040 = MMU040_asm.o MMU040.o enter_kernel040.o
OBJS_MMU = $(OBJS_MMU030) $(OBJS_MMU040)
OBJS_noMMU = enter_kernelnoMMU.o
OBJS_M68K = $(OBJS_MMU) $(OBJS_noMMU)
OBJS_PPC = enter_kernelPPC.o PPC_asm.o
@ -50,13 +53,13 @@ OBJS_ATA =
ifeq ("$(TARGET)", "m68k-linux")
OBJS_TARGET = $(OBJS_M68K) $(OBJS_LINUX_M68K)
CPPFLAGS_TARGET = -D__LINUX__ -DARCH_M68K
CPPFLAGS_TARGET = -D__LINUX__ -DARCH_M68K -DUSE_MMU030 -DUSE_MMU040
CFLAGS_TARGET = -m68020 -Wa,-m68020 -Os
else
ifeq ("$(TARGET)", "classic-linux")
OBJS_TARGET = $(OBJS_M68K) $(OBJS_LINUX_M68K)
OBJS_TARGET = $(OBJS_noMMU) $(OBJS_LINUX_M68K)
CPPFLAGS_TARGET = -D__LINUX__ -DARCH_M68K
CFLAGS_TARGET = -m68000 -Wa,-m68000 -Os
@ -71,14 +74,14 @@ else
ifeq ("$(TARGET)", "mixed-linux")
OBJS_TARGET = $(OBJS_M68K) $(OBJS_LINUX_M68K) $(OBJS_PPC) $(OBJS_LINUX_PPC)
CPPFLAGS_TARGET = -D__LINUX__ -DARCH_M68K -DARCH_PPC
CPPFLAGS_TARGET = -D__LINUX__ -DARCH_M68K -DUSE_MMU030 -DUSE_MMU040 -DARCH_PPC
CFLAGS_TARGET = -m68020 -Wa,-m68020 -Os
else
ifeq ("$(TARGET)", "m68k-netbsd")
OBJS_TARGET = $(OBJS_M68K) $(OBJS_NETBSD_M68K)
CPPFLAGS_TARGET = -D__NETBSD__ -DARCH_M68K
CPPFLAGS_TARGET = -D__NETBSD__ -DARCH_M68K -DUSE_MMU030 -DUSE_MMU040
CFLAGS_TARGET = -m68020 -Wa,-m68020 -Os
endif

View File

@ -96,9 +96,11 @@ static void bank_add_mem(unsigned long logiAddr,
#ifdef ARCH_M68K
void m68k_init_memory_map()
{
#ifdef USE_MMU
unsigned long logical;
unsigned long physical;
int ps;
#endif
memory_map.bank_number = 0;
if (mmu_type == gestaltNoMMU)
@ -112,6 +114,7 @@ void m68k_init_memory_map()
else
bank_add_mem(0, 0, MemTop);
}
#ifdef USE_MMU040
else if (mmu_type == gestalt68040MMU)
{
ps = MMU040_get_page_size();
@ -124,6 +127,8 @@ void m68k_init_memory_map()
}
}
}
#endif /* USE_MMU040 */
#ifdef USE_MMU030
else
{
ps = MMU030_get_page_size();
@ -136,6 +141,7 @@ void m68k_init_memory_map()
}
}
}
#endif /* USE_MMU030 */
}
#endif /* ARCH_M68K */
@ -185,6 +191,7 @@ void init_memory_map()
}
}
#ifdef USE_MMU
static int bank_find_by_physical(unsigned long physical)
{
int i;
@ -221,13 +228,16 @@ int logical2physical(unsigned long logical, unsigned long *physical)
return 0;
}
#ifdef ARCH_M68K
#if defined(ARCH_M68K)
#ifdef USE_MMU040
else if (mmu_type == gestalt68040MMU)
{
return MMU040_logical2physical(logical, physical);
}
#endif
#ifdef USE_MMU030
return MMU030_logical2physical(logical, physical);
#endif
#else
return 0;
#endif
@ -252,6 +262,18 @@ int physical2logical(unsigned long physical, unsigned long *logical)
return 0;
}
int check_full_in_bank(unsigned long start, unsigned long size)
{
int bank0;
int bank1;
bank0 = bank_find_by_logical(start);
bank1 = bank_find_by_logical(start + size);
return (bank0 == bank1);
}
#endif /* USE_MMU */
unsigned long bank_mem_avail()
{
int i;
@ -264,17 +286,7 @@ unsigned long bank_mem_avail()
return size;
}
int check_full_in_bank(unsigned long start, unsigned long size)
{
int bank0;
int bank1;
bank0 = bank_find_by_logical(start);
bank1 = bank_find_by_logical(start + size);
return (bank0 == bank1);
}
#ifdef USE_MMU
void *malloc_contiguous(size_t size)
{
void* tmp;
@ -285,7 +297,6 @@ void *malloc_contiguous(size_t size)
tmp = malloc(size);
if (tmp == NULL)
return NULL;
if (check_full_in_bank((unsigned long)tmp, size))
return tmp;
@ -303,6 +314,7 @@ void *malloc_contiguous(size_t size)
return contiguous;
}
#endif
void *malloc_top(size_t size)
{

View File

@ -6,6 +6,10 @@
#include <malloc.h>
#if defined(USE_MMU030) || defined(USE_MMU040)
#define USE_MMU
#endif
/* physical memory information */
#define MAX_MEM_MAP_SIZE 26
@ -27,8 +31,12 @@ extern memory_map_t memory_map;
extern void init_memory_map();
extern unsigned long bank_mem_avail();
extern void bank_dump();
#ifdef USE_MMU
extern int logical2physical(unsigned long logical, unsigned long *physical);
extern int physical2logical(unsigned long physical, unsigned long *logical);
extern int check_full_in_bank(unsigned long start, unsigned long size);
extern void *malloc_contiguous(size_t size);
#else
#define malloc_contiguous malloc
#endif
extern void *malloc_top(size_t size);

View File

@ -184,7 +184,11 @@ void bootinfo_init(char* command_line,
/* ramdisk info */
boot_info.ramdisk_size = ramdisk_size;
#ifdef USE_MMU
logical2physical((unsigned long)ramdisk_start, &boot_info.ramdisk_addr);
#else
boot_info.ramdisk_addr = (unsigned long)ramdisk_start;
#endif
/* command line */
@ -195,7 +199,11 @@ void bootinfo_init(char* command_line,
/* video information */
boot_info.bi_mac.videological = vga_get_video();
#ifdef USE_MMU
logical2physical(vga_get_videobase(), &boot_info.bi_mac.videoaddr);
#else
boot_info.bi_mac.videoaddr = vga_get_videobase();
#endif
boot_info.bi_mac.videorow = vga_get_row_bytes();
boot_info.bi_mac.videodepth = vga_get_depth();
boot_info.bi_mac.dimensions = (vga_get_height() << 16)
@ -212,8 +220,13 @@ void bootinfo_init(char* command_line,
boot_info.bi_mac.gmtbias = gmt_bias;
#ifdef USE_MMU
logical2physical(SCCRd, &boot_info.bi_mac.scc_read);
logical2physical(SCCWr, &boot_info.bi_mac.scc_write);
#else
boot_info.bi_mac.scc_read = SCCRd;
boot_info.bi_mac.scc_write = SCCWr;
#endif
boot_info.bi_mac.timedbra = TimeDBRA;
boot_info.bi_mac.adbdelay = TimeVIADB;
boot_info.bi_mac.serialmf = 0;

View File

@ -38,16 +38,15 @@
typedef void (*entry_t) (unsigned long , unsigned long , unsigned long, unsigned long );
typedef void (*disable_cache_t) (void);
extern void enter_kernelnoMMU(unsigned long addr, unsigned long size, unsigned long dest, unsigned long entry);
extern char end_enter_kernelnoMMU;
extern void noMMU_disable_cache(void);
extern void enter_kernel030(unsigned long addr, unsigned long size, unsigned long dest, unsigned long entry);
extern char end_enter_kernel030;
extern void MMU030_disable_cache(void);
extern void enter_kernel040(unsigned long addr, unsigned long size, unsigned long dest, unsigned long entry);
extern char end_enter_kernel040;
extern void MMU040_disable_cache(void);
#include "enter_kernelnoMMU.h"
#ifdef USE_MMU030
#include "enter_kernel030.h"
#include "MMU030.h"
#endif
#ifdef USE_MMU040
#include "enter_kernel040.h"
#include "MMU040.h"
#endif
#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
@ -68,14 +67,16 @@ int start(emile_l2_header_t* info)
{
char * kernel;
#ifdef ARCH_M68K
unsigned long physical;
entry_t entry;
unsigned long physImage;
disable_cache_t disable_cache;
#ifdef USE_MMU
unsigned long physical;
#ifdef __LINUX__
unsigned long aligned_size;
unsigned long aligned_addr;
#endif /* __LINUX__ */
#endif /* USE_MMU */
unsigned long enter_kernel;
unsigned long end_enter_kernel;
unsigned long start_mem;
@ -99,7 +100,11 @@ int start(emile_l2_header_t* info)
#if defined(ARCH_M68K) && defined(ARCH_PPC)
" (mixed mode)\n");
#elif defined(ARCH_M68K)
#ifdef USE_MMU
" on Motorola 680x0\n");
#else
" on Motorola 68000\n");
#endif /* USE_MMU */
#elif defined(ARCH_PPC)
" on PowerPC\n");
#else
@ -133,17 +138,25 @@ int start(emile_l2_header_t* info)
{
if (mmu_type == gestalt68040MMU)
{
#ifdef USE_MMU040
printf("Using 68040 MMU\n");
enter_kernel = (unsigned long)enter_kernel040;
end_enter_kernel = (unsigned long)&end_enter_kernel040;
disable_cache = MMU040_disable_cache;
#else
error("68040 MMU is not supported");
#endif
}
else if (mmu_type == gestalt68030MMU)
{
#ifdef USE_MMU030
printf("Using 68030 MMU\n");
enter_kernel = (unsigned long)enter_kernel030;
end_enter_kernel = (unsigned long)&end_enter_kernel030;
disable_cache = MMU030_disable_cache;
#else
error("68030 MMU is not supported");
#endif
}
else if (mmu_type == gestalt68851)
{
@ -157,7 +170,7 @@ int start(emile_l2_header_t* info)
disable_cache = noMMU_disable_cache;
}
else
error("Unknown MMU");
error("Unsupported MMU");
#if defined(__LINUX__)
/* and BI_ALLOC_SIZE for bootinfo */
@ -231,8 +244,10 @@ int start(emile_l2_header_t* info)
printf("Kernel image base at %p\n", kernel);
#ifdef USE_MMU
if (!check_full_in_bank((unsigned long)kernel, info->kernel_size))
error("Kernel between two banks, contact maintainer\n");
#endif
/* load kernel */
@ -290,8 +305,10 @@ int start(emile_l2_header_t* info)
if (ret == -1)
error("Cannot load ramdisk\n");
#ifdef USE_MMU
if (!check_full_in_bank(ramdisk_start, info->ramdisk_size))
error("ramdisk between two banks, contact maintainer\n");
#endif
}
else
{
@ -333,8 +350,10 @@ int start(emile_l2_header_t* info)
printf("Ok, booting the kernel.\n");
memcpy(entry, (char*)enter_kernel, size);
}
else
} else
#ifndef USE_MMU
error("Unsupported MMU");
#else
{
ret = logical2physical((unsigned long)kernel, &physImage);
@ -393,6 +412,7 @@ int start(emile_l2_header_t* info)
memcpy((char*)entry, (char*)enter_kernel, size);
}
}
#endif /* USE_MMU */
}
else
#ifndef ARCH_PPC