diff options
author | Renato Botelho <renato@netgate.com> | 2016-12-05 15:53:29 -0200 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2016-12-05 15:53:29 -0200 |
commit | 812767d2bb4e201b4f826fd31924d2cafb8fe0ae (patch) | |
tree | 3e3dbc65eb273c201d08a9eaf227f857e2a62358 /sys/i386 | |
parent | c1d136c87f2377fd07592928003e67490eb479a6 (diff) | |
parent | b0e9d555db88639874b99e5151bf5981a8223322 (diff) | |
download | FreeBSD-src-812767d2bb4e201b4f826fd31924d2cafb8fe0ae.zip FreeBSD-src-812767d2bb4e201b4f826fd31924d2cafb8fe0ae.tar.gz |
Merge remote-tracking branch 'origin/stable/10' into devel
Diffstat (limited to 'sys/i386')
-rw-r--r-- | sys/i386/i386/initcpu.c | 20 | ||||
-rw-r--r-- | sys/i386/i386/mem.c | 13 | ||||
-rw-r--r-- | sys/i386/include/md_var.h | 14 |
3 files changed, 33 insertions, 14 deletions
diff --git a/sys/i386/i386/initcpu.c b/sys/i386/i386/initcpu.c index 705d915..7025021 100644 --- a/sys/i386/i386/initcpu.c +++ b/sys/i386/i386/initcpu.c @@ -785,16 +785,6 @@ initializecpu(void) init_transmeta(); break; } -#if defined(PAE) || defined(PAE_TABLES) - if ((amd_feature & AMDID_NX) != 0) { - uint64_t msr; - - msr = rdmsr(MSR_EFER) | EFER_NXE; - wrmsr(MSR_EFER, msr); - pg_nx = PG_NX; - elf32_nxstack = 1; - } -#endif break; #endif default: @@ -806,6 +796,16 @@ initializecpu(void) cpu_fxsr = hw_instruction_sse = 1; } #endif +#if defined(PAE) || defined(PAE_TABLES) + if ((amd_feature & AMDID_NX) != 0) { + uint64_t msr; + + msr = rdmsr(MSR_EFER) | EFER_NXE; + wrmsr(MSR_EFER, msr); + pg_nx = PG_NX; + elf32_nxstack = 1; + } +#endif } void diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c index b036bd3..003f207f 100644 --- a/sys/i386/i386/mem.c +++ b/sys/i386/i386/mem.c @@ -108,8 +108,11 @@ memrw(struct cdev *dev, struct uio *uio, int flags) continue; } if (dev2unit(dev) == CDEV_MINOR_MEM) { - pa = uio->uio_offset; - pa &= ~PAGE_MASK; + if (uio->uio_offset > cpu_getmaxphyaddr()) { + error = EFAULT; + break; + } + pa = trunc_page(uio->uio_offset); } else { /* * Extract the physical page since the mapping may @@ -161,9 +164,11 @@ int memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int prot __unused, vm_memattr_t *memattr __unused) { - if (dev2unit(dev) == CDEV_MINOR_MEM) + if (dev2unit(dev) == CDEV_MINOR_MEM) { + if (offset > cpu_getmaxphyaddr()) + return (-1); *paddr = offset; - else if (dev2unit(dev) == CDEV_MINOR_KMEM) + } else if (dev2unit(dev) == CDEV_MINOR_KMEM) *paddr = vtophys(offset); /* else panic! */ return (0); diff --git a/sys/i386/include/md_var.h b/sys/i386/include/md_var.h index 76254c2..c83ed5a 100644 --- a/sys/i386/include/md_var.h +++ b/sys/i386/include/md_var.h @@ -96,6 +96,20 @@ struct dbreg; struct dumperinfo; struct segment_descriptor; +/* + * Returns the maximum physical address that can be used with the + * current system. + */ +static __inline vm_paddr_t +cpu_getmaxphyaddr(void) +{ +#if !defined(PAE) + return (0xffffffff); +#else + return ((1ULL << cpu_maxphyaddr) - 1); +#endif +} + void *alloc_fpusave(int flags); void bcopyb(const void *from, void *to, size_t len); void busdma_swi(void); |