android_kernel_oneplus_msm8998/arch/arm/kernel
Sricharan R f52bb72254 ARM: mm: Correct virt_to_phys patching for 64 bit physical addresses
The current phys_to_virt patching mechanism works only for 32 bit
physical addresses and this patch extends the idea for 64bit physical
addresses.

The 64bit v2p patching mechanism patches the higher 8 bits of physical
address with a constant using 'mov' instruction and lower 32bits are patched
using 'add'. While this is correct, in those platforms where the lowmem addressable
physical memory spawns across 4GB boundary, a carry bit can be produced as a
result of addition of lower 32bits. This has to be taken in to account and added
in to the upper. The patched __pv_offset and va are added in lower 32bits, where
__pv_offset can be in two's complement form when PA_START < VA_START and that can
result in a false carry bit.

e.g
    1) PA = 0x80000000; VA = 0xC0000000
       __pv_offset = PA - VA = 0xC0000000 (2's complement)

    2) PA = 0x2 80000000; VA = 0xC000000
       __pv_offset = PA - VA = 0x1 C0000000

So adding __pv_offset + VA should never result in a true overflow for (1).
So in order to differentiate between a true carry, a __pv_offset is extended
to 64bit and the upper 32bits will have 0xffffffff if __pv_offset is
2's complement. So 'mvn #0' is inserted instead of 'mov' while patching
for the same reason. Since mov, add, sub instruction are to patched
with different constants inside the same stub, the rotation field
of the opcode is using to differentiate between them.

So the above examples for v2p translation becomes for VA=0xC0000000,
    1) PA[63:32] = 0xffffffff
       PA[31:0] = VA + 0xC0000000 --> results in a carry
       PA[63:32] = PA[63:32] + carry

       PA[63:0] = 0x0 80000000

    2) PA[63:32] = 0x1
       PA[31:0] = VA + 0xC0000000 --> results in a carry
       PA[63:32] = PA[63:32] + carry

       PA[63:0] = 0x2 80000000

The above ideas were suggested by Nicolas Pitre <nico@linaro.org> as
part of the review of first and second versions of the subject patch.

There is no corresponding change on the phys_to_virt() side, because
computations on the upper 32-bits would be discarded anyway.

Cc: Russell King <linux@arm.linux.org.uk>

Reviewed-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Sricharan R <r.sricharan@ti.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
2013-10-10 20:25:06 -04:00
..
.gitignore
arch_timer.c sched_clock: Make ARM's sched_clock generic for all architectures 2013-06-12 14:02:13 -07:00
armksyms.c ARM: mm: Correct virt_to_phys patching for 64 bit physical addresses 2013-10-10 20:25:06 -04:00
arthur.c
asm-offsets.c ARM: kernel: implement stack pointer save array through MPIDR hashing 2013-06-20 11:24:11 +01:00
atags.h ARM: constify machine_desc structure uses 2013-07-26 14:55:59 +01:00
atags_compat.c
atags_parse.c ARM: constify machine_desc structure uses 2013-07-26 14:55:59 +01:00
atags_proc.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
bios32.c ARM: SoC platform changes for 3.12 2013-09-06 13:30:06 -07:00
calls.S ARM: 7665/1: Wire up kcmp syscall 2013-03-03 22:54:18 +00:00
cpuidle.c
crash_dump.c
debug.S
devtree.c Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2013-09-05 18:07:32 -07:00
dma-isa.c
dma.c
early_printk.c early_printk: consolidate random copies of identical code 2013-04-29 18:28:13 -07:00
elf.c
entry-armv.S ARM: Fix !kuser helpers case 2013-08-07 14:00:11 +01:00
entry-common.S ARM: entry: allow ARM-private syscalls to be restarted 2013-07-22 10:49:00 +01:00
entry-header.S Merge branch 'for-next' of git://git.pengutronix.de/git/ukl/linux into devel-stable 2013-05-22 10:52:24 +01:00
entry-v7m.S ARM: 7800/1: ARMv7-M: Fix name of NVIC handler function 2013-07-31 11:12:58 +01:00
etm.c ARM/etm/sysrq: fix inconstistent help message of sysrq key 2013-04-30 17:04:10 -07:00
fiq.c ARM: 7819/1: fiq: Cast the first argument of flush_icache_range() 2013-08-20 00:11:50 +01:00
fiqasm.S
ftrace.c
head-common.S arm: delete __cpuinit/__CPUINIT usage from all ARM users 2013-07-14 19:36:52 -04:00
head-nommu.S ARM: Add .text annotations where required after __CPUINIT removal 2013-08-01 14:41:40 +01:00
head.S ARM: mm: Correct virt_to_phys patching for 64 bit physical addresses 2013-10-10 20:25:06 -04:00
hw_breakpoint.c arm: delete __cpuinit/__CPUINIT usage from all ARM users 2013-07-14 19:36:52 -04:00
hyp-stub.S ARM: 7786/1: hyp: fix macro parameterisation 2013-07-22 14:30:34 +01:00
insn.c
insn.h
io.c
irq.c ARM: irq: Call irqchip_init if no init_irq function is specified 2013-04-02 11:05:40 -07:00
isa.c
iwmmxt.S
jump_label.c
kgdb.c
kprobes-arm.c
kprobes-common.c
kprobes-test-arm.c
kprobes-test-thumb.c
kprobes-test.c
kprobes-test.h
kprobes-thumb.c
kprobes.c hlist: drop the node parameter from iterators 2013-02-27 19:10:24 -08:00
kprobes.h
machine_kexec.c ARM: 7815/1: kexec: offline non panic CPUs on Kdump panic 2013-08-20 00:14:46 +01:00
Makefile ARM: 7828/1: ARMv7-M: implement restart routine common to all v7-M machines 2013-09-02 13:49:29 +01:00
module.c ARM: 7829/1: Add ".text.unlikely" and ".text.hot" to arm unwind tables 2013-09-02 13:49:47 +01:00
opcodes.c
patch.c
patch.h
perf_event.c ARM: 7810/1: perf: Fix array out of bounds access in armpmu_map_hw_event() 2013-08-13 20:21:44 +01:00
perf_event_cpu.c ARM: 7813/1: Mark pmu interupt IRQF_NO_THREAD 2013-08-20 00:12:23 +01:00
perf_event_v6.c
perf_event_v7.c ARM: 7663/1: perf: fix ARMv7 EVTYPE_MASK to include NSH bit 2013-03-03 22:54:17 +00:00
perf_event_xscale.c
pj4-cp0.c
process.c Merge branch 'security-fixes' into fixes 2013-08-13 20:23:28 +01:00
psci.c arm: introduce psci_smp_ops 2013-05-21 14:24:11 +00:00
psci_smp.c arm: delete __cpuinit/__CPUINIT usage from all ARM users 2013-07-14 19:36:52 -04:00
ptrace.c ptrace/arm: revert "hw_breakpoints: Fix racy access to ptrace breakpoints" 2013-07-09 10:33:25 -07:00
relocate_kernel.S
return_address.c ARM: 7676/1: fix a wrong value returned from CALLER_ADDRn 2013-03-19 11:43:46 +00:00
setup.c Merge branches 'debug-choice', 'devel-stable' and 'misc' into for-linus 2013-09-05 10:34:15 +01:00
signal.c ARM: fix nommu builds with 48be69a02 (ARM: move signal handlers into a vdso-like page) 2013-08-03 10:49:01 +01:00
sleep.S ARM: kernel: implement stack pointer save array through MPIDR hashing 2013-06-20 11:24:11 +01:00
smp.c ARM: mm: Introduce virt_to_idmap() with an arch hook 2013-10-10 20:25:06 -04:00
smp_scu.c Merge branch 'for-next' of git://git.pengutronix.de/git/ukl/linux into devel-stable 2013-03-09 15:49:32 +00:00
smp_tlb.c ARM: tlb: don't perform inner-shareable invalidation for local BP ops 2013-08-12 12:25:44 +01:00
smp_twd.c Now that we have a generic arch hook for broadcast we can remove the local 2013-07-23 16:54:15 -07:00
stacktrace.c
suspend.c ARM: kernel: implement stack pointer save array through MPIDR hashing 2013-06-20 11:24:11 +01:00
swp_emulate.c arm: single_open() leaks 2013-05-05 00:07:22 -04:00
sys_arm.c
sys_oabi-compat.c
tcm.c ARM: 7694/1: ARM, TCM: initialize TCM in paging_init(), instead of setup_arch() 2013-04-17 16:53:24 +01:00
thumbee.c
time.c sched_clock: Make ARM's sched_clock generic for all architectures 2013-06-12 14:02:13 -07:00
topology.c ARM: topology: remove hwid/MPIDR dependency from cpu_capacity 2013-08-21 10:29:52 +01:00
traps.c Merge branch 'for-rmk/cacheflush-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into devel-stable 2013-08-28 18:38:40 +01:00
unwind.c
v7m.c ARM: 7828/1: ARMv7-M: implement restart routine common to all v7-M machines 2013-09-02 13:49:29 +01:00
vmlinux.lds.S ARM: use linker magic for vectors and vector stubs 2013-07-31 21:34:24 +01:00
xscale-cp0.c