NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-xen/52016: Mismatch between mem_clusters and pmap_enter bounds check
On Tue, Feb 28, 2017 at 10:50:00PM +0000, coypu%sdf.org@localhost wrote:
> [...]
> >Fix:
> This is untested and somewhat of a hack.
> Maybe mem_clusters and pmap_enter should be made consistent.
>
> We can't just make pmap_enter fail with an error if it's out of bounds, because udv_fault will restart, then the process will spin making the same repeated syscall and failing. so fail with a panic call.
>
> Make Xen mm_md_physacc check for the same as pmap_enter does.
>
> Index: arch/x86/x86/x86_machdep.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/x86/x86/x86_machdep.c,v
> retrieving revision 1.89
> diff -u -p -u -r1.89 x86_machdep.c
> --- arch/x86/x86/x86_machdep.c 14 Feb 2017 13:29:09 -0000 1.89
> +++ arch/x86/x86/x86_machdep.c 28 Feb 2017 22:14:50 -0000
> @@ -175,6 +175,16 @@ mm_md_physacc(paddr_t pa, vm_prot_t prot
> extern phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX];
> extern int mem_cluster_cnt;
> int i;
> +#ifdef XEN
> + /*
> + * xen pmap_enter can't handle values outside this range
> + * but in mem_clusters, reading BIOS (dmidecode) will panic
> + */
> + extern paddr_t pmap_pa_start, pmap_pa_end;
> +
> + if (pa < pmap_pa_start || pmap_pa_end <= pa)
> + return EPERM;
> +#endif
>
> for (i = 0; i < mem_cluster_cnt; i++) {
> const phys_ram_seg_t *seg = &mem_clusters[i];
>
>
>
> And we could probably retire the hack in pmap_enter.
>
> Index: arch/xen/x86/xen_pmap.c
> ===================================================================
> RCS file: /cvsroot/src/sys/arch/xen/x86/xen_pmap.c,v
> retrieving revision 1.25
> diff -u -p -u -r1.25 xen_pmap.c
> --- arch/xen/x86/xen_pmap.c 26 Dec 2016 08:53:11 -0000 1.25
> +++ arch/xen/x86/xen_pmap.c 28 Feb 2017 22:14:50 -0000
> @@ -149,11 +149,10 @@ pmap_enter(struct pmap *pmap, vaddr_t va
> {
> paddr_t ma;
>
> - if (__predict_false(pa < pmap_pa_start || pmap_pa_end <= pa)) {
> - ma = pa; /* XXX hack */
> - } else {
> - ma = xpmap_ptom(pa);
> - }
> + if (__predict_false(pa < pmap_pa_start || pmap_pa_end <= pa))
> + panic("%s: Invalid memory address", __func__);
> +
> + ma = xpmap_ptom(pa);
>
> return pmap_enter_ma(pmap, va, ma, pa, prot, flags, DOMID_SELF);
> }
This is used by X11 to access the video adapter.
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Home |
Main Index |
Thread Index |
Old Index