support private mapped file
This commit is contained in:
@@ -288,8 +288,22 @@ void init_syscall(void)
|
||||
wrmsr(MSR_LSTAR, (unsigned long)x86_syscall);
|
||||
}
|
||||
|
||||
static void enable_page_protection_fault(void)
|
||||
{
|
||||
asm volatile (
|
||||
"pushf ;"
|
||||
"cli ;"
|
||||
"mov %%cr0,%%rax;"
|
||||
"or $0x10000,%%rax;"
|
||||
"mov %%rax,%%cr0;"
|
||||
"popf"
|
||||
::: "%rax");
|
||||
return;
|
||||
}
|
||||
|
||||
void init_cpu(void)
|
||||
{
|
||||
enable_page_protection_fault();
|
||||
init_fpu();
|
||||
init_lapic();
|
||||
init_syscall();
|
||||
@@ -465,7 +479,7 @@ void cpu_restore_interrupt(unsigned long flags)
|
||||
|
||||
void cpu_pause(void)
|
||||
{
|
||||
asm volatile("pause");
|
||||
asm volatile("pause" ::: "memory");
|
||||
}
|
||||
|
||||
unsigned long cpu_disable_interrupt_save(void)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef __HEADER_X86_COMMON_ARCH_MEMORY_H
|
||||
#define __HEADER_X86_COMMON_ARCH_MEMORY_H
|
||||
|
||||
#include <ihk/types.h>
|
||||
|
||||
#define KERNEL_CS_ENTRY 4
|
||||
#define KERNEL_DS_ENTRY 5
|
||||
#define USER_CS_ENTRY 6
|
||||
@@ -103,9 +105,23 @@ enum ihk_mc_pt_attribute {
|
||||
PTATTR_FOR_USER = 0x20000,
|
||||
};
|
||||
|
||||
#define PTE_NULL ((pte_t)0)
|
||||
typedef unsigned long pte_t;
|
||||
|
||||
#define PTE_NULL ((pte_t)0)
|
||||
static inline int pte_is_null(pte_t *ptep)
|
||||
{
|
||||
return (*ptep == PTE_NULL);
|
||||
}
|
||||
|
||||
static inline int pte_is_present(pte_t *ptep)
|
||||
{
|
||||
return !!(*ptep & PF_PRESENT);
|
||||
}
|
||||
|
||||
static inline uintptr_t pte_get_phys(pte_t *ptep)
|
||||
{
|
||||
return (*ptep & PT_PHYSMASK);
|
||||
}
|
||||
|
||||
struct page_table;
|
||||
void set_pte(pte_t *ppte, unsigned long phys, int attr);
|
||||
|
||||
@@ -128,6 +128,8 @@ struct x86_regs {
|
||||
unsigned long error, rip, cs, rflags, rsp, ss;
|
||||
};
|
||||
|
||||
#define REGS_GET_STACK_POINTER(regs) (((struct x86_regs *)regs)->rsp)
|
||||
|
||||
/*
|
||||
* Page fault error code bits:
|
||||
*
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <errno.h>
|
||||
#include <list.h>
|
||||
#include <process.h>
|
||||
#include <page.h>
|
||||
|
||||
#define dkprintf(...)
|
||||
#define ekprintf(...) kprintf(__VA_ARGS__)
|
||||
@@ -820,16 +821,20 @@ static int clear_range_l1(void *args0, pte_t *ptep, uint64_t base,
|
||||
{
|
||||
struct clear_range_args *args = args0;
|
||||
uint64_t phys;
|
||||
struct page *page;
|
||||
|
||||
if (*ptep == PTE_NULL) {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
phys = *ptep & PT_PHYSMASK;
|
||||
*ptep = 0;
|
||||
*ptep = PTE_NULL;
|
||||
|
||||
if (args->free_physical) {
|
||||
ihk_mc_free_pages(phys_to_virt(phys), 1);
|
||||
page = phys_to_page(phys);
|
||||
if (page && page_unmap(page)) {
|
||||
ihk_mc_free_pages(phys_to_virt(phys), 1);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -842,6 +847,7 @@ static int clear_range_l2(void *args0, pte_t *ptep, uint64_t base,
|
||||
uint64_t phys;
|
||||
struct page_table *pt;
|
||||
int error;
|
||||
struct page *page;
|
||||
|
||||
if (*ptep == PTE_NULL) {
|
||||
return -ENOENT;
|
||||
@@ -866,8 +872,10 @@ static int clear_range_l2(void *args0, pte_t *ptep, uint64_t base,
|
||||
*ptep = PTE_NULL;
|
||||
|
||||
if (args->free_physical) {
|
||||
ihk_mc_free_pages(phys_to_virt(phys),
|
||||
LARGE_PAGE_SIZE/PAGE_SIZE);
|
||||
page = phys_to_page(phys);
|
||||
if (page && page_unmap(page)) {
|
||||
ihk_mc_free_pages(phys_to_virt(phys), PTL2_SIZE/PTL1_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user