From owner-p4-projects@FreeBSD.ORG Wed Feb 25 16:24:42 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BEBBC1065677; Wed, 25 Feb 2009 16:24:41 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 74FBE106564A for ; Wed, 25 Feb 2009 16:24:41 +0000 (UTC) (envelope-from bz@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 576C98FC08 for ; Wed, 25 Feb 2009 16:24:41 +0000 (UTC) (envelope-from bz@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PGOf9N089148 for ; Wed, 25 Feb 2009 16:24:41 GMT (envelope-from bz@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n1PGOfrs089146 for perforce@freebsd.org; Wed, 25 Feb 2009 16:24:41 GMT (envelope-from bz@freebsd.org) Date: Wed, 25 Feb 2009 16:24:41 GMT Message-Id: <200902251624.n1PGOfrs089146@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bz@freebsd.org using -f From: "Bjoern A. Zeeb" To: Perforce Change Reviews Cc: Subject: PERFORCE change 158267 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 16:24:43 -0000 http://perforce.freebsd.org/chv.cgi?CH=158267 Change 158267 by bz@bz_dumpster on 2009/02/25 16:23:55 Move code around and to proper locations. Prepare for the pmap update, more clenaup, ... a bit of the bootstrapping ocde just does not work anymore as expected. Affected files ... .. //depot/projects/s390/sys/conf/files.s390#8 edit .. //depot/projects/s390/sys/s390/include/pmap.h#5 edit .. //depot/projects/s390/sys/s390/s390/esa.h#5 edit .. //depot/projects/s390/sys/s390/s390/machdep.c#14 edit Differences ... ==== //depot/projects/s390/sys/conf/files.s390#8 (text+ko) ==== @@ -91,7 +91,8 @@ s390/s390/mcheck.c standard s390/s390/mem.c standard s390/s390/mp_machdep.c optional smp -s390/s390/pmap.c standard +#s390/s390/pmap.c standard +s390/s390/pmap_bz.c standard s390/s390/service.c standard s390/s390/stack_machdep.c optional ddb | stack s390/s390/support.S standard ==== //depot/projects/s390/sys/s390/include/pmap.h#5 (text+ko) ==== @@ -81,8 +81,6 @@ typedef struct pmap *pmap_t; #ifdef _KERNEL -extern pmap_t kernel_pmap; - #define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) #define PMAP_LOCK_ASSERT(pmap, type) \ mtx_assert(&(pmap)->pm_mtx, (type)) @@ -117,7 +115,9 @@ extern vm_offset_t virtual_avail; extern vm_offset_t virtual_end; -void *pmap_kenter_temporary(vm_paddr_t pa, int i); +void pmap_kenter(vm_offset_t va, vm_paddr_t pa); +void *pmap_kenter_temporary(vm_paddr_t pa, int i); +void pmap_kremove(vm_offset_t); #endif /* !LOCORE */ ==== //depot/projects/s390/sys/s390/s390/esa.h#5 (text+ko) ==== @@ -24,8 +24,6 @@ void css_init_info(void); void io_intr(struct trapframe *tf); void io_intr_entry(struct trapframe *tf); -void pmap_kenter(vm_offset_t va, vm_paddr_t pa); -void pmap_kremove(vm_offset_t va); extern uint8_t esa_sm_per; extern int esa_features; ==== //depot/projects/s390/sys/s390/s390/machdep.c#14 (text+ko) ==== @@ -101,6 +101,12 @@ #include #include #include +#include + +vm_paddr_t phys_avail[128]; +long Maxmem = 0; +vm_paddr_t avail_start; /* pa of first available physical page */ +vm_paddr_t avail_end; /* pa of first non-available physical page */ static struct trapframe frame0; @@ -112,13 +118,160 @@ int cold = 1; long realmem = 0; +static unsigned nkptp; +static ste_t *proc0sto; +/* For the page copying/zeroing routines. */ +vm_offset_t csrc_ptepa, cdst_ptepa, z_ptepa, zi_ptepa; struct msgbuf *msgbufp; +SET_DECLARE(dat_init_set, struct dat_init_map); + +DAT_INIT_MAP(proc0sto, proc0sto, NKPTP0 + 1); DAT_INIT_MAP(kstack0, kstack0, KSTACK_PAGES + 1); DAT_INIT_MAP(msgbufp, msgbufp, atop(round_page(MSGBUF_SIZE))); DAT_INIT_MAP(pcpu, sysarea.pcpu, 1); +#define pte_valid(pte) (((pte) & PTE_INVALID) == 0) + +static void +ipte(vm_paddr_t ptepa) +{ + pte_t pte; + + KASSERT(ptepa, ("ipte: ptepa == 0")); + + pte = lura(ptepa); + if (pte_valid(pte)) { + u_long pto, px; + + pto = ptepa & ~(PTSIZE - 1); + px = (ptepa - pto) << (PX_SHIFT - 2); + + __asm volatile ( + " ipte %[pto], %[px]" + :: [pto]"r"(pto), [px]"r"(px) : "memory"); + } +} + +static vm_paddr_t +dat_init_map(int n) +{ + vm_paddr_t pa = avail_start; + + avail_start += n * PAGE_SIZE; + + KASSERT(avail_start < avail_end, + ("pmap_steal_page: insufficient memory")); + + virtual_avail += n * PAGE_SIZE; + + return (pa); +} + +void +dat_init(void) +{ + struct dat_init_map **dimp; + vm_offset_t va; + ste_t *ste; + pte_t *pte; + int i; + + /* Find out the size of physical memory. */ + psw_define(&sysarea.program_new_psw, PSW_0, (u_long)&&last_page); + + sk_set(0, SK_RW); + avail_end = PAGE_SIZE; + while (tprot(avail_end)) { + sk_set(avail_end, SK_RW); + avail_end += PAGE_SIZE; + } + +last_page: + Maxmem = physmem = atop(avail_end); + virtual_avail = avail_start = (vm_offset_t)_end; + virtual_end = VM_MAX_KERNEL_ADDRESS; + + SET_FOREACH(dimp, dat_init_set) { + *(*dimp)->vap = dat_init_map((*dimp)->n); + } + + phys_avail[0] = avail_start; + phys_avail[1] = avail_end; + phys_avail[2] = 0; + +#if 0 + sysarea.pcpu = (struct pcpu *) + (pmap_bootstrap_map(1) + EXTENDED_SAVE_AREA_SIZE); +#ifdef SMP + /* + * Sysarea and pcpu pages for APs. + * Not in bsme because of variable size. + */ + mp_sysarea = pmap_bootstrap_map((mp_ncpus - 1) * SYSAREA_PAGES); + mp_pcpu = pmap_bootstrap_map(mp_ncpus - 1); +#endif +#endif + /* Create identical virtual-to-physical kernel mapping. */ + nkptp = NKPTP0; + pte = (pte_t *)proc0sto + NPTEP; + for (va = 0; va < virtual_avail; va += PAGE_SIZE) + *pte++ = va; + for (; va < virtual_end; va += PAGE_SIZE) + *pte++ = PTE_INVALID; + pte = (pte_t *)proc0sto + NPTEP; + ste = proc0sto; + for (i = 0; i < NKPTP0*4; i++, pte += NPTEST) + *ste++ = STE_PTL | STE_PTO(pte); + for (; i < NKPTP*4; i++) + *ste++ = STE_INVALID; + + /* Initialize the kernel pmap. */ +#if 0 + kernel_pmap = &kernel_pmap_store; +#endif + + PMAP_LOCK_INIT(kernel_pmap); + kernel_pmap->pm_sto = proc0sto; + kernel_pmap->pm_active = ~0; + TAILQ_INIT(&kernel_pmap->pm_pvlist); + + /* Now let's enable DAT. */ + cr_write(CR1, STD_PRIMARY(proc0sto)); + + /* Why svc? Why not? */ + psw_define(&sysarea.svc_new_psw, + PSW_0 | PSW_T | PSW_M | PSW_KEY, (u_long)&&DAT_enabled); + lpsw(&sysarea.svc_new_psw); + +DAT_enabled: +#ifdef BZ_HAS_TODO_TO_MAKE_IT_COMPILE + csrc_ptepa = pmap_ptepa(kernel_pmap, (vm_offset_t)csrc_va); + cdst_ptepa = pmap_ptepa(kernel_pmap, (vm_offset_t)cdst_va); + z_ptepa = pmap_ptepa(kernel_pmap, (vm_offset_t)z_va); + zi_ptepa = pmap_ptepa(kernel_pmap, (vm_offset_t)zi_va); +#endif + ipte(csrc_ptepa); + ipte(cdst_ptepa); + ipte(z_ptepa); + ipte(zi_ptepa); + + /* Guard pages for stacks. */ +#ifdef BZ_HAS_TODO_TO_MAKE_IT_COMPILE + ipte(pmap_ptepa(kernel_pmap, kstack0)); +#endif + kstack0 += PAGE_SIZE; + +#ifdef DDB +#ifdef BZ_HAS_TODO_TO_MAKE_IT_COMPILE + ipte(pmap_ptepa(kernel_pmap, ddbstack)); + ddbstack += PAGE_SIZE; +#endif +#endif +} + + void io_intr(struct trapframe *tf) {