162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/mm_types.h> 362306a36Sopenharmony_ci#include <linux/maple_tree.h> 462306a36Sopenharmony_ci#include <linux/rwsem.h> 562306a36Sopenharmony_ci#include <linux/spinlock.h> 662306a36Sopenharmony_ci#include <linux/list.h> 762306a36Sopenharmony_ci#include <linux/cpumask.h> 862306a36Sopenharmony_ci#include <linux/mman.h> 962306a36Sopenharmony_ci#include <linux/pgtable.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/atomic.h> 1262306a36Sopenharmony_ci#include <linux/user_namespace.h> 1362306a36Sopenharmony_ci#include <linux/iommu.h> 1462306a36Sopenharmony_ci#include <asm/mmu.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#ifndef INIT_MM_CONTEXT 1762306a36Sopenharmony_ci#define INIT_MM_CONTEXT(name) 1862306a36Sopenharmony_ci#endif 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciconst struct vm_operations_struct vma_dummy_vm_ops; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * For dynamically allocated mm_structs, there is a dynamically sized cpumask 2462306a36Sopenharmony_ci * at the end of the structure, the size of which depends on the maximum CPU 2562306a36Sopenharmony_ci * number the system can see. That way we allocate only as much memory for 2662306a36Sopenharmony_ci * mm_cpumask() as needed for the hundreds, or thousands of processes that 2762306a36Sopenharmony_ci * a system typically runs. 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci * Since there is only one init_mm in the entire system, keep it simple 3062306a36Sopenharmony_ci * and size this cpu_bitmask to NR_CPUS. 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_cistruct mm_struct init_mm = { 3362306a36Sopenharmony_ci .mm_mt = MTREE_INIT_EXT(mm_mt, MM_MT_FLAGS, init_mm.mmap_lock), 3462306a36Sopenharmony_ci .pgd = swapper_pg_dir, 3562306a36Sopenharmony_ci .mm_users = ATOMIC_INIT(2), 3662306a36Sopenharmony_ci .mm_count = ATOMIC_INIT(1), 3762306a36Sopenharmony_ci .write_protect_seq = SEQCNT_ZERO(init_mm.write_protect_seq), 3862306a36Sopenharmony_ci MMAP_LOCK_INITIALIZER(init_mm) 3962306a36Sopenharmony_ci .page_table_lock = __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock), 4062306a36Sopenharmony_ci .arg_lock = __SPIN_LOCK_UNLOCKED(init_mm.arg_lock), 4162306a36Sopenharmony_ci .mmlist = LIST_HEAD_INIT(init_mm.mmlist), 4262306a36Sopenharmony_ci#ifdef CONFIG_PER_VMA_LOCK 4362306a36Sopenharmony_ci .mm_lock_seq = 0, 4462306a36Sopenharmony_ci#endif 4562306a36Sopenharmony_ci .user_ns = &init_user_ns, 4662306a36Sopenharmony_ci .cpu_bitmap = CPU_BITS_NONE, 4762306a36Sopenharmony_ci#ifdef CONFIG_IOMMU_SVA 4862306a36Sopenharmony_ci .pasid = IOMMU_PASID_INVALID, 4962306a36Sopenharmony_ci#endif 5062306a36Sopenharmony_ci INIT_MM_CONTEXT(init_mm) 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_civoid setup_initial_init_mm(void *start_code, void *end_code, 5462306a36Sopenharmony_ci void *end_data, void *brk) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci init_mm.start_code = (unsigned long)start_code; 5762306a36Sopenharmony_ci init_mm.end_code = (unsigned long)end_code; 5862306a36Sopenharmony_ci init_mm.end_data = (unsigned long)end_data; 5962306a36Sopenharmony_ci init_mm.brk = (unsigned long)brk; 6062306a36Sopenharmony_ci} 61