mirror of
https://github.com/vivier/EMILE.git
synced 2025-02-25 23:29:10 +00:00
add USE_MMU, USE_MMU030, USE_MMU040
This commit is contained in:
parent
e864052a45
commit
7e7ae6ca7b
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user