On 07/08/2015 04:44 AM, Sergei Shtylyov wrote: > Hello. > > On 7/7/2015 2:41 AM, Andy Falanga (afalanga) wrote: > >> I'm working with the registers in an AHCI controller. The memory >> address contained in PxCLB and PxCLBU (if 64-bit addressing is >> supported): what kind of address are they? > > Apparently, physical. The hardware only operates on the physical > addresses. > >> Currently, when I get the >> address and place it into a pointer of struct ahci_cmd_hdr and try to >> dereference, my VM locks and then reboots. What am I doing incorrectly? > > You can't de-reference physical addresses. > >> Basically, I have this: > >> void __iomem * pbase = ahci_port_base((struct ata_port*)); > > Can't parse this. > >> struct ahci_cmd_hdr *cmd_hdr = NULL; > >> cmd_hdr = (struct ahci_cmd_hdr*)(u64) >> ((u64)(*(temp + PORT_LST_ADDR_HI)) << 32 | *temp); > > temp? > >> pr_info("cmd_hdr is %p\n", cmd_hdr); >> pr_info("cmd_hdr->opts is %d\n", cmd_hdr->opts); /* opts is __le32 */ > >> At the last line above my VM hangs and reboots. The memory address is >> something like 0x0000000037900000. This address makes me think that I >> simply can't dereference it but I'm quite new to this and I don't know >> what I should do. I'd appreciate any help even if that's a pointer (no >> pun intended) to a more appropriate forum. > > The corresponding virtual address seems to be contained in > ahci_port_priv::cmd_slot. > >> Thanks, >> Andy > Thank you Sergei. You are correct. I'm finding that ditching old habits from user-land are hard to do. I knew I needed to use things like ioread*/iowrite* when accessing those pointers but I just got stuck in a rhythm of "I've got a pointer now all I do is dereference ...." . Oh well. Thanks much for getting back to me. Andy��.n��������+%������w��{.n�����{��'^�)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥