/*
|
/*
|
** bootstrap.h -- This file is a part of the Atari bootloader.
|
** bootstrap.h -- This file is a part of the Atari bootloader.
|
**
|
**
|
** Copyright 1993 by Arjan Knor
|
** Copyright 1993 by Arjan Knor
|
**
|
**
|
** Modified by Andreas Schwab
|
** Modified by Andreas Schwab
|
** - clear transparent translation registers
|
** - clear transparent translation registers
|
**
|
**
|
** This file is subject to the terms and conditions of the GNU General Public
|
** This file is subject to the terms and conditions of the GNU General Public
|
** License. See the file COPYING in the main directory of this archive
|
** License. See the file COPYING in the main directory of this archive
|
** for more details.
|
** for more details.
|
**
|
**
|
*/
|
*/
|
|
|
#ifndef BOOTSTRAP_H
|
#ifndef BOOTSTRAP_H
|
#define BOOTSTRAP_H
|
#define BOOTSTRAP_H
|
|
|
/* _MCH cookie values */
|
/* _MCH cookie values */
|
#define MACH_ST 0
|
#define MACH_ST 0
|
#define MACH_STE 1
|
#define MACH_STE 1
|
#define MACH_TT 2
|
#define MACH_TT 2
|
#define MACH_FALCON 3
|
#define MACH_FALCON 3
|
|
|
/* some constants for memory handling */
|
/* some constants for memory handling */
|
#define ST_RAM 0
|
#define ST_RAM 0
|
#define TT_RAM 1
|
#define TT_RAM 1
|
#define TT_RAM_BASE (u_long)(0x01000000)
|
#define TT_RAM_BASE (u_long)(0x01000000)
|
#define MB (1024 * 1024)
|
#define MB (1024 * 1024)
|
#define START_MEM (bi.memory[0].addr)
|
#define START_MEM (bi.memory[0].addr)
|
#define MEM_SIZE (bi.memory[0].size)
|
#define MEM_SIZE (bi.memory[0].size)
|
|
|
/* the various CPU- and FPU-types */
|
/* the various CPU- and FPU-types */
|
#define AFF_68000 (1)
|
#define AFF_68000 (1)
|
#define AFF_68020 (2)
|
#define AFF_68020 (2)
|
#define AFF_68030 (4)
|
#define AFF_68030 (4)
|
#define AFF_68040 (8)
|
#define AFF_68040 (8)
|
#define AFF_68881 (16)
|
#define AFF_68881 (16)
|
#define AFF_68882 (32)
|
#define AFF_68882 (32)
|
|
|
/* the possible OS-languages */
|
/* the possible OS-languages */
|
#define USA 0
|
#define USA 0
|
#define FRG 1
|
#define FRG 1
|
#define FRA 2
|
#define FRA 2
|
#define UK 3
|
#define UK 3
|
#define SPA 4
|
#define SPA 4
|
#define ITA 5
|
#define ITA 5
|
#define SWE 6
|
#define SWE 6
|
#define SWF 7
|
#define SWF 7
|
#define SWG 8
|
#define SWG 8
|
#define TUR 9
|
#define TUR 9
|
#define FIN 10
|
#define FIN 10
|
#define NOR 11
|
#define NOR 11
|
#define DEN 12
|
#define DEN 12
|
#define SAU 13
|
#define SAU 13
|
#define HOL 14
|
#define HOL 14
|
|
|
/* some inline functions */
|
/* some inline functions */
|
|
|
static __inline int fpu_idle_frame_size (void)
|
static __inline int fpu_idle_frame_size (void)
|
{
|
{
|
char fpu_frame[216];
|
char fpu_frame[216];
|
__asm__ __volatile__ ("fnop"::);
|
__asm__ __volatile__ ("fnop"::);
|
__asm__ __volatile__ ("fsave %0@" : : "a" (fpu_frame));
|
__asm__ __volatile__ ("fsave %0@" : : "a" (fpu_frame));
|
return fpu_frame[1];
|
return fpu_frame[1];
|
}
|
}
|
|
|
static __inline void change_stack (u_long *stackp)
|
static __inline void change_stack (u_long *stackp)
|
{
|
{
|
__asm__ volatile ("movel %0,sp\n\t" :: "g" (stackp) : "sp");
|
__asm__ volatile ("movel %0,sp\n\t" :: "g" (stackp) : "sp");
|
}
|
}
|
|
|
static __inline void disable_interrupts (void)
|
static __inline void disable_interrupts (void)
|
{
|
{
|
__asm__ volatile ("orw #0x700,sr":);
|
__asm__ volatile ("orw #0x700,sr":);
|
}
|
}
|
|
|
extern struct bootinfo bi;
|
extern struct bootinfo bi;
|
static __inline void disable_cache (void)
|
static __inline void disable_cache (void)
|
{
|
{
|
__asm__ volatile ("movec %0,cacr" :: "d" (0));
|
__asm__ volatile ("movec %0,cacr" :: "d" (0));
|
if (bi.cputype & CPU_68060) {
|
if (bi.cputype & CPU_68060) {
|
/* '060: clear branch cache after disabling it;
|
/* '060: clear branch cache after disabling it;
|
* disable superscalar operation (and enable FPU) */
|
* disable superscalar operation (and enable FPU) */
|
__asm__ volatile ("movec %0,cacr" :: "d" (0x00400000));
|
__asm__ volatile ("movec %0,cacr" :: "d" (0x00400000));
|
__asm__ volatile ("moveq #0,d0;"
|
__asm__ volatile ("moveq #0,d0;"
|
".long 0x4e7b0808" /* movec d0,pcr */
|
".long 0x4e7b0808" /* movec d0,pcr */
|
: /* no outputs */
|
: /* no outputs */
|
: /* no inputs */
|
: /* no inputs */
|
: "d0");
|
: "d0");
|
}
|
}
|
}
|
}
|
|
|
static __inline void disable_mmu (void)
|
static __inline void disable_mmu (void)
|
{
|
{
|
if (bi.cputype & (CPU_68040|CPU_68060)) {
|
if (bi.cputype & (CPU_68040|CPU_68060)) {
|
__asm__ volatile ("moveq #0,d0;"
|
__asm__ volatile ("moveq #0,d0;"
|
".long 0x4e7b0003;" /* movec d0,tc */
|
".long 0x4e7b0003;" /* movec d0,tc */
|
".long 0x4e7b0004;" /* movec d0,itt0 */
|
".long 0x4e7b0004;" /* movec d0,itt0 */
|
".long 0x4e7b0005;" /* movec d0,itt1 */
|
".long 0x4e7b0005;" /* movec d0,itt1 */
|
".long 0x4e7b0006;" /* movec d0,dtt0 */
|
".long 0x4e7b0006;" /* movec d0,dtt0 */
|
".long 0x4e7b0007" /* movec d0,dtt1 */
|
".long 0x4e7b0007" /* movec d0,dtt1 */
|
: /* no outputs */
|
: /* no outputs */
|
: /* no inputs */
|
: /* no inputs */
|
: "d0");
|
: "d0");
|
}
|
}
|
else {
|
else {
|
__asm__ volatile ("subl #4,sp\n\t"
|
__asm__ volatile ("subl #4,sp\n\t"
|
"pmove tc,sp@\n\t"
|
"pmove tc,sp@\n\t"
|
"bclr #7,sp@\n\t"
|
"bclr #7,sp@\n\t"
|
"pmove sp@,tc\n\t"
|
"pmove sp@,tc\n\t"
|
"addl #4,sp");
|
"addl #4,sp");
|
if (bi.cputype & CPU_68030) {
|
if (bi.cputype & CPU_68030) {
|
__asm__ volatile ("clrl sp@-\n\t"
|
__asm__ volatile ("clrl sp@-\n\t"
|
".long 0xf0170800\n\t" /* pmove sp@,tt0 */
|
".long 0xf0170800\n\t" /* pmove sp@,tt0 */
|
".long 0xf0170c00\n\t" /* pmove sp@,tt1 */
|
".long 0xf0170c00\n\t" /* pmove sp@,tt1 */
|
"addl #4,sp\n");
|
"addl #4,sp\n");
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
static __inline void jump_to_mover (void *, void *, void *, void *, int, int,
|
static __inline void jump_to_mover (void *, void *, void *, void *, int, int,
|
void *) __attribute__ ((noreturn));
|
void *) __attribute__ ((noreturn));
|
static __inline void jump_to_mover (void *kernel_start, void *mem_start,
|
static __inline void jump_to_mover (void *kernel_start, void *mem_start,
|
void *ramdisk_end, void *mem_end,
|
void *ramdisk_end, void *mem_end,
|
int kernel_size, int ramdisk_size,
|
int kernel_size, int ramdisk_size,
|
void *mover_addr)
|
void *mover_addr)
|
{
|
{
|
asm volatile ("movel %0,a0\n\t"
|
asm volatile ("movel %0,a0\n\t"
|
"movel %1,a1\n\t"
|
"movel %1,a1\n\t"
|
"movel %2,a2\n\t"
|
"movel %2,a2\n\t"
|
"movel %3,a3\n\t"
|
"movel %3,a3\n\t"
|
"movel %4,d0\n\t"
|
"movel %4,d0\n\t"
|
"movel %5,d1\n\t"
|
"movel %5,d1\n\t"
|
"jmp %6@\n"
|
"jmp %6@\n"
|
: /* no outputs */
|
: /* no outputs */
|
: "g" (kernel_start), "g" (mem_start),
|
: "g" (kernel_start), "g" (mem_start),
|
"g" (ramdisk_end), "g" (mem_end),
|
"g" (ramdisk_end), "g" (mem_end),
|
"g" (kernel_size), "g" (ramdisk_size),
|
"g" (kernel_size), "g" (ramdisk_size),
|
"a" (mover_addr)
|
"a" (mover_addr)
|
: "a0", "a1", "a2", "a3", "d0", "d1");
|
: "a0", "a1", "a2", "a3", "d0", "d1");
|
|
|
/* Avoid warning that function may return */
|
/* Avoid warning that function may return */
|
for (;;) ;
|
for (;;) ;
|
}
|
}
|
|
|
#endif /* BOOTSTRAP_H */
|
#endif /* BOOTSTRAP_H */
|
|
|
|
|