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