Date: Tue, 31 Jul 2012 22:24:44 +0000 (UTC) From: Jakub Wojciech Klama <jceel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r238958 - user/jceel/soc2012_armv6/sys/arm/arm Message-ID: <201207312224.q6VMOjbC079161@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jceel Date: Tue Jul 31 22:24:44 2012 New Revision: 238958 URL: http://svn.freebsd.org/changeset/base/238958 Log: * Apply pmap_devmap enhancements to ARMv6 pmap. * Fix setting sc->gic_dev in GIC driver * Apply execute bit to vectors page (relevant on ARMv6) Modified: user/jceel/soc2012_armv6/sys/arm/arm/gic.c user/jceel/soc2012_armv6/sys/arm/arm/machdep.c user/jceel/soc2012_armv6/sys/arm/arm/pmap-v6.c Modified: user/jceel/soc2012_armv6/sys/arm/arm/gic.c ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/arm/gic.c Tue Jul 31 19:41:12 2012 (r238957) +++ user/jceel/soc2012_armv6/sys/arm/arm/gic.c Tue Jul 31 22:24:44 2012 (r238958) @@ -166,7 +166,9 @@ arm_gic_attach(device_t dev) if (bus_alloc_resources(dev, arm_gic_spec, sc->gic_res)) { device_printf(dev, "could not allocate resources\n"); return (ENXIO); - } + } + + sc->gic_dev = dev; /* Distributor Interface */ sc->gic_d_bst = rman_get_bustag(sc->gic_res[0]); @@ -282,7 +284,7 @@ static void arm_gic_unmask(device_t dev, int irq) { struct arm_gic_softc *sc = device_get_softc(dev); - + gic_c_write_4(sc, GICC_EOIR, irq); gic_d_write_4(sc, GICD_ISENABLER(irq >> 5), (1UL << (irq & 0x1F))); } Modified: user/jceel/soc2012_armv6/sys/arm/arm/machdep.c ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/arm/machdep.c Tue Jul 31 19:41:12 2012 (r238957) +++ user/jceel/soc2012_armv6/sys/arm/arm/machdep.c Tue Jul 31 22:24:44 2012 (r238958) @@ -883,7 +883,7 @@ arm_bootstrap_pagetables(uint32_t memsiz /* Link and map vectors page */ pmap_link_l2pt(l1pt->pv_va, ARM_VECTORS_HIGH, &l2pt[l2_needed - 1]); pmap_map_entry(l1pt->pv_va, ARM_VECTORS_HIGH, vectors->pv_pa, - VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE, PTE_CACHE); /* Map kernel and structures */ pmap_map_chunk(l1pt->pv_va, arm_start_va, arm_start_pa, Modified: user/jceel/soc2012_armv6/sys/arm/arm/pmap-v6.c ============================================================================== --- user/jceel/soc2012_armv6/sys/arm/arm/pmap-v6.c Tue Jul 31 19:41:12 2012 (r238957) +++ user/jceel/soc2012_armv6/sys/arm/arm/pmap-v6.c Tue Jul 31 22:24:44 2012 (r238958) @@ -3713,7 +3713,10 @@ pmap_devmap_bootstrap(vm_offset_t l1pt, pmap_devmap_table = table; - for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) { + for (i = 0; pmap_devmap_table[i].pd_size != 0 || pmap_devmap_table[i].pd_name != NULL ; i++) { + if (pmap_devmap_table[i].pd_size == 0) + continue; + #ifdef VERBOSE_INIT_ARM printf("devmap: %08x -> %08x @ %08x\n", pmap_devmap_table[i].pd_pa, @@ -3733,17 +3736,18 @@ const struct pmap_devmap * pmap_devmap_find_pa(vm_paddr_t pa, vm_size_t size) { int i; - + if (pmap_devmap_table == NULL) return (NULL); - - for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) { + + for (i = 0; pmap_devmap_table[i].pd_name != NULL || + pmap_devmap_table[i].pd_size != 0; i++) { if (pa >= pmap_devmap_table[i].pd_pa && pa + size <= pmap_devmap_table[i].pd_pa + pmap_devmap_table[i].pd_size) return (&pmap_devmap_table[i]); } - + return (NULL); } @@ -3755,7 +3759,8 @@ pmap_devmap_find_va(vm_offset_t va, vm_s if (pmap_devmap_table == NULL) return (NULL); - for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) { + for (i = 0; pmap_devmap_table[i].pd_name != NULL || + pmap_devmap_table[i].pd_size != 0; i++) { if (va >= pmap_devmap_table[i].pd_va && va + size <= pmap_devmap_table[i].pd_va + pmap_devmap_table[i].pd_size) @@ -3765,6 +3770,23 @@ pmap_devmap_find_va(vm_offset_t va, vm_s return (NULL); } +const struct pmap_devmap * +pmap_devmap_find_name(const char *name) +{ + int i; + + if (pmap_devmap_table == NULL) + return (NULL); + + for (i = 0; pmap_devmap_table[i].pd_name != NULL || + pmap_devmap_table[i].pd_size != 0; i++) { + if (!strcmp(name, pmap_devmap_table[i].pd_name)) + return (&pmap_devmap_table[i]); + } + + return (NULL); +} + int pmap_dmap_iscurrent(pmap_t pmap) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207312224.q6VMOjbC079161>