Skip to contentSkip to conversation

Addresses in PxCLB and PxCLBU

DISCUSSION Andy Falanga (afalanga) 2 participants 3 messages Jul 6, 2015 – Jul 8, 2015 libata

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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 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.

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 in
ahci_port_priv::cmd_slot.

Quoted 2 lines

Thanks,
Andy

WBR, Sergei

#2 lore raw
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 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.

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