* Add atari memory map defs.
* Add osheader defs. * Check for FPU. * note on prg vs bootsector. * mmu stuff. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23468 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008, François Revol, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef ATARI_MEMORY_MAP_H
|
||||||
|
#define ATARI_MEMORY_MAP_H
|
||||||
|
|
||||||
|
#define ATARI_CHIPRAM_TOP_TT 0x00a00000
|
||||||
|
/* -> e00000 is VME for MegaST*/
|
||||||
|
#define ATARI_CHIPRAM_TOP_FALCON 0x00e00000
|
||||||
|
|
||||||
|
#define ATARI_ROM_BASE ATARI_CHIPRAM_TOP_FALCON
|
||||||
|
#define ATARI_ROM_TOP 0x00f00000
|
||||||
|
#define ATARI_IO_BASE ATARI_ROM_TOP
|
||||||
|
#define ATARI_CARTRIDGE_BASE 0x00fa0000
|
||||||
|
#define ATARI_OLD_ROM_BASE 0x00fc0000
|
||||||
|
|
||||||
|
#define ATARI_IO_TOP 0x01000000
|
||||||
|
#define ATARI_FASTRAM_TOP ATARI_IO_TOP
|
||||||
|
|
||||||
|
#define ATARI_SHADOW_BASE 0xff000000
|
||||||
|
|
||||||
|
#endif /* ATARI_MEMORY_MAP_H */
|
||||||
@@ -29,12 +29,15 @@
|
|||||||
# define TRACE(x) ;
|
# define TRACE(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#warning M68K: add set_vbr()
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
check_cpu_features()
|
check_cpu_features()
|
||||||
{
|
{
|
||||||
#warning M68K: TODO: probe ourselves, we shouldn't trust the TOS!
|
#warning M68K: TODO: probe ourselves, we shouldn't trust the TOS!
|
||||||
|
|
||||||
const tos_cookie *c = tos_find_cookie('_CPU');
|
const tos_cookie *c;
|
||||||
|
c = tos_find_cookie('_CPU');
|
||||||
if (!c) {
|
if (!c) {
|
||||||
panic("can't get a cookie (_CPU)! Mum, I'm hungry!");
|
panic("can't get a cookie (_CPU)! Mum, I'm hungry!");
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
@@ -47,6 +50,18 @@ check_cpu_features()
|
|||||||
gKernelArgs.arch_args.has_lpstop = (c->ivalue >= 60)?true:false;
|
gKernelArgs.arch_args.has_lpstop = (c->ivalue >= 60)?true:false;
|
||||||
#warning M68K: add cpu type to kern args
|
#warning M68K: add cpu type to kern args
|
||||||
|
|
||||||
|
c = tos_find_cookie('_FPU');
|
||||||
|
if (!c) {
|
||||||
|
panic("can't get a cookie (_FPU)! Mum, I'm hungry!");
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#warning M68K: check for fpu in detail
|
||||||
|
if (c->ivalue < 2 || c->ivalue > 7) {
|
||||||
|
panic("bad fpu");
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,36 +48,6 @@
|
|||||||
# define TRACE(x) ;
|
# define TRACE(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct gdt_idt_descr {
|
|
||||||
uint16 limit;
|
|
||||||
uint32 *base;
|
|
||||||
} _PACKED;
|
|
||||||
|
|
||||||
// memory structure returned by int 0x15, ax 0xe820
|
|
||||||
struct extended_memory {
|
|
||||||
uint64 base_addr;
|
|
||||||
uint64 length;
|
|
||||||
uint32 type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef _PXE_ENV
|
|
||||||
|
|
||||||
static const uint32 kDefaultPageTableFlags = 0x07; // present, user, R/W
|
|
||||||
static const size_t kMaxKernelSize = 0x100000; // 1 MB for the kernel
|
|
||||||
|
|
||||||
// working page directory and page table
|
|
||||||
static uint32 *sPageDirectory = 0;
|
|
||||||
|
|
||||||
static addr_t sNextPhysicalAddress = 0x112000;
|
|
||||||
static addr_t sNextVirtualAddress = KERNEL_BASE + kMaxKernelSize;
|
|
||||||
static addr_t sMaxVirtualAddress = KERNEL_BASE + 0x400000;
|
|
||||||
|
|
||||||
static addr_t sNextPageTableAddress = 0x7d000;
|
|
||||||
static const uint32 kPageTableRegionEnd = 0x8b000;
|
|
||||||
// we need to reserve 2 pages for the SMP trampoline code
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static const uint32 kDefaultPageTableFlags = 0x07; // present, user, R/W
|
static const uint32 kDefaultPageTableFlags = 0x07; // present, user, R/W
|
||||||
static const size_t kMaxKernelSize = 0x100000; // 1 MB for the kernel
|
static const size_t kMaxKernelSize = 0x100000; // 1 MB for the kernel
|
||||||
|
|
||||||
@@ -92,9 +62,6 @@ static addr_t sNextPageTableAddress = 0x90000;
|
|||||||
static const uint32 kPageTableRegionEnd = 0x9e000;
|
static const uint32 kPageTableRegionEnd = 0x9e000;
|
||||||
// we need to reserve 2 pages for the SMP trampoline code
|
// we need to reserve 2 pages for the SMP trampoline code
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static addr_t
|
static addr_t
|
||||||
get_next_virtual_address(size_t size)
|
get_next_virtual_address(size_t size)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ extern addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, uint3
|
|||||||
extern void *mmu_allocate(void *virtualAddress, size_t size);
|
extern void *mmu_allocate(void *virtualAddress, size_t size);
|
||||||
extern void mmu_free(void *virtualAddress, size_t size);
|
extern void mmu_free(void *virtualAddress, size_t size);
|
||||||
|
|
||||||
|
struct boot_mmu_ops {
|
||||||
|
// len=0 to disable
|
||||||
|
status_t (*set_tt)(int which, addr_t pa, size_t len, uint32 perms);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -73,6 +73,12 @@
|
|||||||
#define S_IFDIR 00000040000o
|
#define S_IFDIR 00000040000o
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: normal programs (.prg) run as user mode,
|
||||||
|
// while boot sector is chained in supervisor mode.
|
||||||
|
// this means using Super(SUP_INQUIRE) we can know
|
||||||
|
// from the same entry point if we were run from boot code or prg.
|
||||||
|
|
||||||
|
|
||||||
//Pterm0
|
//Pterm0
|
||||||
//move.w #1,%d0
|
//move.w #1,%d0
|
||||||
//trap #1
|
//trap #1
|
||||||
|
|||||||
@@ -129,6 +129,12 @@ extern int32 xbios(uint16 nr, ...);
|
|||||||
|
|
||||||
extern int32 gemdos(uint16 nr, ...);
|
extern int32 gemdos(uint16 nr, ...);
|
||||||
|
|
||||||
|
#define SUP_USER 0
|
||||||
|
#define SUP_SUPER 1
|
||||||
|
|
||||||
|
#define SUP_SET (void *)0
|
||||||
|
#define SUP_INQUIRE (void *)1
|
||||||
|
|
||||||
// official names
|
// official names
|
||||||
#define Pterm0() gemdos(0)
|
#define Pterm0() gemdos(0)
|
||||||
#define Cconin() gemdos(1)
|
#define Cconin() gemdos(1)
|
||||||
@@ -167,6 +173,33 @@ static inline const tos_cookie *tos_find_cookie(uint32 what)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* OSHEADER access
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct tos_osheader {
|
||||||
|
uint16 os_entry;
|
||||||
|
uint16 os_version;
|
||||||
|
void *reseth;
|
||||||
|
struct tos_osheader *os_beg;
|
||||||
|
void *os_end;
|
||||||
|
void *os_rsv1;
|
||||||
|
void *os_magic;
|
||||||
|
uint32 os_date;
|
||||||
|
uint32 os_conf;
|
||||||
|
//uint32/16? os_dosdate;
|
||||||
|
// ... more stuff we don't care about
|
||||||
|
} tos_osheader;
|
||||||
|
|
||||||
|
#define tos_sysbase ((const struct tos_osheader **)0x4F2)
|
||||||
|
|
||||||
|
static inline const struct tos_osheader *tos_get_osheader()
|
||||||
|
{
|
||||||
|
if (!(*tos_sysbase))
|
||||||
|
return NULL;
|
||||||
|
return (*tos_sysbase)->os_beg;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __ASSEMBLER__ */
|
#endif /* __ASSEMBLER__ */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
Reference in New Issue
Block a user