Addresses in PxCLB and PxCLBU
Hi,
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? 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?
Basically, I have this:
void __iomem * pbase = ahci_port_base((struct ata_port*)); struct ahci_cmd_hdr *cmd_hdr = NULL;
cmd_hdr = (struct ahci_cmd_hdr*)(u64)
((u64)(*(temp + PORT_LST_ADDR_HI)) << 32 | *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.
Thanks,
Andy
Hello.
Quoted 3 lines · Andy Falanga (afalanga)
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.
Quoted 3 lines
Currently, when I get the
address and place it into a pointer of structahci_cmd_hdrand try to dereference, my VM locks and then reboots. What am I doing incorrectly?
You can't de-reference physical addresses.
Quoted 3 lines
Basically, I have this:
void
__iomem* pbase =ahci_port_base((struct ata_port*));
Can't parse this.
Quoted 4 lines
struct
ahci_cmd_hdr*cmd_hdr= NULL;
cmd_hdr= (struct ahci_cmd_hdr*)(u64)((u64)(*(temp + PORT_LST_ADDR_HI)) << 32 | *temp);
temp?
Quoted 8 lines
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 inahci_port_priv::cmd_slot.
Quoted 2 lines
Thanks,
Andy
WBR, Sergei
Quoted 33 lines · Sergei Shtylyov
Hello.
Quoted 3 lines · Andy Falanga (afalanga)
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.Quoted 3 lines
Currently, when I get the
address and place it into a pointer of structahci_cmd_hdrand try to dereference, my VM locks and then reboots. What am I doing incorrectly?You can't de-reference physical addresses.
Quoted 3 lines
Basically, I have this:
void
__iomem* pbase =ahci_port_base((struct ata_port*));Can't parse this.
Quoted 4 lines
struct
ahci_cmd_hdr*cmd_hdr= NULL;
cmd_hdr= (struct ahci_cmd_hdr*)(u64)((u64)(*(temp + PORT_LST_ADDR_HI)) << 32 | *temp);temp?
Quoted 2 lines
pr_info("cmd_hdr is %p\n", cmd_hdr);pr_info("cmd_hdr->opts is %d\n", cmd_hdr->opts); /* opts is__le32*/
Quoted 12 lines
Quoted 5 lines
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.Quoted 2 lines
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