AHCI: Prevent sign extension of partial address
[akaros.git] / kern / drivers / dev / sdiahci.c
index 172b854..811fc05 100644 (file)
@@ -1943,7 +1943,7 @@ static int iario(struct sdreq *r)
 {
        ERRSTACK(2);
        int i, n, count, try, max, flag, task;
-       int64_t lba;
+       uint64_t lba;
        char *name;
        unsigned char *cmd, *data;
        void *port;
@@ -1978,7 +1978,9 @@ static int iario(struct sdreq *r)
                return SDcheck;
        }
 
-       lba = cmd[2] << 24 | cmd[3] << 16 | cmd[4] << 8 | cmd[5];
+       // TODO: make cmd bigger to support drives with >= 2 TiB capacity,
+       // with 32 bits and 512 B blocks only 2^(9+32) = 2 TiB addressable
+       lba = (uint32_t)(cmd[2] << 24) | cmd[3] << 16 | cmd[4] << 8 | cmd[5];
        count = cmd[7] << 8 | cmd[8];
        if (r->data == NULL)
                return SDok;