在acpi中使用mmio来映射rsdt表(#40)

* 在acpi中使用mmio来映射rsdt表

* bugfix: 修复page fault的问题

Co-authored-by: fslongjin <longjin@RinGoTek.cn>
This commit is contained in:
houmkh
2022-09-09 00:21:46 +08:00
committed by GitHub
parent 55e63fcb63
commit 6db92c86b8
5 changed files with 85 additions and 48 deletions

View File

@ -351,8 +351,10 @@ int mm_map_vma(struct vm_area_struct *vma, uint64_t paddr)
int retval = 0;
// 获取物理地址对应的页面
struct Page *pg;
uint64_t page_flags = 0;
if (vma->vm_flags & VM_IO) // 对于mmio的内存创建新的page结构体
{
page_flags = PAGE_PWT | PAGE_PCD;
if (unlikely(vma->anon_vma == NULL || vma->anon_vma->page == NULL))
pg = __create_mmio_page_struct(paddr);
else
@ -381,15 +383,14 @@ int mm_map_vma(struct vm_area_struct *vma, uint64_t paddr)
/*
todo: 限制页面的读写权限
*/
// kdebug("len2m=%d", len_2m);
// 先映射2M页
if (likely(len_2m > 0))
{
uint64_t page_flags = 0;
if (vma->vm_flags & VM_USER)
page_flags = PAGE_USER_PAGE;
page_flags |= PAGE_USER_PAGE;
else
page_flags = PAGE_KERNEL_PAGE;
page_flags |= PAGE_KERNEL_PAGE;
// 这里直接设置user标志位为false因为该函数内部会对其进行自动校正
retval = mm_map_proc_page_table((uint64_t)vma->vm_mm->pgd, true, vma->vm_start, paddr, len_2m, page_flags, false, false, false);
if (unlikely(retval != 0))
@ -400,11 +401,10 @@ int mm_map_vma(struct vm_area_struct *vma, uint64_t paddr)
{
len_4k = ALIGN(len_4k, PAGE_4K_SIZE);
uint64_t page_flags = 0;
if (vma->vm_flags & VM_USER)
page_flags = PAGE_USER_4K_PAGE;
page_flags |= PAGE_USER_4K_PAGE;
else
page_flags = PAGE_KERNEL_4K_PAGE;
page_flags |= PAGE_KERNEL_4K_PAGE;
// 这里直接设置user标志位为false因为该函数内部会对其进行自动校正
retval = mm_map_proc_page_table((uint64_t)vma->vm_mm->pgd, true, vma->vm_start + len_2m, paddr + len_2m, len_4k, page_flags, false, false, true);
if (unlikely(retval != 0))