-void
-ahci_list_device()
-{
- kprintf(KINFO "Version: %x; Ports: %d; Slot: %d\n",
- hba.version,
- hba.ports_num,
- hba.cmd_slots);
- struct hba_port* port;
- for (size_t i = 0; i < 32; i++) {
- port = hba.ports[i];
-
- // 愚蠢的gcc似乎认为 struct hba_port* 不可能为空
- // 所以将这个非常关键的if给优化掉了。
- // 这里将指针强制转换为整数,欺骗gcc :)
- if ((uintptr_t)port == 0) {
- continue;
- }
-
- int device_state = HBA_RPxSSTS_IF(port->ssts);
-
- kprintf("\t Port %d: %s (%x)\n",
- i,
- &sata_ifs[device_state],
- port->device->flags);
-
- struct hba_device* dev_info = port->device;
- if (!device_state || !dev_info) {
- continue;
- }
- kprintf("\t\t capacity: %d KiB\n",
- (dev_info->max_lba * dev_info->block_size) >> 10);
- kprintf("\t\t block size: %dB\n", dev_info->block_size);
- kprintf("\t\t block/sector: %d\n", dev_info->block_per_sec);
- kprintf("\t\t alignment: %dB\n", dev_info->alignment_offset);
- kprintf("\t\t capabilities: %x\n", dev_info->capabilities);
- kprintf("\t\t model: %s\n", &dev_info->model);
- kprintf("\t\t serial: %s\n", &dev_info->serial_num);
- }
-}
-