Merge commit 'origin' into master
Manual merge of: arch/powerpc/Kconfig arch/powerpc/include/asm/page.h
This commit is contained in:
@@ -359,8 +359,8 @@ int main(void)
|
||||
|
||||
DEFINE(VCPU_HOST_STACK, offsetof(struct kvm_vcpu, arch.host_stack));
|
||||
DEFINE(VCPU_HOST_PID, offsetof(struct kvm_vcpu, arch.host_pid));
|
||||
DEFINE(VCPU_HOST_TLB, offsetof(struct kvm_vcpu, arch.host_tlb));
|
||||
DEFINE(VCPU_SHADOW_TLB, offsetof(struct kvm_vcpu, arch.shadow_tlb));
|
||||
DEFINE(VCPU_SHADOW_MOD, offsetof(struct kvm_vcpu, arch.shadow_tlb_mod));
|
||||
DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr));
|
||||
DEFINE(VCPU_LR, offsetof(struct kvm_vcpu, arch.lr));
|
||||
DEFINE(VCPU_CR, offsetof(struct kvm_vcpu, arch.cr));
|
||||
@@ -372,7 +372,7 @@ int main(void)
|
||||
DEFINE(VCPU_SPRG5, offsetof(struct kvm_vcpu, arch.sprg5));
|
||||
DEFINE(VCPU_SPRG6, offsetof(struct kvm_vcpu, arch.sprg6));
|
||||
DEFINE(VCPU_SPRG7, offsetof(struct kvm_vcpu, arch.sprg7));
|
||||
DEFINE(VCPU_PID, offsetof(struct kvm_vcpu, arch.pid));
|
||||
DEFINE(VCPU_SHADOW_PID, offsetof(struct kvm_vcpu, arch.shadow_pid));
|
||||
|
||||
DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst));
|
||||
DEFINE(VCPU_FAULT_DEAR, offsetof(struct kvm_vcpu, arch.fault_dear));
|
||||
|
@@ -27,6 +27,9 @@
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
/* Stores the physical address of elf header of crash image. */
|
||||
unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX;
|
||||
|
||||
void __init reserve_kdump_trampoline(void)
|
||||
{
|
||||
lmb_reserve(0, KDUMP_RESERVE_LIMIT);
|
||||
@@ -66,7 +69,11 @@ void __init setup_kdump_trampoline(void)
|
||||
DBG(" <- setup_kdump_trampoline()\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_VMCORE
|
||||
/*
|
||||
* Note: elfcorehdr_addr is not just limited to vmcore. It is also used by
|
||||
* is_kdump_kernel() to determine if we are booting after a panic. Hence
|
||||
* ifdef it under CONFIG_CRASH_DUMP and not CONFIG_PROC_VMCORE.
|
||||
*/
|
||||
static int __init parse_elfcorehdr(char *p)
|
||||
{
|
||||
if (p)
|
||||
@@ -75,7 +82,6 @@ static int __init parse_elfcorehdr(char *p)
|
||||
return 1;
|
||||
}
|
||||
__setup("elfcorehdr=", parse_elfcorehdr);
|
||||
#endif
|
||||
|
||||
static int __init parse_savemaxmem(char *p)
|
||||
{
|
||||
|
@@ -51,17 +51,6 @@ static int protect4gb = 1;
|
||||
|
||||
static void __iommu_free(struct iommu_table *, dma_addr_t, unsigned int);
|
||||
|
||||
static inline unsigned long iommu_num_pages(unsigned long vaddr,
|
||||
unsigned long slen)
|
||||
{
|
||||
unsigned long npages;
|
||||
|
||||
npages = IOMMU_PAGE_ALIGN(vaddr + slen) - (vaddr & IOMMU_PAGE_MASK);
|
||||
npages >>= IOMMU_PAGE_SHIFT;
|
||||
|
||||
return npages;
|
||||
}
|
||||
|
||||
static int __init setup_protect4gb(char *str)
|
||||
{
|
||||
if (strcmp(str, "on") == 0)
|
||||
@@ -325,7 +314,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
||||
}
|
||||
/* Allocate iommu entries for that segment */
|
||||
vaddr = (unsigned long) sg_virt(s);
|
||||
npages = iommu_num_pages(vaddr, slen);
|
||||
npages = iommu_num_pages(vaddr, slen, IOMMU_PAGE_SIZE);
|
||||
align = 0;
|
||||
if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && slen >= PAGE_SIZE &&
|
||||
(vaddr & ~PAGE_MASK) == 0)
|
||||
@@ -418,7 +407,8 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
||||
unsigned long vaddr, npages;
|
||||
|
||||
vaddr = s->dma_address & IOMMU_PAGE_MASK;
|
||||
npages = iommu_num_pages(s->dma_address, s->dma_length);
|
||||
npages = iommu_num_pages(s->dma_address, s->dma_length,
|
||||
IOMMU_PAGE_SIZE);
|
||||
__iommu_free(tbl, vaddr, npages);
|
||||
s->dma_address = DMA_ERROR_CODE;
|
||||
s->dma_length = 0;
|
||||
@@ -452,7 +442,8 @@ void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist,
|
||||
|
||||
if (sg->dma_length == 0)
|
||||
break;
|
||||
npages = iommu_num_pages(dma_handle, sg->dma_length);
|
||||
npages = iommu_num_pages(dma_handle, sg->dma_length,
|
||||
IOMMU_PAGE_SIZE);
|
||||
__iommu_free(tbl, dma_handle, npages);
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
@@ -584,7 +575,7 @@ dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl,
|
||||
BUG_ON(direction == DMA_NONE);
|
||||
|
||||
uaddr = (unsigned long)vaddr;
|
||||
npages = iommu_num_pages(uaddr, size);
|
||||
npages = iommu_num_pages(uaddr, size, IOMMU_PAGE_SIZE);
|
||||
|
||||
if (tbl) {
|
||||
align = 0;
|
||||
@@ -617,7 +608,7 @@ void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
|
||||
BUG_ON(direction == DMA_NONE);
|
||||
|
||||
if (tbl) {
|
||||
npages = iommu_num_pages(dma_handle, size);
|
||||
npages = iommu_num_pages(dma_handle, size, IOMMU_PAGE_SIZE);
|
||||
iommu_free(tbl, dma_handle, npages);
|
||||
}
|
||||
}
|
||||
|
@@ -451,7 +451,8 @@ pgprot_t pci_phys_mem_access_prot(struct file *file,
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
DBG("non-PCI map for %lx, prot: %lx\n", offset, prot);
|
||||
DBG("non-PCI map for %llx, prot: %lx\n",
|
||||
(unsigned long long)offset, prot);
|
||||
|
||||
return __pgprot(prot);
|
||||
}
|
||||
@@ -490,6 +491,131 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* This provides legacy IO read access on a bus */
|
||||
int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val, size_t size)
|
||||
{
|
||||
unsigned long offset;
|
||||
struct pci_controller *hose = pci_bus_to_host(bus);
|
||||
struct resource *rp = &hose->io_resource;
|
||||
void __iomem *addr;
|
||||
|
||||
/* Check if port can be supported by that bus. We only check
|
||||
* the ranges of the PHB though, not the bus itself as the rules
|
||||
* for forwarding legacy cycles down bridges are not our problem
|
||||
* here. So if the host bridge supports it, we do it.
|
||||
*/
|
||||
offset = (unsigned long)hose->io_base_virt - _IO_BASE;
|
||||
offset += port;
|
||||
|
||||
if (!(rp->flags & IORESOURCE_IO))
|
||||
return -ENXIO;
|
||||
if (offset < rp->start || (offset + size) > rp->end)
|
||||
return -ENXIO;
|
||||
addr = hose->io_base_virt + port;
|
||||
|
||||
switch(size) {
|
||||
case 1:
|
||||
*((u8 *)val) = in_8(addr);
|
||||
return 1;
|
||||
case 2:
|
||||
if (port & 1)
|
||||
return -EINVAL;
|
||||
*((u16 *)val) = in_le16(addr);
|
||||
return 2;
|
||||
case 4:
|
||||
if (port & 3)
|
||||
return -EINVAL;
|
||||
*((u32 *)val) = in_le32(addr);
|
||||
return 4;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* This provides legacy IO write access on a bus */
|
||||
int pci_legacy_write(struct pci_bus *bus, loff_t port, u32 val, size_t size)
|
||||
{
|
||||
unsigned long offset;
|
||||
struct pci_controller *hose = pci_bus_to_host(bus);
|
||||
struct resource *rp = &hose->io_resource;
|
||||
void __iomem *addr;
|
||||
|
||||
/* Check if port can be supported by that bus. We only check
|
||||
* the ranges of the PHB though, not the bus itself as the rules
|
||||
* for forwarding legacy cycles down bridges are not our problem
|
||||
* here. So if the host bridge supports it, we do it.
|
||||
*/
|
||||
offset = (unsigned long)hose->io_base_virt - _IO_BASE;
|
||||
offset += port;
|
||||
|
||||
if (!(rp->flags & IORESOURCE_IO))
|
||||
return -ENXIO;
|
||||
if (offset < rp->start || (offset + size) > rp->end)
|
||||
return -ENXIO;
|
||||
addr = hose->io_base_virt + port;
|
||||
|
||||
/* WARNING: The generic code is idiotic. It gets passed a pointer
|
||||
* to what can be a 1, 2 or 4 byte quantity and always reads that
|
||||
* as a u32, which means that we have to correct the location of
|
||||
* the data read within those 32 bits for size 1 and 2
|
||||
*/
|
||||
switch(size) {
|
||||
case 1:
|
||||
out_8(addr, val >> 24);
|
||||
return 1;
|
||||
case 2:
|
||||
if (port & 1)
|
||||
return -EINVAL;
|
||||
out_le16(addr, val >> 16);
|
||||
return 2;
|
||||
case 4:
|
||||
if (port & 3)
|
||||
return -EINVAL;
|
||||
out_le32(addr, val);
|
||||
return 4;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* This provides legacy IO or memory mmap access on a bus */
|
||||
int pci_mmap_legacy_page_range(struct pci_bus *bus,
|
||||
struct vm_area_struct *vma,
|
||||
enum pci_mmap_state mmap_state)
|
||||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(bus);
|
||||
resource_size_t offset =
|
||||
((resource_size_t)vma->vm_pgoff) << PAGE_SHIFT;
|
||||
resource_size_t size = vma->vm_end - vma->vm_start;
|
||||
struct resource *rp;
|
||||
|
||||
pr_debug("pci_mmap_legacy_page_range(%04x:%02x, %s @%llx..%llx)\n",
|
||||
pci_domain_nr(bus), bus->number,
|
||||
mmap_state == pci_mmap_mem ? "MEM" : "IO",
|
||||
(unsigned long long)offset,
|
||||
(unsigned long long)(offset + size - 1));
|
||||
|
||||
if (mmap_state == pci_mmap_mem) {
|
||||
if ((offset + size) > hose->isa_mem_size)
|
||||
return -ENXIO;
|
||||
offset += hose->isa_mem_phys;
|
||||
} else {
|
||||
unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE;
|
||||
unsigned long roffset = offset + io_offset;
|
||||
rp = &hose->io_resource;
|
||||
if (!(rp->flags & IORESOURCE_IO))
|
||||
return -ENXIO;
|
||||
if (roffset < rp->start || (roffset + size) > rp->end)
|
||||
return -ENXIO;
|
||||
offset += hose->io_base_phys;
|
||||
}
|
||||
pr_debug(" -> mapping phys %llx\n", (unsigned long long)offset);
|
||||
|
||||
vma->vm_pgoff = offset >> PAGE_SHIFT;
|
||||
vma->vm_page_prot |= _PAGE_NO_CACHE | _PAGE_GUARDED;
|
||||
return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
void pci_resource_to_user(const struct pci_dev *dev, int bar,
|
||||
const struct resource *rsrc,
|
||||
resource_size_t *start, resource_size_t *end)
|
||||
@@ -592,6 +718,12 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||
cpu_addr = of_translate_address(dev, ranges + 3);
|
||||
size = of_read_number(ranges + pna + 3, 2);
|
||||
ranges += np;
|
||||
|
||||
/* If we failed translation or got a zero-sized region
|
||||
* (some FW try to feed us with non sensical zero sized regions
|
||||
* such as power3 which look like some kind of attempt at exposing
|
||||
* the VGA memory hole)
|
||||
*/
|
||||
if (cpu_addr == OF_BAD_ADDR || size == 0)
|
||||
continue;
|
||||
|
||||
@@ -665,6 +797,8 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||
isa_hole = memno;
|
||||
if (primary || isa_mem_base == 0)
|
||||
isa_mem_base = cpu_addr;
|
||||
hose->isa_mem_phys = cpu_addr;
|
||||
hose->isa_mem_size = size;
|
||||
}
|
||||
|
||||
/* We get the PCI/Mem offset from the first range or
|
||||
|
@@ -61,42 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,
|
||||
return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x));
|
||||
}
|
||||
|
||||
int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
|
||||
{
|
||||
compat_ino_t ino;
|
||||
long err;
|
||||
|
||||
if (stat->size > MAX_NON_LFS || !new_valid_dev(stat->dev) ||
|
||||
!new_valid_dev(stat->rdev))
|
||||
return -EOVERFLOW;
|
||||
|
||||
ino = stat->ino;
|
||||
if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino)
|
||||
return -EOVERFLOW;
|
||||
|
||||
err = access_ok(VERIFY_WRITE, statbuf, sizeof(*statbuf)) ? 0 : -EFAULT;
|
||||
err |= __put_user(new_encode_dev(stat->dev), &statbuf->st_dev);
|
||||
err |= __put_user(ino, &statbuf->st_ino);
|
||||
err |= __put_user(stat->mode, &statbuf->st_mode);
|
||||
err |= __put_user(stat->nlink, &statbuf->st_nlink);
|
||||
err |= __put_user(stat->uid, &statbuf->st_uid);
|
||||
err |= __put_user(stat->gid, &statbuf->st_gid);
|
||||
err |= __put_user(new_encode_dev(stat->rdev), &statbuf->st_rdev);
|
||||
err |= __put_user(stat->size, &statbuf->st_size);
|
||||
err |= __put_user(stat->atime.tv_sec, &statbuf->st_atime);
|
||||
err |= __put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
|
||||
err |= __put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
|
||||
err |= __put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec);
|
||||
err |= __put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
|
||||
err |= __put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec);
|
||||
err |= __put_user(stat->blksize, &statbuf->st_blksize);
|
||||
err |= __put_user(stat->blocks, &statbuf->st_blocks);
|
||||
err |= __put_user(0, &statbuf->__unused4[0]);
|
||||
err |= __put_user(0, &statbuf->__unused4[1]);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Note: it is necessary to treat option as an unsigned int,
|
||||
* with the corresponding cast to a signed int to insure that the
|
||||
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
|
||||
@@ -107,69 +71,6 @@ asmlinkage long compat_sys_sysfs(u32 option, u32 arg1, u32 arg2)
|
||||
return sys_sysfs((int)option, arg1, arg2);
|
||||
}
|
||||
|
||||
static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i)
|
||||
{
|
||||
long usec;
|
||||
|
||||
if (!access_ok(VERIFY_READ, i, sizeof(*i)))
|
||||
return -EFAULT;
|
||||
if (__get_user(o->tv_sec, &i->tv_sec))
|
||||
return -EFAULT;
|
||||
if (__get_user(usec, &i->tv_usec))
|
||||
return -EFAULT;
|
||||
o->tv_nsec = usec * 1000;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i)
|
||||
{
|
||||
return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
|
||||
(__put_user(i->tv_sec, &o->tv_sec) |
|
||||
__put_user(i->tv_usec, &o->tv_usec)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Translations due to time_t size differences. Which affects all
|
||||
sorts of things, like timeval and itimerval. */
|
||||
extern struct timezone sys_tz;
|
||||
|
||||
asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
|
||||
{
|
||||
if (tv) {
|
||||
struct timeval ktv;
|
||||
do_gettimeofday(&ktv);
|
||||
if (put_tv32(tv, &ktv))
|
||||
return -EFAULT;
|
||||
}
|
||||
if (tz) {
|
||||
if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
|
||||
{
|
||||
struct timespec kts;
|
||||
struct timezone ktz;
|
||||
|
||||
if (tv) {
|
||||
if (get_ts32(&kts, tv))
|
||||
return -EFAULT;
|
||||
}
|
||||
if (tz) {
|
||||
if (copy_from_user(&ktz, tz, sizeof(ktz)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSVIPC
|
||||
long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr,
|
||||
u32 fifth)
|
||||
|
Reference in New Issue
Block a user