Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
mariux64
/
linux
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
2
Pull requests
0
Actions
Projects
0
Wiki
Security
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Wiki
Security
Insights
Files
2da33f9
Documentation
arch
alpha
arc
arm
arm64
avr32
blackfin
c6x
cris
frv
h8300
hexagon
ia64
m32r
m68k
metag
microblaze
mips
mn10300
nios2
openrisc
parisc
powerpc
s390
appldata
boot
configs
crypto
hypfs
include
asm
fpu
trace
Kbuild
airq.h
appldata.h
asm-offsets.h
atomic.h
barrier.h
bitops.h
bug.h
bugs.h
cache.h
cacheflush.h
ccwdev.h
ccwgroup.h
checksum.h
chpid.h
cio.h
clp.h
cmb.h
cmpxchg.h
compat.h
cpcmd.h
cpu.h
cpu_mf.h
cpufeature.h
cputime.h
crw.h
css_chars.h
ctl_reg.h
current.h
debug.h
delay.h
device.h
diag.h
dis.h
div64.h
dma-mapping.h
dma.h
eadm.h
ebcdic.h
elf.h
emergency-restart.h
etr.h
exec.h
extmem.h
facilities_src.h
facility.h
fb.h
fcx.h
ftrace.h
futex.h
hardirq.h
hugetlb.h
hw_irq.h
idals.h
idle.h
io.h
ipl.h
irq.h
irq_regs.h
irqflags.h
isc.h
itcw.h
jump_label.h
kdebug.h
kexec.h
kmap_types.h
kprobes.h
kvm_host.h
kvm_para.h
linkage.h
livepatch.h
local.h
local64.h
lowcore.h
mathemu.h
mman.h
mmu.h
mmu_context.h
mmzone.h
module.h
mutex.h
nmi.h
numa.h
os_info.h
page.h
pci.h
pci_clp.h
pci_debug.h
pci_dma.h
pci_insn.h
pci_io.h
percpu.h
perf_event.h
pgalloc.h
pgtable.h
processor.h
ptrace.h
qdio.h
reset.h
runtime_instr.h
rwsem.h
schid.h
sclp.h
scsw.h
seccomp.h
sections.h
segment.h
serial.h
setup.h
sfp-machine.h
sfp-util.h
shmparam.h
signal.h
sigp.h
smp.h
sparsemem.h
spinlock.h
spinlock_types.h
string.h
switch_to.h
syscall.h
sysinfo.h
termios.h
thread_info.h
timex.h
tlb.h
tlbflush.h
topology.h
types.h
uaccess.h
unaligned.h
unistd.h
uprobes.h
user.h
vdso.h
vga.h
vtime.h
vtimer.h
vx-insn.h
xor.h
uapi
kernel
kvm
lib
mm
net
numa
oprofile
pci
tools
Kbuild
Kconfig
Kconfig.debug
Makefile
defconfig
score
sh
sparc
tile
um
unicore32
x86
xtensa
.gitignore
Kconfig
block
certs
crypto
drivers
firmware
fs
include
init
ipc
kernel
lib
mm
net
samples
scripts
security
sound
tools
usr
virt
.get_maintainer.ignore
.gitignore
.mailmap
COPYING
CREDITS
Kbuild
Kconfig
MAINTAINERS
Makefile
README
REPORTING-BUGS
Breadcrumbs
linux
/
arch
/
s390
/
include
/
asm
/
pgalloc.h
Blame
Blame
Latest commit
History
History
146 lines (120 loc) · 3.98 KB
Breadcrumbs
linux
/
arch
/
s390
/
include
/
asm
/
pgalloc.h
Top
File metadata and controls
Code
Blame
146 lines (120 loc) · 3.98 KB
Raw
/* * S390 version * Copyright IBM Corp. 1999, 2000 * Author(s): Hartmut Penner (hp@de.ibm.com) * Martin Schwidefsky (schwidefsky@de.ibm.com) * * Derived from "include/asm-i386/pgalloc.h" * Copyright (C) 1994 Linus Torvalds */ #ifndef _S390_PGALLOC_H #define _S390_PGALLOC_H #include <linux/threads.h> #include <linux/gfp.h> #include <linux/mm.h> unsigned long *crst_table_alloc(struct mm_struct *); void crst_table_free(struct mm_struct *, unsigned long *); unsigned long *page_table_alloc(struct mm_struct *); void page_table_free(struct mm_struct *, unsigned long *); void page_table_free_rcu(struct mmu_gather *, unsigned long *, unsigned long); extern int page_table_allocate_pgste; int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, unsigned long key, bool nq); unsigned long get_guest_storage_key(struct mm_struct *mm, unsigned long addr); static inline void clear_table(unsigned long *s, unsigned long val, size_t n) { typedef struct { char _[n]; } addrtype; *s = val; n = (n / 256) - 1; asm volatile( " mvc 8(248,%0),0(%0)\n" "0: mvc 256(256,%0),0(%0)\n" " la %0,256(%0)\n" " brct %1,0b\n" : "+a" (s), "+d" (n), "=m" (*(addrtype *) s) : "m" (*(addrtype *) s)); } static inline void crst_table_init(unsigned long *crst, unsigned long entry) { clear_table(crst, entry, sizeof(unsigned long)*2048); } static inline unsigned long pgd_entry_type(struct mm_struct *mm) { if (mm->context.asce_limit <= (1UL << 31)) return _SEGMENT_ENTRY_EMPTY; if (mm->context.asce_limit <= (1UL << 42)) return _REGION3_ENTRY_EMPTY; return _REGION2_ENTRY_EMPTY; } int crst_table_upgrade(struct mm_struct *, unsigned long limit); void crst_table_downgrade(struct mm_struct *, unsigned long limit); static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address) { unsigned long *table = crst_table_alloc(mm); if (table) crst_table_init(table, _REGION3_ENTRY_EMPTY); return (pud_t *) table; } #define pud_free(mm, pud) crst_table_free(mm, (unsigned long *) pud) static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) { unsigned long *table = crst_table_alloc(mm); if (!table) return NULL; crst_table_init(table, _SEGMENT_ENTRY_EMPTY); if (!pgtable_pmd_page_ctor(virt_to_page(table))) { crst_table_free(mm, table); return NULL; } return (pmd_t *) table; } static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) { pgtable_pmd_page_dtor(virt_to_page(pmd)); crst_table_free(mm, (unsigned long *) pmd); } static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) { pgd_val(*pgd) = _REGION2_ENTRY | __pa(pud); } static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) { pud_val(*pud) = _REGION3_ENTRY | __pa(pmd); } static inline pgd_t *pgd_alloc(struct mm_struct *mm) { unsigned long *table = crst_table_alloc(mm); if (!table) return NULL; if (mm->context.asce_limit == (1UL << 31)) { /* Forking a compat process with 2 page table levels */ if (!pgtable_pmd_page_ctor(virt_to_page(table))) { crst_table_free(mm, table); return NULL; } } return (pgd_t *) table; } static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) { if (mm->context.asce_limit == (1UL << 31)) pgtable_pmd_page_dtor(virt_to_page(pgd)); crst_table_free(mm, (unsigned long *) pgd); } static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte) { pmd_val(*pmd) = _SEGMENT_ENTRY + __pa(pte); } #define pmd_populate_kernel(mm, pmd, pte) pmd_populate(mm, pmd, pte) #define pmd_pgtable(pmd) \ (pgtable_t)(pmd_val(pmd) & -sizeof(pte_t)*PTRS_PER_PTE) /* * page table entry allocation/free routines. */ #define pte_alloc_one_kernel(mm, vmaddr) ((pte_t *) page_table_alloc(mm)) #define pte_alloc_one(mm, vmaddr) ((pte_t *) page_table_alloc(mm)) #define pte_free_kernel(mm, pte) page_table_free(mm, (unsigned long *) pte) #define pte_free(mm, pte) page_table_free(mm, (unsigned long *) pte) extern void rcu_table_freelist_finish(void); #endif /* _S390_PGALLOC_H */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
You can’t perform that action at this time.