diff options
Diffstat (limited to 'arch/powerpc/kernel')
| -rw-r--r-- | arch/powerpc/kernel/ftrace.c | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/pci-common.c | 17 |
2 files changed, 18 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index 5355244c99ff..60c60ccf5e3c 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
| @@ -195,8 +195,9 @@ __ftrace_make_nop(struct module *mod, | |||
| 195 | return -EINVAL; | 195 | return -EINVAL; |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | offset = (unsigned)((unsigned short)jmp[0]) << 16 | | 198 | /* The bottom half is signed extended */ |
| 199 | (unsigned)((unsigned short)jmp[1]); | 199 | offset = ((unsigned)((unsigned short)jmp[0]) << 16) + |
| 200 | (int)((short)jmp[1]); | ||
| 200 | 201 | ||
| 201 | DEBUGP(" %x ", offset); | 202 | DEBUGP(" %x ", offset); |
| 202 | 203 | ||
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 19b12d2cbb4b..0f4181272311 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
| @@ -561,8 +561,21 @@ int pci_mmap_legacy_page_range(struct pci_bus *bus, | |||
| 561 | (unsigned long long)(offset + size - 1)); | 561 | (unsigned long long)(offset + size - 1)); |
| 562 | 562 | ||
| 563 | if (mmap_state == pci_mmap_mem) { | 563 | if (mmap_state == pci_mmap_mem) { |
| 564 | if ((offset + size) > hose->isa_mem_size) | 564 | /* Hack alert ! |
| 565 | return -ENXIO; | 565 | * |
| 566 | * Because X is lame and can fail starting if it gets an error trying | ||
| 567 | * to mmap legacy_mem (instead of just moving on without legacy memory | ||
| 568 | * access) we fake it here by giving it anonymous memory, effectively | ||
| 569 | * behaving just like /dev/zero | ||
| 570 | */ | ||
| 571 | if ((offset + size) > hose->isa_mem_size) { | ||
| 572 | printk(KERN_DEBUG | ||
| 573 | "Process %s (pid:%d) mapped non-existing PCI legacy memory for 0%04x:%02x\n", | ||
| 574 | current->comm, current->pid, pci_domain_nr(bus), bus->number); | ||
| 575 | if (vma->vm_flags & VM_SHARED) | ||
| 576 | return shmem_zero_setup(vma); | ||
| 577 | return 0; | ||
| 578 | } | ||
| 566 | offset += hose->isa_mem_phys; | 579 | offset += hose->isa_mem_phys; |
| 567 | } else { | 580 | } else { |
| 568 | unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE; | 581 | unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE; |
