update readme introduction part, add demo screen-shot
[lunaix-os.git] / lunaix-os / kernel / block / blkpart_gpt.c
index 1a087afb3419cc845ed362d8c5c6480512299c79..4ffff4deb2864f3ca76311acc5114bb2a92d3fa2 100644 (file)
@@ -3,11 +3,14 @@
 #include <lunaix/block.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/status.h>
+#include <lunaix/syslog.h>
 
-#include <lib/crc.h>
+#include <asm/muldiv64.h>
+
+#include <klibc/crc.h>
 
 #define GPT_BLKSIZE 512
-#define LBA2OFF(lba) ((lba)*GPT_BLKSIZE)
+#define LBA2OFF(lba) ((lba) * GPT_BLKSIZE)
 #define ENT_PER_BLK (GPT_BLKSIZE / sizeof(struct gpt_entry))
 
 #define GPTSIG_LO 0x20494645UL
@@ -15,6 +18,8 @@
 
 static u8_t NULL_GUID[16] = { 0 };
 
+LOG_MODULE("GPT")
+
 int
 blkpart_parse(struct device* master, struct gpt_header* header)
 {
@@ -22,13 +27,13 @@ blkpart_parse(struct device* master, struct gpt_header* header)
     if (!bdev)
         return ENODEV;
 
-    int errno;
+    int errno = 0;
     u32_t ent_lba = (u32_t)header->ents_lba;
     struct gpt_entry* ents_parial = (struct gpt_entry*)valloc(GPT_BLKSIZE);
 
     for (size_t i = 0; i < header->ents_len; i++) {
         if (!(i % ENT_PER_BLK)) {
-            errno = master->read(
+            errno = master->ops.read(
               master, ents_parial, LBA2OFF(ent_lba++), GPT_BLKSIZE);
             if (errno < 0) {
                 goto done;
@@ -43,9 +48,14 @@ blkpart_parse(struct device* master, struct gpt_header* header)
         }
 
         // Convert UEFI's 512B LB representation into local LBA range.
-        u64_t slba_local = (ent->start_lba * GPT_BLKSIZE) / bdev->blk_size;
-        u64_t elba_local = (ent->end_lba * GPT_BLKSIZE) / (u64_t)bdev->blk_size;
-
+        u64_t slba_local = udiv64(ent->start_lba * GPT_BLKSIZE, bdev->blk_size);
+        u64_t elba_local = udiv64(ent->end_lba * GPT_BLKSIZE, bdev->blk_size);
+
+        kprintf("%s: guid part#%d: %d..%d",
+                bdev->bdev_id,
+                i,
+                (u32_t)slba_local,
+                (u32_t)elba_local);
         // we ignore the partition name, as it rarely used.
         blk_mount_part(bdev, NULL, i, slba_local, elba_local);
     }
@@ -61,7 +71,8 @@ blkpart_probegpt(struct device* master)
     int errno;
     struct gpt_header* gpt_hdr = (struct gpt_header*)valloc(GPT_BLKSIZE);
 
-    if ((errno = master->read(master, gpt_hdr, LBA2OFF(1), LBA2OFF(1))) < 0) {
+    if ((errno = master->ops.read(master, gpt_hdr, LBA2OFF(1), LBA2OFF(1))) <
+        0) {
         goto done;
     }
 
@@ -73,6 +84,7 @@ blkpart_probegpt(struct device* master)
     u32_t crc = gpt_hdr->hdr_cksum;
     gpt_hdr->hdr_cksum = 0;
     if (crc32b((void*)gpt_hdr, sizeof(*gpt_hdr)) != crc) {
+        WARN("checksum failed");
         // FUTURE check the backup header
         return EINVAL;
     }