mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
um: decouple MMU specific code from the common part
This splits the memory, process related code with common and MMU specific parts in order to avoid ifdefs in .c file and duplication between MMU and !MMU. Signed-off-by: Hajime Tazaki <thehajime@gmail.com> [drop many unnecessary changes] Link: https://patch.msgid.link/20260723113633.af7d6a109c22.Ie82119143778b91fa5585ea3493cf4014113da47@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
68885a9445
commit
130031906f
|
|
@ -16,9 +16,10 @@ always-$(KBUILD_BUILTIN) := vmlinux.lds
|
|||
|
||||
obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \
|
||||
physmem.o process.o ptrace.o reboot.o sigio.o \
|
||||
signal.o sysrq.o time.o tlb.o trap.o \
|
||||
signal.o sysrq.o time.o trap.o \
|
||||
um_arch.o umid.o kmsg_dump.o capflags.o skas/
|
||||
obj-y += load_file.o
|
||||
obj-$(CONFIG_MMU) += mem-pgtable.o tlb.o
|
||||
|
||||
obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
|
||||
obj-$(CONFIG_GPROF) += gprof_syms.o
|
||||
|
|
|
|||
55
arch/um/kernel/mem-pgtable.c
Normal file
55
arch/um/kernel/mem-pgtable.c
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
*/
|
||||
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <as-layout.h>
|
||||
#include <init.h>
|
||||
#include <kern.h>
|
||||
#include <kern_util.h>
|
||||
#include <mem_user.h>
|
||||
#include <os.h>
|
||||
#include <um_malloc.h>
|
||||
|
||||
|
||||
/* Allocate and free page tables. */
|
||||
|
||||
pgd_t *pgd_alloc(struct mm_struct *mm)
|
||||
{
|
||||
pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
|
||||
|
||||
if (pgd) {
|
||||
memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
|
||||
memcpy(pgd + USER_PTRS_PER_PGD,
|
||||
swapper_pg_dir + USER_PTRS_PER_PGD,
|
||||
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
||||
}
|
||||
return pgd;
|
||||
}
|
||||
|
||||
static const pgprot_t protection_map[16] = {
|
||||
[VM_NONE] = PAGE_NONE,
|
||||
[VM_READ] = PAGE_READONLY,
|
||||
[VM_WRITE] = PAGE_COPY,
|
||||
[VM_WRITE | VM_READ] = PAGE_COPY,
|
||||
[VM_EXEC] = PAGE_READONLY,
|
||||
[VM_EXEC | VM_READ] = PAGE_READONLY,
|
||||
[VM_EXEC | VM_WRITE] = PAGE_COPY,
|
||||
[VM_EXEC | VM_WRITE | VM_READ] = PAGE_COPY,
|
||||
[VM_SHARED] = PAGE_NONE,
|
||||
[VM_SHARED | VM_READ] = PAGE_READONLY,
|
||||
[VM_SHARED | VM_WRITE] = PAGE_SHARED,
|
||||
[VM_SHARED | VM_WRITE | VM_READ] = PAGE_SHARED,
|
||||
[VM_SHARED | VM_EXEC] = PAGE_READONLY,
|
||||
[VM_SHARED | VM_EXEC | VM_READ] = PAGE_READONLY,
|
||||
[VM_SHARED | VM_EXEC | VM_WRITE] = PAGE_SHARED,
|
||||
[VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] = PAGE_SHARED
|
||||
};
|
||||
DECLARE_VM_GET_PAGE_PROT
|
||||
|
|
@ -6,7 +6,6 @@
|
|||
#include <linux/stddef.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
|
|
@ -91,45 +90,11 @@ void free_initmem(void)
|
|||
{
|
||||
}
|
||||
|
||||
/* Allocate and free page tables. */
|
||||
|
||||
pgd_t *pgd_alloc(struct mm_struct *mm)
|
||||
{
|
||||
pgd_t *pgd = __pgd_alloc(mm, 0);
|
||||
|
||||
if (pgd)
|
||||
memcpy(pgd + USER_PTRS_PER_PGD,
|
||||
swapper_pg_dir + USER_PTRS_PER_PGD,
|
||||
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
|
||||
|
||||
return pgd;
|
||||
}
|
||||
|
||||
void *uml_kmalloc(int size, int flags)
|
||||
{
|
||||
return kmalloc(size, flags);
|
||||
}
|
||||
|
||||
static const pgprot_t protection_map[16] = {
|
||||
[VM_NONE] = PAGE_NONE,
|
||||
[VM_READ] = PAGE_READONLY,
|
||||
[VM_WRITE] = PAGE_COPY,
|
||||
[VM_WRITE | VM_READ] = PAGE_COPY,
|
||||
[VM_EXEC] = PAGE_READONLY,
|
||||
[VM_EXEC | VM_READ] = PAGE_READONLY,
|
||||
[VM_EXEC | VM_WRITE] = PAGE_COPY,
|
||||
[VM_EXEC | VM_WRITE | VM_READ] = PAGE_COPY,
|
||||
[VM_SHARED] = PAGE_NONE,
|
||||
[VM_SHARED | VM_READ] = PAGE_READONLY,
|
||||
[VM_SHARED | VM_WRITE] = PAGE_SHARED,
|
||||
[VM_SHARED | VM_WRITE | VM_READ] = PAGE_SHARED,
|
||||
[VM_SHARED | VM_EXEC] = PAGE_READONLY,
|
||||
[VM_SHARED | VM_EXEC | VM_READ] = PAGE_READONLY,
|
||||
[VM_SHARED | VM_EXEC | VM_WRITE] = PAGE_SHARED,
|
||||
[VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] = PAGE_SHARED
|
||||
};
|
||||
DECLARE_VM_GET_PAGE_PROT
|
||||
|
||||
void mark_rodata_ro(void)
|
||||
{
|
||||
unsigned long rodata_start = PFN_ALIGN(__start_rodata);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user