OSDev.org https://forum.osdev.org/ |
|
Page fault when trying to scan for AHCI sata drives https://forum.osdev.org/viewtopic.php?f=1&t=44352 |
Page 1 of 1 |
Author: | C0dR [ Mon Jun 14, 2021 4:48 am ] |
Post subject: | Page fault when trying to scan for AHCI sata drives |
Hello, i am currently working on AHCI implementation. I use the codebase from "MonkOS" (https://github.com/beevik/MonkOS) and tried to implement AHCI based on the code from https://github.com/ethan4984/rock/blob/ ... ers/ahci.c getting pci bar information does work but as soon as I start reading from that memory region I get a page fault. Here is my AHCI_init code so far: Code: void ahci_init(struct pci_device *device) { switch(device->prog_if) { case 0: kprint("[AHCI] detected a vendor specific interface (get a new pc)\n"); return; case 1: kprint("[AHCI] detetced an AHCI 1.0 compatiable device\n"); break; case 2: kprint("[AHCI] detetced a serial storage bus\n"); return; } pci_become_bus_master(device); struct pci_bar bar; if(pci_get_bar(device, &bar, 5) == -1) return; pmap_add(PAGE_ALIGN_DOWN(bar.base), PAGE_SIZE, PMEMTYPE_UNCACHED); //<-- this might be wrong? volatile struct GHC *GHC = (volatile struct GHC*)((size_t)bar.base); for(int i = 0; i < 32; i++) { if(GHC->pi & (1 << i)) { volatile struct port_regs *regs = (volatile struct port_regs*)&GHC->port[i]; switch(regs->sig) { case SATA_ATA: kprintf("[AHCI] sata drive found on port %d\n", i); init_sata_device(regs); break; case SATA_ATAPI: kprintf("[AHCI] ATAPI drive found on port %d\n", i); break; case SATA_SEMB: kprintf("[AHCI] enclosure management bridge found on port %d\n", i); break; case SATA_PM: kprintf("[AHCI] port multipler found on port %d\n", i); break; } } } } I assume I am doing something wrong with memory mapping. When I put the line "pmap_add(PAGE_ALIGN_DOWN(bar.base), PAGE_SIZE, PMEMTYPE_UNCACHED);" with hardcoded adress values inside the function "pmap_init()" (https://github.com/beevik/MonkOS/blob/m ... map.c#L292) i dont get a page fault. I assume the problem is my AHCI initialization happens after the call to pmap_init()? Maybe I am misunderstanding the memory management in the codebase of "MonkOS"? Might someone lead me in the right direction? |
Author: | iansjack [ Mon Jun 14, 2021 7:04 am ] |
Post subject: | Re: Page fault when trying to scan for AHCI sata drives |
A page fault ought to be easy enough to find. Have you run under a debugger, watching what happens when you map the page? |
Author: | C0dR [ Tue Jun 15, 2021 1:07 am ] |
Post subject: | Re: Page fault when trying to scan for AHCI sata drives |
iansjack wrote: A page fault ought to be easy enough to find. Have you run under a debugger, watching what happens when you map the page? no not yet, I will try as soon as I get a working GDB connection to qemu... //EDIT: Ok I managed to attach gdb to the VM but I still dont get the problem. The Page Fault error occures as soon as i try to access the GHC values. Its this line: Code: if(GHC->pi & (1 << i)) { I have the feeling I am completly misunderstanding the memory management implementation of the MonkOS codebase. Could someone maybe explain to me the memory management implementation of monkOS? |
Author: | Octocontrabass [ Tue Jun 15, 2021 8:36 am ] |
Post subject: | Re: Page fault when trying to scan for AHCI sata drives |
C0dR wrote: I have the feeling I am completly misunderstanding the memory management implementation of the MonkOS codebase. Could someone maybe explain to me the memory management implementation of monkOS? It looks like MonkOS is only capable of mapping usable RAM in the page tables. You'll have to write new code to handle mapping and unmapping MMIO. |
Author: | C0dR [ Tue Jun 22, 2021 1:28 am ] |
Post subject: | Re: Page fault when trying to scan for AHCI sata drives |
Octocontrabass wrote: C0dR wrote: I have the feeling I am completly misunderstanding the memory management implementation of the MonkOS codebase. Could someone maybe explain to me the memory management implementation of monkOS? It looks like MonkOS is only capable of mapping usable RAM in the page tables. You'll have to write new code to handle mapping and unmapping MMIO. OK I see, that explains. Thank you, that led me in the right direction! |
Page 1 of 1 | All times are UTC - 6 hours |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |