1
linux/include/asm-powerpc
Paul Mackerras fa28237cfc [POWERPC] Provide a way to protect 4k subpages when using 64k pages
Using 64k pages on 64-bit PowerPC systems makes life difficult for
emulators that are trying to emulate an ISA, such as x86, which use a
smaller page size, since the emulator can no longer use the MMU and
the normal system calls for controlling page protections.  Of course,
the emulator can emulate the MMU by checking and possibly remapping
the address for each memory access in software, but that is pretty
slow.

This provides a facility for such programs to control the access
permissions on individual 4k sub-pages of 64k pages.  The idea is
that the emulator supplies an array of protection masks to apply to a
specified range of virtual addresses.  These masks are applied at the
level where hardware PTEs are inserted into the hardware page table
based on the Linux PTEs, so the Linux PTEs are not affected.  Note
that this new mechanism does not allow any access that would otherwise
be prohibited; it can only prohibit accesses that would otherwise be
allowed.  This new facility is only available on 64-bit PowerPC and
only when the kernel is configured for 64k pages.

The masks are supplied using a new subpage_prot system call, which
takes a starting virtual address and length, and a pointer to an array
of protection masks in memory.  The array has a 32-bit word per 64k
page to be protected; each 32-bit word consists of 16 2-bit fields,
for which 0 allows any access (that is otherwise allowed), 1 prevents
write accesses, and 2 or 3 prevent any access.

Implicit in this is that the regions of the address space that are
protected are switched to use 4k hardware pages rather than 64k
hardware pages (on machines with hardware 64k page support).  In fact
the whole process is switched to use 4k hardware pages when the
subpage_prot system call is used, but this could be improved in future
to switch only the affected segments.

The subpage protection bits are stored in a 3 level tree akin to the
page table tree.  The top level of this tree is stored in a structure
that is appended to the top level of the page table tree, i.e., the
pgd array.  Since it will often only be 32-bit addresses (below 4GB)
that are protected, the pointers to the first four bottom level pages
are also stored in this structure (each bottom level page contains the
protection bits for 1GB of address space), so the protection bits for
addresses below 4GB can be accessed with one fewer loads than those
for higher addresses.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-24 10:06:01 +11:00
..
iseries [POWERPC] include/asm-powerpc/: Spelling fixes 2007-12-20 16:17:44 +11:00
8xx_immap.h [POWERPC] include/asm-powerpc/: Spelling fixes 2007-12-20 16:17:44 +11:00
8253pit.h
a.out.h arch: personality independent stack top 2007-07-19 10:04:45 -07:00
abs_addr.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
agp.h
asm-compat.h [POWERPC] Use mtocrf instruction in asm when CONFIG_POWER4_ONLY=y 2007-04-13 03:55:13 +10:00
atomic.h [POWERPC] Implement atomic{, 64}_{read, write}() without volatile 2007-08-17 11:01:58 +10:00
auxvec.h
backlight.h [PATCH] powermac: More powermac backlight fixes 2006-07-31 13:28:45 -07:00
bitops.h forbid asm/bitops.h direct inclusion 2007-10-19 11:53:41 -07:00
bootx.h
btext.h
bug.h Fix WARN_ON() on bitfield ops 2007-07-31 21:12:07 -07:00
bugs.h
byteorder.h
cache.h [POWERPC] Add __read_mostly support for powerpc 2007-07-10 22:00:56 +10:00
cacheflush.h [POWERPC] DEBUG_PAGEALLOC for 32-bit 2007-04-13 04:09:39 +10:00
cell-pmu.h [POWERPC] cell: add cbe_node_to_cpu function 2007-04-23 21:44:38 +02:00
cell-regs.h [POWERPC] cell: Add Cell memory controller register defs and expose it 2007-10-09 21:01:56 +10:00
checksum.h [NET]: POWERPC checksum annotations and cleanups. 2006-12-02 21:23:20 -08:00
clk_interface.h [POWERPC] clk.h interface for platforms 2007-10-03 09:11:56 +10:00
commproc.h Merge branch 'linux-2.6' 2007-12-21 22:21:08 +11:00
compat.h Introduce compat_u64 and compat_s64 types 2007-07-16 09:05:48 -07:00
cpm2.h [POWERPC] 85xx: Killed <asm/mpc85xx.h> 2007-10-11 09:14:31 -05:00
cpm.h [POWERPC] Move CPM command handling into the cpm drivers 2007-12-13 22:47:16 -06:00
cputable.h [POWERPC] Reworking machine check handling and Fix 440/440A 2007-12-23 13:11:59 -06:00
cputhreads.h [POWERPC] Cleanup SMT thread handling 2007-12-03 13:56:25 +11:00
cputime.h [PATCH] powerpc: implement missing jiffies64_to_cputime64() 2006-07-05 09:39:54 -07:00
current.h [POWERPC] Include stddef.h in asm-powerpc/current.h to get offsetof 2007-03-09 15:03:24 +11:00
dbdma.h [POWERPC] Xserve cpu-meter driver 2006-12-04 20:39:30 +11:00
dcr-mmio.h Use dcr_host_t.base in dcr_unmap() 2007-10-15 14:29:49 -04:00
dcr-native.h [POWERPC] 4xx: Improve support for 4xx indirect DCRs 2007-12-23 13:12:11 -06:00
dcr-regs.h [POWERPC] 4xx: Improve support for 4xx indirect DCRs 2007-12-23 13:12:11 -06:00
dcr.h [POWERPC] Compile fixes for arch/powerpc dcr code 2007-02-07 14:03:23 +11:00
delay.h [POWERPC] Fix mdelay badness on shared processor partitions 2006-06-21 15:01:33 +10:00
device.h [POWERPC] Refactor 64 bits DMA operations 2006-12-04 20:38:40 +11:00
div64.h
dma-mapping.h [POWERPC] Implement pci_set_dma_mask() in terms of the dma_ops 2007-12-20 16:15:49 +11:00
dma.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
edac.h [POWERPC] EDAC ECC software scrubber 2007-03-09 15:03:25 +11:00
eeh_event.h [POWERPC] EEH: rm un-needed data 2007-03-22 22:52:55 +11:00
eeh.h [POWERPC] Merge 32 and 64 bits asm-powerpc/io.h 2006-12-04 20:39:05 +11:00
elf.h increase AT_VECTOR_SIZE to terminate saved_auxv properly 2007-10-17 08:43:00 -07:00
emergency-restart.h
errno.h
exception.h [POWERPC] Move lowlevel runlatch calls under cpu feature control 2007-09-14 01:33:22 +10:00
fb.h fbdev: detect primary display device 2007-07-17 10:23:11 -07:00
fcntl.h
firmware.h [POWERPC] celleb: Add support for native CBE 2007-12-11 13:34:40 +11:00
floppy.h cleanup floppy.h 2007-10-17 08:42:55 -07:00
fs_pd.h [POWERPC] 85xx: Killed <asm/mpc85xx.h> 2007-10-11 09:14:31 -05:00
futex.h [PATCH] mm: pagefault_{disable,enable}() 2006-12-07 08:39:21 -08:00
grackle.h
hardirq.h
heathrow.h
highmem.h [POWERPC] Copy over headers from arch/ppc to arch/powerpc that we need 2007-08-22 22:43:29 -05:00
hvcall.h [POWERPC] Add H_ILLAN_ATTRIBUTES hcall number 2007-07-11 13:24:40 +10:00
hvconsole.h
hvcserver.h
hw_irq.h powerpc: fixup hard_irq_disable semantics 2007-05-11 08:29:34 -07:00
hydra.h [POWERPC] Copy over headers from arch/ppc to arch/powerpc that we need 2007-08-22 22:43:29 -05:00
i8259.h [POWERPC] Fix CHRP platforms with only 8259 2006-10-25 13:49:22 +10:00
ibmebus.h [POWERPC] ibmebus: Move to of_device and of_platform_driver, match eHCA and eHEA drivers 2007-10-17 22:30:08 +10:00
ide.h ide: add hwif->ack_intr hook 2007-10-20 00:32:32 +02:00
immap_86xx.h [POWERPC] 86xx: fix guts_set_dmacr() and add guts_set_pmuxcr_dma() to immap_86xx.h 2007-12-11 13:57:18 -06:00
immap_cpm2.h [POWERPC] cpm2: Infrastructure code cleanup. 2007-10-04 11:02:04 -05:00
immap_qe.h [POWERPC] qe: miscellaneous code improvements and fixes to the QE library 2007-10-08 08:38:15 -05:00
io-defs.h [POWERPC] Merge 32 and 64 bits asm-powerpc/io.h 2006-12-04 20:39:05 +11:00
io.h [POWERPC] Make isa_mem_base common to 32 and 64 bits 2007-12-11 15:43:34 +11:00
ioctl.h
ioctls.h
iommu.h [POWERPC] iommu_free_table doesn't need the device_node 2007-12-11 13:41:33 +11:00
ipcbuf.h
ipic.h [POWERPC] ipic: add new interrupts introduced by new chip 2007-12-11 13:57:18 -06:00
irq_regs.h IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
irq.h [POWERPC] Add an optional device_node pointer to the irq_host 2007-09-14 01:33:20 +10:00
irqflags.h [PATCH] lockdep: irqtrace subsystem, core 2006-07-03 15:27:03 -07:00
Kbuild remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
kdebug.h x86: optimize page faults like all other achitectures and kill notifier cruft 2007-10-16 09:42:50 -07:00
kdump.h [POWERPC] kdump: Support kernels having 64k page size. 2006-09-13 18:30:04 +10:00
kexec.h kdump/kexec: calculate note size at compile time 2007-05-08 11:15:07 -07:00
keylargo.h
kgdb.h [POWERPC] Copy over headers from arch/ppc to arch/powerpc that we need 2007-08-22 22:43:29 -05:00
kmap_types.h
kprobes.h kprobes: support kretprobe blacklist 2007-10-16 09:43:10 -07:00
libata-portmap.h Fix Maple PATA IRQ assignment. 2007-01-26 17:27:40 -05:00
linkage.h
lmb.h [POWERPC] Update lmb.h include protection to ASM_POWERPC 2007-08-17 11:01:58 +10:00
local.h local_t: powerpc extension 2007-05-08 11:15:20 -07:00
lppaca.h [POWERPC] Donate idle CPU cycles on dedicated partitions 2007-06-14 22:29:58 +10:00
lv1call.h [POWERPC] PS3: System-bus rework 2007-06-28 19:16:38 +10:00
machdep.h [POWERPC] Implement arch disable/enable irq hooks. 2007-12-21 22:13:35 +11:00
macio.h
mc146818rtc.h
mediabay.h
mman.h
mmu_context.h remove asm/bitops.h includes 2007-10-19 11:53:41 -07:00
mmu-8xx.h [POWERPC] Split out asm-ppc/mmu.h portions for PowerPC 8xx 2007-07-03 03:00:28 -05:00
mmu-40x.h [POWERPC] 40x MMU 2007-08-20 07:28:48 -05:00
mmu-44x.h [POWERPC] Remove fixup_bigphys_addr() for arch/powerpc to avoid link error 2007-05-17 21:11:13 +10:00
mmu-fsl-booke.h [POWERPC] Split out asm-ppc/mmu.h portions for Freescale Book-E 2007-07-03 03:00:16 -05:00
mmu-hash32.h [POWERPC] Kill typedef-ed structs for hash PTEs and BATs 2007-06-14 22:30:16 +10:00
mmu-hash64.h [POWERPC] Provide a way to protect 4k subpages when using 64k pages 2008-01-24 10:06:01 +11:00
mmu.h [POWERPC] 40x MMU 2007-08-20 07:28:48 -05:00
mmzone.h [POWERPC] We don't define CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID 2007-05-10 21:28:13 +10:00
module.h [POWERPC] Generic BUG for powerpc 2006-12-11 16:35:07 +11:00
mpc8xx.h [POWERPC] 8xx: mpc885ads pcmcia support 2007-07-10 00:33:51 -05:00
mpc52xx_psc.h [POWERPC] Separate MPC52xx PSC FIFO registers from rest of PSC 2008-01-21 11:01:32 -07:00
mpc52xx.h [POWERPC] mpc5200: eliminate mpc52xx_*_map_*() functions. 2008-01-18 09:30:37 -07:00
mpc86xx.h [POWERPC] kill isa_{io,mem}_base definitions for !PCI 2007-06-29 01:56:43 -05:00
mpc8260.h [POWERPC] Change include protections to ASM_POWERPC 2007-05-17 21:10:15 +10:00
mpic.h [POWERPC] pasemi: Distribute interrupts evenly across cpus 2007-12-28 09:22:25 -06:00
msgbuf.h
mutex.h
namei.h
nvram.h [POWERPC] Cleanup calling mmio_nvram_init 2007-12-20 16:15:27 +11:00
of_device.h [POWERPC] Move of_device allocation into of_device.[ch] 2007-10-17 22:30:07 +10:00
of_platform.h [POWERPC] Constify the of_device_id passed to of_platform_bus_probe 2007-12-21 22:14:07 +11:00
ohare.h
oprofile_impl.h [CELL] oprofile: add support to OProfile for profiling CELL BE SPUs 2007-07-20 21:42:24 +02:00
paca.h powerpc: Remove obsolete prototype 2007-10-20 00:36:33 +02:00
page_32.h [POWERPC] Fix kmalloc alignment on non-coherent DMA platforms 2007-11-20 11:37:43 +11:00
page_64.h [POWERPC] Use 1TB segments 2007-10-12 14:05:17 +10:00
page.h fix 'dynreloc miscount' link error on Powerpc 2007-07-26 11:35:18 -07:00
param.h
parport.h parport->dev driver model support 2007-05-08 11:15:05 -07:00
pci-bridge.h [POWERPC] iSeries: eliminate pci_dn bussubno 2008-01-17 14:57:05 +11:00
pci.h [POWERPC] Merge PCI resource allocation & assignment 2007-12-20 16:18:09 +11:00
percpu.h [POWERPC] ppc64: support CONFIG_DEBUG_PREEMPT 2007-10-03 11:48:44 +10:00
pgalloc-32.h [POWERPC] Remove use of 4level-fixup.h for ppc32 2007-05-08 13:40:31 +10:00
pgalloc-64.h [POWERPC] Provide a way to protect 4k subpages when using 64k pages 2008-01-24 10:06:01 +11:00
pgalloc.h [POWERPC] Remove arch/powerpc's dependence on asm-ppc/pg{alloc,table}.h 2007-05-02 20:04:30 +10:00
pgtable-4k.h [POWERPC] Size swapper_pg_dir correctly 2007-09-19 15:25:34 +10:00
pgtable-64k.h [POWERPC] Provide a way to protect 4k subpages when using 64k pages 2008-01-24 10:06:01 +11:00
pgtable-ppc32.h [POWERPC] Fix swapper_pg_dir size when CONFIG_PTE_64BIT=y on FSL_BOOKE 2007-12-06 13:11:04 -06:00
pgtable-ppc64.h ppc64: SPARSEMEM_VMEMMAP support 2007-10-16 09:42:51 -07:00
pgtable.h [POWERPC] Start factoring pgtable-ppc32.h and pgtable-ppc64.h 2007-06-14 22:30:15 +10:00
pmac_feature.h [POWERPC] Change include protections to ASM_POWERPC 2007-05-17 21:10:15 +10:00
pmac_low_i2c.h
pmac_pfunc.h typo fixes: mecanism -> mechanism 2006-06-30 18:20:44 +02:00
pmc.h [POWERPC] pasemi: PA6T oprofile support 2007-04-24 21:31:51 +10:00
pmi.h [CELL] pmi: remove support for mutiple devices. 2007-07-20 21:41:34 +02:00
poll.h Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
posix_types.h [PATCH] FD_ZERO build fix 2007-01-11 18:18:22 -08:00
ppc_asm.h [POWERPC] Fix modpost warnings from head*.S on ppc32 2007-09-14 08:53:36 -05:00
ppc-pci.h [POWERPC] iSeries: Call iSeries_pcibios_init from setup_arch 2007-12-11 13:42:32 +11:00
processor.h [POWERPC] Use __attribute__ in asm-powerpc 2007-09-22 14:49:21 +10:00
prom.h [POWERPC] Add of_translate_dma_address 2007-12-11 15:43:35 +11:00
ps3.h [POWERPC] PS3: Add new LV1 error codes 2007-09-14 01:33:25 +10:00
ps3av.h ps3av: dont distinguish between boot' and non-boot' autodetection 2007-10-16 09:43:21 -07:00
ps3fb.h [POWERPC] PS3: Frame buffer system-bus rework 2007-06-28 19:16:42 +10:00
ps3stor.h [POWERPC] PS3: Storage Driver Core 2007-06-28 19:19:20 +10:00
pSeries_reconfig.h
ptrace.h [POWERPC] Reworking machine check handling and Fix 440/440A 2007-12-23 13:11:59 -06:00
qe_ic.h [POWERPC] QEIC: Implement pluggable handlers, fix MPIC cascading 2007-10-08 08:38:57 -05:00
qe.h [POWERPC] qe: add function qe_clock_source() 2007-12-13 22:59:27 -06:00
reg_8xx.h
reg_booke.h [POWERPC] Reworking machine check handling and Fix 440/440A 2007-12-23 13:11:59 -06:00
reg.h [POWERPC] Use SLB size from the device tree 2007-12-11 13:45:56 +11:00
resource.h
rheap.h [POWERPC] User rheap from arch/powerpc/lib 2007-05-09 23:28:17 -05:00
rtas.h Revert "[POWERPC] Fix RTAS os-term usage on kernel panic" 2007-12-03 09:39:45 +11:00
rtc.h
rwsem.h [POWERPC] Prevent direct inclusion of <asm/rwsem.h>. 2007-09-22 14:49:21 +10:00
scatterlist.h Add CONFIG_DEBUG_SG sg validation 2007-10-22 21:20:03 +02:00
seccomp.h
sections.h
semaphore.h kill DECLARE_MUTEX_LOCKED 2007-10-17 08:42:47 -07:00
sembuf.h
serial.h
setup.h [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h [PATCH] irq-flags: POWERPC: Use the new IRQF_ constants 2006-07-02 13:58:47 -07:00
smp.h Convert cpu_sibling_map to be a per cpu variable 2007-10-16 09:42:50 -07:00
smu.h [POWERPC] include/asm-powerpc/: Spelling fixes 2007-12-20 16:17:44 +11:00
socket.h [NET]: Adding SO_TIMESTAMPNS / SCM_TIMESTAMPNS support 2007-04-25 22:24:21 -07:00
sockios.h [NET]: Introduce SIOCGSTAMPNS ioctl to get timestamps with nanosec resolution 2007-04-25 22:24:04 -07:00
sparsemem.h [POWERPC] ps3: add lpar addressing 2006-12-04 20:40:52 +11:00
spinlock_types.h
spinlock.h [PATCH] Directed yield: direct yield of spinlocks for powerpc 2006-10-01 00:39:22 -07:00
spu_csa.h [POWERPC] spufs: rework class 0 and 1 interrupt handling 2007-12-21 19:46:20 +11:00
spu_info.h [POWERPC] spufs: Add /lslr, /dma_info and /proxydma files 2006-12-04 20:39:45 +11:00
spu_priv1.h [POWERPC] cell: wrap master run control bit 2007-12-21 19:45:05 +11:00
spu.h [POWERPC] spufs: don't set reserved bits in spu interrupt status 2007-12-21 19:46:20 +11:00
sstep.h [POWERPC] Added kprobes support to ppc32 2007-02-06 22:55:19 -06:00
stat.h
statfs.h
string.h [STRING]: Move strcasecmp/strncasecmp to lib/string.c 2007-04-26 01:54:39 -07:00
suspend.h [POWERPC] Fix suspend states again 2007-05-02 20:04:30 +10:00
synch.h
syscalls.h [POWERPC] Consolidate sys_sigaltstack 2007-06-14 22:29:57 +10:00
systbl.h [POWERPC] Provide a way to protect 4k subpages when using 64k pages 2008-01-24 10:06:01 +11:00
system.h increase AT_VECTOR_SIZE to terminate saved_auxv properly 2007-10-17 08:43:00 -07:00
tce.h [POWERPC] Use 4kB iommu pages even on 64kB-page systems 2006-11-01 14:52:48 +11:00
termbits.h [POWERPC] Enable arbitary speed tty ioctls and split input/output speed 2007-07-10 22:03:29 +10:00
termios.h [PATCH] consolidate line discipline number definitions 2007-02-11 10:51:26 -08:00
thread_info.h remove unused TIF_NOTIFY_RESUME flag 2007-07-31 15:39:38 -07:00
time.h [POWERPC] Fix hardware IRQ time accounting problem. 2007-12-06 16:08:59 +11:00
timex.h [POWERPC] Cell timebase bug workaround 2006-10-25 11:54:18 +10:00
tlb.h [POWERPC] Include pagemap.h in asm/powerpc/tlb.h 2007-10-03 12:02:43 +10:00
tlbflush.h [POWERPC] Fix oops related to 4xx flush_tlb_page modification 2007-11-09 03:51:14 -06:00
topology.h Convert cpu_sibling_map to be a per cpu variable 2007-10-16 09:42:50 -07:00
tsi108_irq.h [POWERPC] Change include protections to ASM_POWERPC 2007-05-17 21:10:15 +10:00
tsi108_pci.h [POWERPC] Change include protections to ASM_POWERPC 2007-05-17 21:10:15 +10:00
tsi108.h [POWERPC] Generalize tsi108 PCI setup 2007-05-08 11:54:20 +10:00
types.h remove strict ansi check from __u64 in asm/types.h 2007-10-17 08:42:53 -07:00
uaccess.h [POWERPC] Add inatomic versions of __get_user and __put_user 2007-04-13 04:09:38 +10:00
ucc_fast.h ucc_geth: Implement Transmit on Demand support 2007-04-28 11:01:04 -04:00
ucc_slow.h [POWERPC] qe: miscellaneous code improvements and fixes to the QE library 2007-10-08 08:38:15 -05:00
ucc.h [POWERPC] qe: miscellaneous code improvements and fixes to the QE library 2007-10-08 08:38:15 -05:00
ucontext.h
udbg.h [POWERPC] 4xx: Add early udbg support for 40x processors 2007-12-23 13:13:03 -06:00
uic.h [POWERPC] Add arch/powerpc driver for UIC, PPC4xx interrupt controller 2007-04-24 21:32:01 +10:00
unaligned.h
uninorth.h
unistd.h [POWERPC] Provide a way to protect 4k subpages when using 64k pages 2008-01-24 10:06:01 +11:00
user.h
vdso_datapage.h [POWERPC] vdso: Fixes for cache block sizes 2007-11-20 13:56:31 +11:00
vdso.h [POWERPC] Fix vDSO page count calculation 2007-02-13 15:35:52 +11:00
vga.h [PATCH] vgacon: make VGA_MAP_MEM take size, remove extra use 2006-06-22 15:05:58 -07:00
vio.h [POWERPC] Clean up vio.h 2007-10-11 20:40:44 +10:00
xilinx_intc.h [POWERPC] Virtex: add xilinx interrupt controller driver 2007-10-03 07:23:14 -05:00
xmon.h [POWERPC] add support for stopping spus from xmon 2006-10-25 14:20:22 +10:00
xor.h