svn commit: r203151 - head/sys/mips/mips
Randall Stewart
rrs at lakerest.net
Fri Jan 29 05:29:29 UTC 2010
Good point ;-)
I will make some adjustments and fix it ;-)
R
On Jan 28, 2010, at 9:11 PM, Neel Natu wrote:
> Hi Randall,
>
> You should use restoreintr() instead of unconditionally enabling
> interrupts using enableintr().
>
> Otherwise these functions may end up inadvertently enabling interrupts
> if they are called with interrupts disabled to begin with.
>
> best
> Neel
>
> On Thu, Jan 28, 2010 at 8:07 PM, Randall Stewart <rrs at freebsd.org>
> wrote:
>> Author: rrs
>> Date: Fri Jan 29 04:07:38 2010
>> New Revision: 203151
>> URL: http://svn.freebsd.org/changeset/base/203151
>>
>> Log:
>> For our memory re-mapping trick to work
>> interrupts must be disabled through the
>> page_zero's or copys etc. Note that the
>> temporary mapping used by panic's may
>> cause us pain since int's may not be disabled.
>> When we get dumps working we may have to revist
>> this. Note that with this fix the build got
>> much much further.. until it hung on disk IO (I
>> would imagine thats the rge/msgring driver acting
>> up).
>>
>> Modified:
>> head/sys/mips/mips/pmap.c
>>
>> Modified: head/sys/mips/mips/pmap.c
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- head/sys/mips/mips/pmap.c Fri Jan 29 04:05:17 2010
>> (r203150)
>> +++ head/sys/mips/mips/pmap.c Fri Jan 29 04:07:38 2010
>> (r203151)
>> @@ -2101,14 +2101,20 @@ pmap_kenter_temporary(vm_paddr_t pa, int
>> } else {
>> int cpu;
>> struct local_sysmaps *sysm;
>> -
>> + /* If this is used other than for dumps, we may
>> need to leave
>> + * interrupts disasbled on return. If crash dumps
>> don't work when
>> + * we get to this point, we might want to consider
>> this (leaving things
>> + * disabled as a starting point ;-)
>> + */
>> + disableintr();
>> cpu = PCPU_GET(cpuid);
>> sysm = &sysmap_lmem[cpu];
>> /* Since this is for the debugger, no locks or any
>> other fun */
>> sysm->CMAP1 = mips_paddr_to_tlbpfn(pa) | PTE_RW |
>> PTE_V | PTE_G | PTE_W | PTE_CACHE;
>> - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> sysm->valid1 = 1;
>> + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> va = (vm_offset_t)sysm->CADDR1;
>> + enableintr();
>> }
>> return ((void *)va);
>> }
>> @@ -2126,7 +2132,9 @@ pmap_kenter_temporary_free(vm_paddr_t pa
>> cpu = PCPU_GET(cpuid);
>> sysm = &sysmap_lmem[cpu];
>> if (sysm->valid1) {
>> + disableintr();
>> pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1);
>> + enableintr();
>> sysm->CMAP1 = 0;
>> sysm->valid1 = 0;
>> }
>> @@ -2272,11 +2280,13 @@ pmap_zero_page(vm_page_t m)
>> sysm = &sysmap_lmem[cpu];
>> PMAP_LGMEM_LOCK(sysm);
>> sched_pin();
>> + disableintr();
>> sysm->CMAP1 = mips_paddr_to_tlbpfn(phys) | PTE_RW |
>> PTE_V | PTE_G | PTE_W | PTE_CACHE;
>> sysm->valid1 = 1;
>> pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> bzero(sysm->CADDR1, PAGE_SIZE);
>> pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1);
>> + enableintr();
>> sysm->CMAP1 = 0;
>> sysm->valid1 = 0;
>> sched_unpin();
>> @@ -2326,12 +2336,14 @@ pmap_zero_page_area(vm_page_t m, int off
>> cpu = PCPU_GET(cpuid);
>> sysm = &sysmap_lmem[cpu];
>> PMAP_LGMEM_LOCK(sysm);
>> + disableintr();
>> sched_pin();
>> sysm->CMAP1 = mips_paddr_to_tlbpfn(phys) | PTE_RW |
>> PTE_V | PTE_G | PTE_W | PTE_CACHE;
>> - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> sysm->valid1 = 1;
>> + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> bzero((char *)sysm->CADDR1 + off, size);
>> pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1);
>> + enableintr();
>> sysm->CMAP1 = 0;
>> sysm->valid1 = 0;
>> sched_unpin();
>> @@ -2365,12 +2377,14 @@ pmap_zero_page_idle(vm_page_t m)
>> cpu = PCPU_GET(cpuid);
>> sysm = &sysmap_lmem[cpu];
>> PMAP_LGMEM_LOCK(sysm);
>> + disableintr();
>> sched_pin();
>> sysm->CMAP1 = mips_paddr_to_tlbpfn(phys) | PTE_RW |
>> PTE_V | PTE_G | PTE_W | PTE_CACHE;
>> - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> sysm->valid1 = 1;
>> + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1,
>> sysm->CMAP1);
>> bzero(sysm->CADDR1, PAGE_SIZE);
>> pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1);
>> + enableintr();
>> sysm->CMAP1 = 0;
>> sysm->valid1 = 0;
>> sched_unpin();
>> @@ -2441,6 +2455,7 @@ pmap_copy_page(vm_page_t src, vm_page_t
>> sysm = &sysmap_lmem[cpu];
>> PMAP_LGMEM_LOCK(sysm);
>> sched_pin();
>> + disableintr();
>> if (phy_src < MIPS_KSEG0_LARGEST_PHYS) {
>> /* one side needs mapping - dest */
>> va_src = MIPS_PHYS_TO_CACHED(phy_src);
>> @@ -2476,6 +2491,7 @@ pmap_copy_page(vm_page_t src, vm_page_t
>> sysm->CMAP2 = 0;
>> sysm->valid2 = 0;
>> }
>> + enableintr();
>> sched_unpin();
>> PMAP_LGMEM_UNLOCK(sysm);
>> }
>>
>
------------------------------
Randall Stewart
803-317-4952 (cell)
803-345-0391(direct)
More information about the svn-src-head
mailing list