bool test_lwext4_mount(struct ext4_blockdev *bdev, struct ext4_bcache *bcache) { int r; bc = bcache; bd = bdev; if (!bd) { printf("test_lwext4_mount: no block device\n"); return false; } ext4_dmask_set(DEBUG_ALL); r = ext4_device_register(bd, bc ? bc : 0, "ext4_fs"); if (r != EOK) { printf("ext4_device_register: rc = %d\n", r); return false; } r = ext4_mount("ext4_fs", "/mp/", false); if (r != EOK) { printf("ext4_mount: rc = %d\n", r); return false; } r = ext4_recover("/mp/"); if (r != EOK && r != ENOTSUP) { printf("ext4_recover: rc = %d\n", r); return false; } r = ext4_journal_start("/mp/"); if (r != EOK) { printf("ext4_journal_start: rc = %d\n", r); return false; } ext4_cache_write_back("/mp/", 1); return true; }
static int grub_load_from_mmc(void) { ext4_file f; uint32_t bytes_read; int ret = 0, allow = 0; dprintf(INFO, "%s: part=[%s] path=[%s]\n", __func__, GRUB_BOOT_PARTITION, GRUB_PATH); // create ext4 device struct ext4_blockdev* mmcdev = ext4_mmcdev_get(GRUB_BOOT_PARTITION); if(!mmcdev){ dprintf(CRITICAL, "MMC device ERROR\n"); return -1; } // register it ret = ext4_device_register(mmcdev, 0, GRUB_BOOT_PARTITION); if(ret != EOK){ dprintf(CRITICAL, "ext4_device_register ERROR = %d\n", ret); return ret; } // mount it ret = ext4_mount(GRUB_BOOT_PARTITION, GRUB_MOUNTPOINT); if(ret != EOK){ dprintf(CRITICAL, "ext4_mount ERROR = %d\n", ret); return -1; } // check permissions of crucial files if(grub_mmc_check_permissions(GRUB_MOUNTPOINT GRUB_PATH "/core.img", &allow)==EOK && !allow) return -1; if(grub_mmc_check_permissions(GRUB_MOUNTPOINT GRUB_PATH "/grub.cfg", &allow)==EOK && !allow) return -1; if(grub_mmc_check_permissions(GRUB_MOUNTPOINT GRUB_PATH "/grubenv", &allow)==EOK && !allow) return -1; dprintf(INFO, "Permissions are good\n"); // open file ret = ext4_fopen(&f, GRUB_MOUNTPOINT GRUB_PATH "/core.img", "rb"); if(ret != EOK){ dprintf(CRITICAL, "ext4_fopen ERROR = %d\n", ret); return -1; } // read file ret = ext4_fread(&f, (void*)GRUB_LOADING_ADDRESS_VIRT, ext4_fsize(&f), &bytes_read); if(ret != EOK){ dprintf(CRITICAL, "ext4_fread ERROR = %d\n", ret); return -1; } // close file ret = ext4_fclose(&f); if(ret != EOK){ dprintf(CRITICAL, "ext4_fclose ERROR = %d\n", ret); return -1; } // unmount partition ret = ext4_umount(GRUB_MOUNTPOINT); if(ret != EOK){ dprintf(CRITICAL, "ext4_umount ERROR = %d\n", ret); return -1; } // store bootdev unsigned int index = (unsigned int) partition_get_index(GRUB_BOOT_PARTITION); char buf[20]; sprintf(buf, "hd0,%u", index+1); grub_bootdev = strdup(buf); grub_bootpath = strdup(GRUB_BOOT_PATH_PREFIX "boot/grub"); dprintf(INFO, "Loaded GRUB from MMC\n"); return 0; }