#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: atari_init.c,v 1.120 2026/05/30 10:10:11 thorpej Exp $");
#include "opt_ddb.h"
#include "opt_mbtype.h"
#include "opt_m060sp.h"
#include "opt_m68k_arch.h"
#include "opt_st_pool_size.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/tty.h>
#include <sys/buf.h>
#include <sys/msgbuf.h>
#include <sys/mbuf.h>
#include <sys/protosw.h>
#include <sys/domain.h>
#include <sys/reboot.h>
#include <sys/exec.h>
#include <sys/exec_aout.h>
#include <sys/core.h>
#include <sys/kcore.h>
#include <sys/bus.h>
#include <uvm/uvm_extern.h>
#include <machine/vmparam.h>
#include <machine/pte.h>
#include <machine/cpu.h>
#include <machine/iomap.h>
#include <machine/mfp.h>
#include <machine/scu.h>
#include <machine/acia.h>
#include <machine/kcore.h>
#include <machine/intr.h>
#include <machine/vectors.h>
#include <m68k/cpu.h>
#include <m68k/cacheops.h>
#include <m68k/pcr.h>
#include <atari/atari/stalloc.h>
#include <atari/dev/clockvar.h>
#include <atari/dev/ym2149reg.h>
#include "pci.h"
void *start_c(int, u_int, u_int, u_int, char *);
static void atari_hwinit(void);
static void cpu_init_kcorehdr(paddr_t, paddr_t);
static void initcpu(void);
static void mmu030_setup(paddr_t, u_int, paddr_t, psize_t, paddr_t, paddr_t);
static void map_io_areas(paddr_t, psize_t, u_int);
static void set_machtype(void);
#if defined(M68040) || defined(M68060)
static void mmu040_setup(paddr_t, u_int, paddr_t, psize_t, paddr_t, paddr_t);
#endif
#if defined(_MILANHW_)
static u_int milan_probe_bank_1(paddr_t paddr);
static u_int milan_probe_bank(paddr_t paddr);
#define NBANK 2
#define NSLOT 4
#define MB(n) ((n) * 1024 * 1024)
#define MB_END(n) (MB(n) - 1)
#define MAGIC_4M (4 - 1)
#define MAGIC_4M_INV ((uint8_t)~MAGIC_4M)
#define MAGIC_8M (8 - 1)
#define MAGIC_16M (16 - 1)
#define MAGIC_32M (32 - 1)
#define MAGIC_64M (64 - 1)
#endif
static cpu_kcore_hdr_t cpu_kcore_hdr;
extern u_int lowram;
int machineid, mmutype, cputype;
extern char *esym;
extern struct pcb *curpcb;
vaddr_t page_zero;
#define ST_POOL_SIZE_MIN 24
#ifndef ST_POOL_SIZE
#define ST_POOL_SIZE 56
#endif
psize_t st_pool_size = ST_POOL_SIZE * PAGE_SIZE;
vaddr_t st_pool_virt;
paddr_t st_pool_phys;
#define STRAM_MINTHRESH (2 * 1024 * 1024)
#define TTRAM_MINTHRESH (4 * 1024 * 1024)
vaddr_t stio_addr;
vaddr_t pci_conf_addr;
vaddr_t pci_io_addr;
vaddr_t pci_mem_addr;
vaddr_t pci_mem_uncached;
#ifndef RELOC_KERNEL
#define RELOC_KERNEL 0
#endif
int reloc_kernel = RELOC_KERNEL;
#define RELOC_PA(base, pa) ((base) + (pa))
int kernel_copyback = 1;
void *
start_c(int id, u_int ttphystart, u_int ttphysize, u_int stphysize,
char *esym_addr)
{
extern char end[];
extern void etext(void);
paddr_t pstart;
vaddr_t vstart;
vsize_t avail;
paddr_t ptpa;
psize_t ptsize;
u_int ptextra;
vaddr_t kva;
u_int i;
pt_entry_t *pg, *epg;
pt_entry_t pg_proto;
vaddr_t end_loaded;
paddr_t kbase;
u_int kstsize;
paddr_t Sysptmap_pa;
#if defined(_MILANHW_)
const paddr_t simm_base[NBANK][NSLOT] = {
{ 0x00000000, 0x04000000, 0x08000000, 0x0c000000 },
{ 0x10000000, 0x14000000, 0x18000000, 0x1c000000 }
};
int slot, bank, seg;
u_int mb;
reloc_kernel = 0;
seg = 0;
ttphysize = 0;
for (bank = 0; bank < 2; bank++) {
for (slot = 0; slot < 4; slot++) {
if (bank == 0 && slot == 0) {
mb = milan_probe_bank_1(simm_base[bank][slot]);
boot_segs[0].start = 0;
boot_segs[0].end = MB(mb);
stphysize = MB(mb);
seg++;
} else {
mb = milan_probe_bank(simm_base[bank][slot]);
if (mb > 0) {
boot_segs[seg].start =
simm_base[bank][slot];
boot_segs[seg].end =
simm_base[bank][slot] + MB(mb);
ttphysize += MB(mb);
seg++;
}
}
}
}
#else
boot_segs[0].start = 0;
boot_segs[0].end = stphysize;
boot_segs[1].start = ttphystart;
boot_segs[1].end = ttphystart + ttphysize;
boot_segs[2].start = boot_segs[2].end = 0;
#endif
if (st_pool_size > ST_POOL_SIZE_MIN * PAGE_SIZE &&
(stphysize <= STRAM_MINTHRESH || ttphysize <= TTRAM_MINTHRESH)) {
st_pool_size = ST_POOL_SIZE_MIN * PAGE_SIZE;
}
st_pool_size = m68k_round_page(st_pool_size);
st_pool_phys = stphysize - st_pool_size;
stphysize = st_pool_phys;
physmem = btoc(stphysize) + btoc(ttphysize);
machineid = id;
esym = esym_addr;
if (esym == NULL)
end_loaded = (vaddr_t)&end;
else
end_loaded = (vaddr_t)esym;
if ((reloc_kernel != 0) && (ttphysize >= end_loaded))
kbase = ttphystart;
else
kbase = 0;
set_machtype();
initcpu();
vstart = (vaddr_t)end_loaded;
vstart = m68k_round_page(vstart);
pstart = (paddr_t)vstart;
avail = stphysize - pstart;
lwp0uarea = vstart;
pstart += USPACE;
vstart += USPACE;
avail -= USPACE;
#if defined(M68040) || defined(M68060)
if (mmutype == MMU_68040)
kstsize = MAXKL2SIZE / (NPTEPG/SG4_LEV2SIZE);
else
#endif
kstsize = 1;
Sysseg_pa = pstart;
Sysseg = (st_entry_t *)vstart;
pstart += kstsize * PAGE_SIZE;
vstart += kstsize * PAGE_SIZE;
avail -= kstsize * PAGE_SIZE;
Sysptmap_pa = pstart;
Sysptmap = (pt_entry_t *)vstart;
pstart += PAGE_SIZE;
vstart += PAGE_SIZE;
avail -= PAGE_SIZE;
ptextra = btoc(STIO_SIZE);
if (machineid & ATARI_HADES)
ptextra += btoc(PCI_CONFIG_SIZE + PCI_IO_SIZE + PCI_MEM_SIZE);
if (machineid & ATARI_MILAN)
ptextra += btoc(PCI_IO_SIZE + PCI_MEM_SIZE);
ptextra += btoc(BOOTM_VA_POOL);
ptextra += physmem;
ptpa = pstart;
ptsize = (Sysptsize + howmany(ptextra, NPTEPG)) << PGSHIFT;
pstart += ptsize;
vstart += ptsize;
avail -= ptsize;
Sysmap = (pt_entry_t *)SYSMAP_VA;
#if defined(M68040) || defined(M68060)
if (mmutype == MMU_68040)
mmu040_setup(Sysseg_pa, kstsize, ptpa, ptsize, Sysptmap_pa,
kbase);
else
#endif
mmu030_setup(Sysseg_pa, kstsize, ptpa, ptsize, Sysptmap_pa,
kbase);
pg_proto = RELOC_PA(kbase, 0) | PG_RO | PG_V;
pg = (pt_entry_t *)ptpa;
*pg++ = PG_NV;
pg_proto += PAGE_SIZE;
for (kva = PAGE_SIZE; kva < (vaddr_t)etext; kva += PAGE_SIZE) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
pg_proto = (pg_proto & PG_FRAME) | PG_RW | PG_V;
#if defined(M68040) || defined(M68060)
if (mmutype == MMU_68040) {
if (kernel_copyback)
pg_proto |= PG_CCB;
for (; kva < (vaddr_t)Sysseg; kva += PAGE_SIZE) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
pg_proto = (pg_proto & ~PG_CCB) | PG_CI;
for (; kva < (vaddr_t)Sysptmap; kva += PAGE_SIZE) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
pg_proto = (pg_proto & ~PG_CI);
if (kernel_copyback)
pg_proto |= PG_CCB;
}
#endif
for (; kva < vstart; kva += PAGE_SIZE) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
epg = (pt_entry_t *)ptpa;
epg = &epg[ptsize / sizeof(pt_entry_t)];
while (pg < epg)
*pg++ = PG_NV;
map_io_areas(ptpa, ptsize, ptextra);
st_pool_virt = vstart;
pg = (pt_entry_t *)ptpa;
pg = &pg[vstart / PAGE_SIZE];
pg_proto = st_pool_phys | PG_RW | PG_CI | PG_V;
vstart += st_pool_size;
while (pg_proto < (st_pool_phys + st_pool_size)) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
page_zero = vstart;
pg = (pt_entry_t *)ptpa;
pg = &pg[vstart / PAGE_SIZE];
*pg++ = PG_RW | PG_CI | PG_V;
vstart += PAGE_SIZE;
*pg = PG_RW | PG_CI | PG_V | PAGE_SIZE;
vstart += PAGE_SIZE;
if (kbase) {
Sysseg_pa += kbase;
Sysptmap_pa += kbase;
}
lowram = 0 >> PGSHIFT;
usable_segs[0].start = 0;
usable_segs[0].end = stphysize;
usable_segs[0].free_list = VM_FREELIST_STRAM;
#if defined(_MILANHW_)
for (i = 1; i < seg; i++) {
usable_segs[i].start = boot_segs[i].start;
usable_segs[i].end = boot_segs[i].end;
usable_segs[i].free_list = VM_FREELIST_TTRAM;
}
for (; i < NMEM_SEGS; i++) {
usable_segs[i].start = usable_segs[i].end = 0;
}
#else
usable_segs[1].start = ttphystart;
usable_segs[1].end = ttphystart + ttphysize;
usable_segs[1].free_list = VM_FREELIST_TTRAM;
usable_segs[2].start = usable_segs[2].end = 0;
#endif
if (kbase) {
usable_segs[0].start = PAGE_SIZE;
usable_segs[1].start += pstart;
} else
usable_segs[0].start += pstart;
usable_segs[0].first_page = 0;
for (i = 1; i < NMEM_SEGS && usable_segs[i].start; i++) {
usable_segs[i].first_page = usable_segs[i-1].first_page;
usable_segs[i].first_page +=
(usable_segs[i-1].end - usable_segs[i-1].start) / PAGE_SIZE;
}
for (i = 0, physmem = 0; usable_segs[i].start; i++)
physmem += usable_segs[i].end - usable_segs[i].start;
physmem >>= PGSHIFT;
pmap_bootstrap(vstart);
cpu_init_kcorehdr(kbase, Sysseg_pa);
if (kbase) {
register paddr_t *lp, *le, *fp;
lp = (paddr_t *)0;
le = (paddr_t *)pstart;
fp = (paddr_t *)kbase;
while (lp < le)
*fp++ = *lp++;
}
#if defined(M68040) || defined(M68060)
if (mmutype == MMU_68040) {
if (cputype == CPU_68060) {
__asm volatile (".word 0x4e7a,0x0002;"
"orl #0x400000,%%d0;"
".word 0x4e7b,0x0002" : : : "d0");
}
__asm volatile ("movel %0,%%a0;"
".word 0x4e7b,0x8807" : : "a" (Sysseg_pa) : "a0");
__asm volatile (".word 0xf518" : : );
__asm volatile ("movel #0xc000,%%d0;"
".word 0x4e7b,0x0003" : : : "d0" );
} else
#endif
{
#if defined(M68030)
protorp[1] = Sysseg_pa;
__asm volatile ("pmove %0@,%%srp" : : "a" (&protorp[0]));
u_int tc = MMU51_TCR_BITS;
__asm volatile ("pflusha" : : );
__asm volatile ("pmove %0@,%%tc" : : "a" (&tc));
#endif
}
void *ksp = pmap_bootstrap2();
atari_hwinit();
init_stmem();
atari_bus_space_arena_init(0x0, 0xffffffff);
for (i = 0; i < NMEM_SEGS && boot_segs[i].end != 0; i++) {
if (atari_bus_space_alloc_physmem(boot_segs[i].start,
boot_segs[i].end)) {
printf("Warning: Cannot allocate boot memory from"
" extent map!?\n");
}
}
intr_init();
return ksp;
}
#if defined(_MILANHW_)
static u_int
milan_probe_bank_1(paddr_t start_paddr)
{
volatile uint8_t *base;
u_int mb;
uint8_t save_16, save_32, save_64;
mb = 16;
base = (uint8_t *)start_paddr;
save_16 = base[MB_END(16)];
base[MB_END(16)] = MAGIC_16M;
if (badbaddr(base + MB_END(32))) {
goto out16;
}
save_32 = base[MB_END(32)];
base[MB_END(32)] = MAGIC_32M;
if (base[MB_END(32)] != MAGIC_32M || base[MB_END(16)] != MAGIC_16M) {
goto out16;
}
mb = 32;
if (badbaddr(base + MB_END(64))) {
goto out32;
}
save_64 = base[MB_END(64)];
base[MB_END(64)] = MAGIC_64M;
if (base[MB_END(64)] != MAGIC_64M || base[MB_END(32)] != MAGIC_32M) {
goto out32;
}
mb = 64;
base[MB_END(64)] = save_64;
out32:
base[MB_END(32)] = save_32;
out16:
base[MB_END(16)] = save_16;
return mb;
}
static u_int
milan_probe_bank(paddr_t start_paddr)
{
volatile uint8_t *base;
u_int mb;
uint8_t save_4, save_8, save_16;
mb = 0;
base = (uint8_t *)start_paddr;
if (badbaddr(base + MB_END(4))) {
goto out;
}
save_4 = base[MB_END(4)];
base[MB_END(4)] = MAGIC_4M_INV;
if (base[MB_END(4)] != MAGIC_4M_INV) {
goto out;
}
base[MB_END(4)] = MAGIC_4M;
if (base[MB_END(4)] != MAGIC_4M) {
goto out;
}
mb = 4;
if (badbaddr(base + MB_END(8))) {
goto out4;
}
save_8 = base[MB_END(8)];
base[MB_END(8)] = MAGIC_8M;
if (base[MB_END(8)] != MAGIC_8M || base[MB_END(4)] != MAGIC_4M) {
goto out4;
}
mb = 8;
if (badbaddr(base + MB_END(16))) {
goto out8;
}
save_16 = base[MB_END(16)];
base[MB_END(16)] = MAGIC_16M;
if (base[MB_END(16)] != MAGIC_16M || base[MB_END(8)] != MAGIC_8M) {
goto out8;
}
mb = milan_probe_bank_1(start_paddr);
base[MB_END(16)] = save_16;
out8:
base[MB_END(8)] = save_8;
out4:
base[MB_END(4)] = save_4;
out:
return mb;
}
#endif
static void
set_machtype(void)
{
#ifdef _MILANHW_
machineid |= ATARI_MILAN;
#else
stio_addr = 0xff8000;
if (badbaddr(&MFP2->mf_gpip)) {
if (!badbaddr(&MFP->mf_gpip)) {
machineid |= ATARI_FALCON;
return;
}
}
if (!badbaddr((void *)(PCI_CONFB_PHYS + PCI_CONFM_PHYS)))
machineid |= ATARI_HADES;
else
machineid |= ATARI_TT;
#endif
}
static void
atari_hwinit(void)
{
#if defined(_ATARIHW_)
ym2149_init();
MDI->ac_cs = 0;
#endif
MFP->mf_iera = MFP->mf_ierb = 0;
MFP->mf_imra = MFP->mf_imrb = 0;
MFP->mf_aer = MFP->mf_ddr = 0;
MFP->mf_vr = 0x40;
#if defined(_ATARIHW_)
if (machineid & (ATARI_TT|ATARI_HADES)) {
MFP2->mf_iera = MFP2->mf_ierb = 0;
MFP2->mf_imra = MFP2->mf_imrb = 0;
MFP2->mf_aer = 0x80;
MFP2->mf_vr = 0x50;
}
if (machineid & ATARI_TT) {
SCU->sys_mask = SCU_SYS_SOFT;
SCU->vme_mask = SCU_MFP | SCU_SCC;
#ifdef DDB
SCU->sys_mask |= SCU_IRQ7;
#endif
}
#endif
init_delay();
#if NPCI > 0
if (machineid & (ATARI_HADES|ATARI_MILAN)) {
init_pci_bus();
}
#endif
}
static void
map_io_areas(paddr_t ptpa, psize_t ptsize, u_int ptextra)
{
vaddr_t ioaddr;
pt_entry_t *pt, *pg, *epg;
pt_entry_t pg_proto;
u_long mask;
pt = (pt_entry_t *)ptpa;
ioaddr = ((ptsize / sizeof(pt_entry_t)) - ptextra) * PAGE_SIZE;
stio_addr = ioaddr;
ioaddr += STIO_SIZE;
pg = &pt[stio_addr / PAGE_SIZE];
epg = &pg[btoc(STIO_SIZE)];
#ifdef _MILANHW_
pg_proto = STIO_PHYS | PG_RW | PG_CI | PG_V | 0x100;
#else
pg_proto = STIO_PHYS | PG_RW | PG_CI | PG_V;
#endif
while (pg < epg) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
if (machineid & ATARI_HADES) {
pci_conf_addr = ioaddr;
ioaddr += PCI_CONFIG_SIZE;
pg = &pt[pci_conf_addr / PAGE_SIZE];
epg = &pg[btoc(PCI_CONFIG_SIZE)];
mask = PCI_CONFM_PHYS;
pg_proto = PCI_CONFB_PHYS | PG_RW | PG_CI | PG_V;
for (; pg < epg; mask <<= 1)
*pg++ = pg_proto | mask;
} else
pci_conf_addr = 0;
if (machineid & (ATARI_HADES|ATARI_MILAN)) {
pci_io_addr = ioaddr;
ioaddr += PCI_IO_SIZE;
pg = &pt[pci_io_addr / PAGE_SIZE];
epg = &pg[btoc(PCI_IO_SIZE)];
pg_proto = PCI_IO_PHYS | PG_RW | PG_CI | PG_V;
while (pg < epg) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
pci_mem_addr = ioaddr;
pci_mem_uncached = ioaddr;
ioaddr += PCI_MEM_SIZE;
epg = &pg[btoc(PCI_MEM_SIZE)];
pg_proto = PCI_VGA_PHYS | PG_RW | PG_CI | PG_V;
while (pg < epg) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
}
bootm_init(ioaddr, pg, BOOTM_VA_POOL);
}
#define CHDRSIZE (ALIGN(sizeof(kcore_seg_t)) + ALIGN(sizeof(cpu_kcore_hdr_t)))
#define MDHDRSIZE roundup(CHDRSIZE, dbtob(1))
int
cpu_dumpsize(void)
{
return btodb(MDHDRSIZE);
}
int
cpu_dump(int (*dump)(dev_t, daddr_t, void *, size_t), daddr_t *p_blkno)
{
int buf[MDHDRSIZE/sizeof(int)];
int error;
kcore_seg_t *kseg_p;
cpu_kcore_hdr_t *chdr_p;
kseg_p = (kcore_seg_t *)buf;
chdr_p = (cpu_kcore_hdr_t *)&buf[ALIGN(sizeof(*kseg_p)) / sizeof(int)];
CORE_SETMAGIC(*kseg_p, KCORE_MAGIC, MID_MACHINE, CORE_CPU);
kseg_p->c_size = MDHDRSIZE - ALIGN(sizeof(*kseg_p));
*chdr_p = cpu_kcore_hdr;
error = dump(dumpdev, *p_blkno, (void *)buf, sizeof(buf));
*p_blkno += btodb(sizeof(buf));
return (error);
}
#if (M68K_NPHYS_RAM_SEGS < NMEM_SEGS)
#error "Configuration error: M68K_NPHYS_RAM_SEGS < NMEM_SEGS"
#endif
static void
cpu_init_kcorehdr(paddr_t kbase, paddr_t sysseg_pa)
{
cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
struct m68k_kcore_hdr *m = &h->un._m68k;
extern char end[];
int i;
memset(&cpu_kcore_hdr, 0, sizeof(cpu_kcore_hdr));
strcpy(h->name, machine);
h->page_size = PAGE_SIZE;
h->kernbase = KERNBASE;
m->mmutype = mmutype;
m->sg_v = SG_V;
m->sg_frame = SG_FRAME;
m->sg_ishift = SG_ISHIFT;
m->sg_pmask = SG_PMASK;
m->sg40_shift1 = SG4_SHIFT1;
m->sg40_mask2 = SG4_MASK2;
m->sg40_shift2 = SG4_SHIFT2;
m->sg40_mask3 = SG4_MASK3;
m->sg40_shift3 = SG4_SHIFT3;
m->sg40_addr1 = SG4_ADDR1;
m->sg40_addr2 = SG4_ADDR2;
m->pg_v = PG_V;
m->pg_frame = PG_FRAME;
m->sysseg_pa = sysseg_pa;
m->reloc = kbase;
m->relocend = (vaddr_t)end;
for (i = 0; i < NMEM_SEGS; i++) {
m->ram_segs[i].start = boot_segs[i].start;
m->ram_segs[i].size = boot_segs[i].end -
boot_segs[i].start;
}
}
void
mmu030_setup(paddr_t sysseg_pa, u_int kstsize, paddr_t ptpa, psize_t ptsize,
paddr_t sysptmap_pa, paddr_t kbase)
{
st_entry_t sg_proto, *sg, *esg;
pt_entry_t pg_proto, *pg, *epg;
sg = (st_entry_t *)sysseg_pa;
pg = (pt_entry_t *)sysptmap_pa;
epg = &pg[ptsize >> PGSHIFT];
sg_proto = RELOC_PA(kbase, ptpa) | SG_RW | SG_V;
pg_proto = RELOC_PA(kbase, ptpa) | PG_RW | PG_CI | PG_V;
while (pg < epg) {
*sg++ = sg_proto;
*pg++ = pg_proto;
sg_proto += PAGE_SIZE;
pg_proto += PAGE_SIZE;
}
esg = (st_entry_t *)sysseg_pa;
esg = &esg[TIA_SIZE];
while (sg < esg)
*sg++ = SG_NV;
epg = (pt_entry_t *)sysptmap_pa;
epg = &epg[TIB_SIZE];
while (pg < epg)
*pg++ = PG_NV;
sg = (st_entry_t *)sysseg_pa;
sg = &sg[SYSMAP_VA >> SEGSHIFT];
pg = (pt_entry_t *)sysptmap_pa;
pg = &pg[SYSMAP_VA >> SEGSHIFT];
*sg = RELOC_PA(kbase, sysptmap_pa) | SG_RW | SG_V;
*pg = RELOC_PA(kbase, sysptmap_pa) | PG_RW | PG_CI | PG_V;
}
#if defined(M68040) || defined(M68060)
void
mmu040_setup(paddr_t sysseg_pa, u_int kstsize, paddr_t ptpa, psize_t ptsize,
paddr_t sysptmap_pa, paddr_t kbase)
{
int nl1desc, nl2desc, i;
st_entry_t sg_proto, *sg, *esg;
pt_entry_t pg_proto, *pg, *epg;
sg = (st_entry_t *)sysseg_pa;
esg = &sg[kstsize * NPTEPG];
while (sg < esg)
*sg++ = SG_NV;
nl2desc = (ptsize >> PGSHIFT) * (NPTEPG / SG4_LEV3SIZE);
sg = (st_entry_t *)sysseg_pa;
sg = &sg[SG4_LEV1SIZE];
esg = &sg[nl2desc];
sg_proto = RELOC_PA(kbase, ptpa) | SG_U | SG_RW | SG_V;
while (sg < esg) {
*sg++ = sg_proto;
sg_proto += (SG4_LEV3SIZE * sizeof(st_entry_t));
}
nl1desc = howmany(nl2desc, SG4_LEV2SIZE);
sg = (st_entry_t *)sysseg_pa;
esg = &sg[nl1desc];
sg_proto = RELOC_PA(kbase, (paddr_t)&sg[SG4_LEV1SIZE])
| SG_U | SG_RW | SG_V;
while (sg < esg) {
*sg++ = sg_proto;
sg_proto += (SG4_LEV2SIZE * sizeof(st_entry_t));
}
sg = (st_entry_t *)sysseg_pa;
sg = &sg[SG4_LEV1SIZE - 1];
*sg = sg_proto;
i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE);
sg = (st_entry_t *)sysseg_pa;
sg = &sg[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE)];
esg = &sg[NPTEPG / SG4_LEV3SIZE];
sg_proto = RELOC_PA(kbase, sysptmap_pa) | SG_U | SG_RW | SG_V;
while (sg < esg) {
*sg++ = sg_proto;
sg_proto += (SG4_LEV3SIZE * sizeof(st_entry_t));
}
protostfree = (~0 << (1 + nl1desc + 1)) ;
pg = (pt_entry_t *)sysptmap_pa;
epg = &pg[ptsize >> PGSHIFT];
pg_proto = RELOC_PA(kbase, ptpa) | PG_RW | PG_CI | PG_V;
while (pg < epg) {
*pg++ = pg_proto;
pg_proto += PAGE_SIZE;
}
epg = (pt_entry_t *)sysptmap_pa;
epg = &epg[TIB_SIZE];
while (pg < epg)
*pg++ = PG_NV;
pg = (pt_entry_t *)sysptmap_pa;
pg = &pg[SYSMAP_VA >> SEGSHIFT];
*pg = RELOC_PA(kbase, sysptmap_pa) | PG_RW | PG_CI | PG_V;
}
#endif
#if defined(M68060)
int m68060_pcr_init = PCR_ESS;
#endif
static void
initcpu(void)
{
#if defined(M68060)
if (cputype == CPU_68060) {
__asm volatile ("movl %0,%%d0; .word 0x4e7b,0x0808" : :
"d"(m68060_pcr_init):"d0" );
}
#endif
vec_init();
}
#ifdef DEBUG
void dump_segtable(u_int *);
void dump_pagetable(u_int *, u_int, u_int);
u_int vmtophys(u_int *, u_int);
void
dump_segtable(u_int *stp)
{
u_int *s, *es;
int shift, i;
s = stp;
{
es = s + (M68K_STSIZE >> 2);
shift = SG_ISHIFT;
}
for (i = 0; s < es; s++, i++)
if (*s & SG_V)
printf("$%08x: $%08x\t", i << shift, *s & SG_FRAME);
printf("\n");
}
void
dump_pagetable(u_int *ptp, u_int i, u_int n)
{
u_int *p, *ep;
p = ptp + i;
ep = p + n;
for (; p < ep; p++, i++)
if (*p & PG_V)
printf("$%08x -> $%08x\t", i, *p & PG_FRAME);
printf("\n");
}
u_int
vmtophys(u_int *ste, u_int vm)
{
ste = (u_int *)(*(ste + (vm >> SEGSHIFT)) & SG_FRAME);
ste += (vm & SG_PMASK) >> PGSHIFT;
return (*ste & -PAGE_SIZE) | (vm & (PAGE_SIZE - 1));
}
#endif