#include <linux/linkage.h>
#include <asm/asm-offsets.h>
#include <asm/page.h>
#include <asm/setup.h>
#define MMU_BASE 8
.text
ENTRY(relocate_new_kernel)
movel %sp@(4),%a0
movel %sp@(8),%a1
movel %sp@(12),%d1
movew #PAGE_MASK,%d2
btst #MMU_BASE + MMUB_68851,%d1
jeq 3f
1:
lea %pc@(.Lcopy),%a4
2: addl #0x00000000,%a4
.section .m68k_fixup,"aw"
.long M68K_FIXUP_MEMOFFSET, 2b+2
.previous
.chip 68030
pmove %tc,%d0
bclr #7,%d0
pmove %d0,%tc
jmp %a4@
.chip 68k
3:
btst #MMU_BASE + MMUB_68030,%d1
jne 1b
btst #MMU_BASE + MMUB_68040,%d1
jeq 6f
4:
lea %pc@(.Lcont040),%a4
5: addl #0x00000000,%a4
.section .m68k_fixup,"aw"
.long M68K_FIXUP_MEMOFFSET, 5b+2
.previous
movel %a4,%d0
andl #0xff000000,%d0
orw #0xe020,%d0
.chip 68040
movec %d0,%itt0
movec %d0,%dtt0
.chip 68k
jmp %a4@
.Lcont040:
moveq #0,%d0
.chip 68040
movec %d0,%tc
movec %d0,%itt0
movec %d0,%itt1
movec %d0,%dtt0
movec %d0,%dtt1
.chip 68k
jra .Lcopy
6:
btst #MMU_BASE + MMUB_68060,%d1
jne 4b
.Lcopy:
movel %a0@+,%d0
jeq .Lflush
btst #2,%d0
jne .Lflush
btst #1,%d0
jeq 1f
andw %d2,%d0
movel %d0,%a0
jra .Lcopy
1:
btst #0,%d0
jeq 2f
andw %d2,%d0
movel %d0,%a2
jra .Lcopy
2:
btst #3,%d0
jeq .Lcopy
andw %d2,%d0
movel %d0,%a3
movew #PAGE_SIZE/32 - 1,%d0
3:
movel %a3@+,%a2@+
movel %a3@+,%a2@+
movel %a3@+,%a2@+
movel %a3@+,%a2@+
movel %a3@+,%a2@+
movel %a3@+,%a2@+
movel %a3@+,%a2@+
movel %a3@+,%a2@+
dbf %d0, 3b
jra .Lcopy
.Lflush:
btst #CPUB_68020,%d1
jeq 2f
1:
.chip 68030
movec %cacr,%d0
orw #0x808,%d0
movec %d0,%cacr
.chip 68k
jra .Lreincarnate
2:
btst #CPUB_68030,%d1
jne 1b
btst #CPUB_68040,%d1
jeq 4f
3:
.chip 68040
nop
cpusha %bc
nop
cinva %bc
nop
.chip 68k
jra .Lreincarnate
4:
btst #CPUB_68060,%d1
jne 3b
.Lreincarnate:
jmp %a1@
relocate_new_kernel_end:
ENTRY(relocate_new_kernel_size)
.long relocate_new_kernel_end - relocate_new_kernel