Change formatting rules
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 2m7s
Build documentation / build-and-deploy (push) Successful in 39s

This commit is contained in:
2026-04-24 01:54:48 +02:00
parent 34f7809a2d
commit c8fb575bdd
208 changed files with 6310 additions and 6339 deletions

View File

@@ -21,7 +21,7 @@ struct dos_pte {
uint8_t chs_last_sect_addr[3];
uint32_t start_lba;
uint32_t sector_count;
} __attribute__ ((packed));
} __attribute__((packed));
struct dos_mbr {
uint8_t boot_code[440];
@@ -29,9 +29,9 @@ struct dos_mbr {
uint8_t resv[2];
struct dos_pte ptes[4];
uint8_t valid_sign[2];
} __attribute__ ((packed));
} __attribute__((packed));
static void lba_to_chs (uint32_t lba, uint8_t chs[3]) {
static void lba_to_chs(uint32_t lba, uint8_t chs[3]) {
uint32_t sectors_per_track = 63;
uint32_t heads = 255;
@@ -50,21 +50,21 @@ static void lba_to_chs (uint32_t lba, uint8_t chs[3]) {
}
}
static void ask_and_setup_dos_partition (struct dos_pte* pte, int part_num) {
static void ask_and_setup_dos_partition(struct dos_pte* pte, int part_num) {
char part_start_lba_str[12], part_sector_count_str[12];
uint32_t part_start_lba, part_sector_count;
char part_isboot_str[4];
bool part_isboot;
mprintf ("\nConfigure parition %d:\n", part_num);
mprintf("\nConfigure parition %d:\n", part_num);
in_stream_read_line ("Start LBA: ", part_start_lba_str, sizeof (part_start_lba_str));
in_stream_read_line ("Sector count: ", part_sector_count_str, sizeof (part_sector_count_str));
in_stream_read_line ("Mark as bootable? [yes/no]: ", part_isboot_str, sizeof (part_isboot_str));
in_stream_read_line("Start LBA: ", part_start_lba_str, sizeof(part_start_lba_str));
in_stream_read_line("Sector count: ", part_sector_count_str, sizeof(part_sector_count_str));
in_stream_read_line("Mark as bootable? [yes/no]: ", part_isboot_str, sizeof(part_isboot_str));
part_start_lba = str_to_uint32 (part_start_lba_str);
part_sector_count = str_to_uint32 (part_sector_count_str);
part_isboot = (strcmp (part_isboot_str, "yes") == 0);
part_start_lba = str_to_uint32(part_start_lba_str);
part_sector_count = str_to_uint32(part_sector_count_str);
part_isboot = (strcmp(part_isboot_str, "yes") == 0);
if (part_sector_count == 0)
return;
@@ -73,10 +73,10 @@ static void ask_and_setup_dos_partition (struct dos_pte* pte, int part_num) {
pte->sector_count = part_sector_count;
lba_to_chs (part_start_lba, pte->chs_start_addr);
lba_to_chs(part_start_lba, pte->chs_start_addr);
lba_to_chs (part_start_lba + (part_sector_count > 1 ? part_sector_count : 1) - 1,
pte->chs_last_sect_addr);
lba_to_chs(part_start_lba + (part_sector_count > 1 ? part_sector_count : 1) - 1,
pte->chs_last_sect_addr);
pte->part_type = 0x0C;
@@ -84,22 +84,22 @@ static void ask_and_setup_dos_partition (struct dos_pte* pte, int part_num) {
pte->drive_attrs |= (1 << 7);
}
static void start_part_dos (const char* dev_name) {
static void start_part_dos(const char* dev_name) {
struct dos_mbr mbr;
memset (&mbr, 0, sizeof (mbr));
memset(&mbr, 0, sizeof(mbr));
char confirm_buf[4];
memset (confirm_buf, 0, sizeof (confirm_buf));
memset(confirm_buf, 0, sizeof(confirm_buf));
bool ok = false, write = false;
ask_and_setup_dos_partition (&mbr.ptes[0], 0);
ask_and_setup_dos_partition (&mbr.ptes[1], 1);
ask_and_setup_dos_partition (&mbr.ptes[2], 2);
ask_and_setup_dos_partition (&mbr.ptes[3], 3);
ask_and_setup_dos_partition(&mbr.ptes[0], 0);
ask_and_setup_dos_partition(&mbr.ptes[1], 1);
ask_and_setup_dos_partition(&mbr.ptes[2], 2);
ask_and_setup_dos_partition(&mbr.ptes[3], 3);
struct dos_mbr* limine_mbr = (struct dos_mbr*)&binary_limine_hdd_bin_data[0];
memcpy (mbr.boot_code, limine_mbr->boot_code, sizeof (mbr.boot_code));
memcpy (mbr.signature, limine_mbr->signature, sizeof (mbr.signature));
memcpy (mbr.valid_sign, limine_mbr->valid_sign, sizeof (mbr.valid_sign));
memcpy(mbr.boot_code, limine_mbr->boot_code, sizeof(mbr.boot_code));
memcpy(mbr.signature, limine_mbr->signature, sizeof(mbr.signature));
memcpy(mbr.valid_sign, limine_mbr->valid_sign, sizeof(mbr.valid_sign));
/* clang-format off */
mprintf ("\n\n-------------------------------------------------------\n");
@@ -110,42 +110,42 @@ static void start_part_dos (const char* dev_name) {
mprintf ("Partition 3: start LBA=%u, sectors=%zu\n",mbr.ptes[3].start_lba, mbr.ptes[3].sector_count);
/* clang-format on */
in_stream_read_line ("\nDoes this look plausible? [yes/no]: ", confirm_buf, sizeof (confirm_buf));
in_stream_read_line("\nDoes this look plausible? [yes/no]: ", confirm_buf, sizeof(confirm_buf));
if (strcmp (confirm_buf, "yes") == 0) {
in_stream_read_line ("\nWrite to device? There's no going back! [yes/no]: ", confirm_buf,
sizeof (confirm_buf));
if (strcmp(confirm_buf, "yes") == 0) {
in_stream_read_line("\nWrite to device? There's no going back! [yes/no]: ", confirm_buf,
sizeof(confirm_buf));
ok = true;
if (strcmp (confirm_buf, "yes") == 0) {
if (strcmp(confirm_buf, "yes") == 0) {
write = true;
} else {
mprintf ("OK. Canceling\n");
mprintf("OK. Canceling\n");
}
} else {
mprintf ("OK. Canceling\n");
mprintf("OK. Canceling\n");
}
if (ok && write) {
size_t sector = 0;
size_t sector_count = 1;
int r = device_do (dev_name, XDRV_WRITE, &sector, &sector_count, &mbr, NULL);
mprintf ("Finished writing. Result: %s (%d)\n", str_status[r < 0 ? -r : r], r);
int r = device_do(dev_name, XDRV_WRITE, &sector, &sector_count, &mbr, NULL);
mprintf("Finished writing. Result: %s (%d)\n", str_status[r < 0 ? -r : r], r);
}
}
static void list_part_dos (const char* dev_name) {
static void list_part_dos(const char* dev_name) {
struct dos_mbr mbr;
memset (&mbr, 0, sizeof (mbr));
memset(&mbr, 0, sizeof(mbr));
size_t sector = 0;
size_t sector_count = 1;
int r = device_do (dev_name, XDRV_READ, &sector, &sector_count, &mbr, NULL);
mprintf ("Finished reading. Result: %s (%d)\n", str_status[r < 0 ? -r : r], r);
int r = device_do(dev_name, XDRV_READ, &sector, &sector_count, &mbr, NULL);
mprintf("Finished reading. Result: %s (%d)\n", str_status[r < 0 ? -r : r], r);
if (!(mbr.valid_sign[0] == 0x55 && mbr.valid_sign[1] == 0xAA)) {
mprintf ("ERROR invalid Master Boot Record!\n");
mprintf("ERROR invalid Master Boot Record!\n");
return;
}
@@ -163,44 +163,44 @@ static const char* spinner = "-\\|/";
static size_t spinner_state = 0;
static size_t sectors_done = 0;
static void format_update (size_t sector, size_t sector_count) {
static void format_update(size_t sector, size_t sector_count) {
(void)sector;
char spinner_char = spinner[(spinner_state++) % (sizeof (spinner) - 1)];
mprintf (ANSIQ_CUR_SET_COL (0) ANSIQ_SCR_CLR2LEND "%c %zu", spinner_char, sectors_done);
char spinner_char = spinner[(spinner_state++) % (sizeof(spinner) - 1)];
mprintf(ANSIQ_CUR_SET_COL(0) ANSIQ_SCR_CLR2LEND "%c %zu", spinner_char, sectors_done);
sectors_done += sector_count;
}
static void format_fat32 (const char* dev_name) {
mprintf ("Formatting device %s!\n", dev_name);
static void format_fat32(const char* dev_name) {
mprintf("Formatting device %s!\n", dev_name);
struct fatfs_ctx ctx;
memset (&ctx, 0, sizeof (ctx));
memset(&ctx, 0, sizeof(ctx));
ctx.update_cb = &format_update;
int r = fat_format_drive (&ctx, dev_name, FS_FAT32);
int r = fat_format_drive(&ctx, dev_name, FS_FAT32);
mprintf ("\nFormatting done: %s (%d)\n", str_status[r < 0 ? -r : r], r);
mprintf("\nFormatting done: %s (%d)\n", str_status[r < 0 ? -r : r], r);
}
static void format_fat16 (const char* dev_name) {
mprintf ("Formatting device %s!\n", dev_name);
static void format_fat16(const char* dev_name) {
mprintf("Formatting device %s!\n", dev_name);
struct fatfs_ctx ctx;
memset (&ctx, 0, sizeof (ctx));
memset(&ctx, 0, sizeof(ctx));
ctx.update_cb = &format_update;
int r = fat_format_drive (&ctx, dev_name, FS_FAT16);
int r = fat_format_drive(&ctx, dev_name, FS_FAT16);
mprintf ("\nFormatting done: %s (%d)\n", str_status[r < 0 ? -r : r], r);
mprintf("\nFormatting done: %s (%d)\n", str_status[r < 0 ? -r : r], r);
}
static void install_limine_stage2 (const char* dev_name) {
static void install_limine_stage2(const char* dev_name) {
int r;
struct dos_mbr mbr;
memset (&mbr, 0, sizeof (mbr));
memset(&mbr, 0, sizeof(mbr));
size_t stage2_size = sizeof (binary_limine_hdd_bin_data) - 512;
size_t stage2_size = sizeof(binary_limine_hdd_bin_data) - 512;
size_t stage2_sectors = (stage2_size + 511) / 512;
size_t mbr_lba = 0, mbr_sector_count = 1;
@@ -209,10 +209,10 @@ static void install_limine_stage2 (const char* dev_name) {
size_t sector = 0;
size_t sector_count = 1;
r = device_do (dev_name, XDRV_READ, &sector, &sector_count, &mbr, NULL);
r = device_do(dev_name, XDRV_READ, &sector, &sector_count, &mbr, NULL);
if (r < 0) {
mprintf ("ERROR could not read MBR\n");
mprintf("ERROR could not read MBR\n");
return;
}
@@ -223,88 +223,88 @@ static void install_limine_stage2 (const char* dev_name) {
continue;
if (mbr.ptes[i].start_lba < stage2_end) {
mprintf ("ERROR partition overlaps with Limine stage 2 area!\n");
mprintf("ERROR partition overlaps with Limine stage 2 area!\n");
return;
}
}
uint64_t stage2_loc = stage2_lba * 512;
memcpy ((uint8_t*)&mbr + 0x1A4, &stage2_loc, sizeof (stage2_loc));
r = device_do (dev_name, XDRV_WRITE, &mbr_lba, &mbr_sector_count, (void*)&mbr, NULL);
memcpy((uint8_t*)&mbr + 0x1A4, &stage2_loc, sizeof(stage2_loc));
r = device_do(dev_name, XDRV_WRITE, &mbr_lba, &mbr_sector_count, (void*)&mbr, NULL);
if (r < 0) {
mprintf ("ERROR could not write patched MBR\n");
mprintf("ERROR could not write patched MBR\n");
return;
}
r = device_do (dev_name, XDRV_WRITE, &stage2_lba, &stage2_sectors, (void*)stage2_data, NULL);
mprintf ("Finished writing Limine Stage 2. Result: %s (%d)\n", str_status[r < 0 ? -r : r], r);
r = device_do(dev_name, XDRV_WRITE, &stage2_lba, &stage2_sectors, (void*)stage2_data, NULL);
mprintf("Finished writing Limine Stage 2. Result: %s (%d)\n", str_status[r < 0 ? -r : r], r);
}
void app_main (void) {
void app_main(void) {
char commandbuf[32];
memset (commandbuf, 0, sizeof (commandbuf));
memset(commandbuf, 0, sizeof(commandbuf));
char devnamebuf[64];
memset (devnamebuf, 0, sizeof (devnamebuf));
memset(devnamebuf, 0, sizeof(devnamebuf));
if (env_get (process_get_pgid (), "help", (void*)commandbuf, sizeof (commandbuf)) == ST_OK) {
mprintf ("sdutil -C command -dev device_key\n");
mprintf ("commands: part_dos, list_part_dos, format_fat32, format_fat16\n");
mprintf (" install_limine_stage2, partition_rescan\n");
if (env_get(process_get_pgid(), "help", (void*)commandbuf, sizeof(commandbuf)) == ST_OK) {
mprintf("sdutil -C command -dev device_key\n");
mprintf("commands: part_dos, list_part_dos, format_fat32, format_fat16\n");
mprintf(" install_limine_stage2, partition_rescan\n");
return;
}
if (env_get (process_get_pgid (), "C", (void*)commandbuf, sizeof (commandbuf)) != ST_OK) {
mprintf ("ERROR C=???. No command provided\n");
if (env_get(process_get_pgid(), "C", (void*)commandbuf, sizeof(commandbuf)) != ST_OK) {
mprintf("ERROR C=???. No command provided\n");
return;
}
if (strcmp (commandbuf, "part_dos") == 0) {
if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) {
mprintf ("ERROR dev=???. No device name provided for part_dos\n");
if (strcmp(commandbuf, "part_dos") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for part_dos\n");
return;
}
start_part_dos (devnamebuf);
} else if (strcmp (commandbuf, "list_part_dos") == 0) {
if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) {
mprintf ("ERROR dev=???. No device name provided for list_part_dos\n");
start_part_dos(devnamebuf);
} else if (strcmp(commandbuf, "list_part_dos") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for list_part_dos\n");
return;
}
list_part_dos (devnamebuf);
} else if (strcmp (commandbuf, "format_fat32") == 0) {
if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) {
mprintf ("ERROR dev=???. No device name provided for format_fat32\n");
list_part_dos(devnamebuf);
} else if (strcmp(commandbuf, "format_fat32") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for format_fat32\n");
return;
}
format_fat32 (devnamebuf);
} else if (strcmp (commandbuf, "format_fat16") == 0) {
if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) {
mprintf ("ERROR dev=???. No device name provided for format_fat16\n");
format_fat32(devnamebuf);
} else if (strcmp(commandbuf, "format_fat16") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for format_fat16\n");
return;
}
format_fat16 (devnamebuf);
} else if (strcmp (commandbuf, "install_limine_stage2") == 0) {
if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) {
mprintf ("ERROR dev=???. No device name provided for install_limine_stage2\n");
format_fat16(devnamebuf);
} else if (strcmp(commandbuf, "install_limine_stage2") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for install_limine_stage2\n");
return;
}
install_limine_stage2 (devnamebuf);
} else if (strcmp (commandbuf, "partition_rescan") == 0) {
if (env_get (process_get_pgid (), "dev", (void*)devnamebuf, sizeof (devnamebuf)) != ST_OK) {
mprintf ("ERROR dev=???. No device name provided for partition_rescan\n");
install_limine_stage2(devnamebuf);
} else if (strcmp(commandbuf, "partition_rescan") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for partition_rescan\n");
return;
}
mprintf ("WARNING Make sure all filesystems were unmounted from this device.\n");
mprintf ("Otherwise a rescan may result in broken filesystems and crashes!\n");
mprintf("WARNING Make sure all filesystems were unmounted from this device.\n");
mprintf("Otherwise a rescan may result in broken filesystems and crashes!\n");
device_do (devnamebuf, XDRV_PARTITION_RESCAN, NULL, NULL, NULL, NULL);
device_do(devnamebuf, XDRV_PARTITION_RESCAN, NULL, NULL, NULL, NULL);
} else {
mprintf ("ERROR C=%s. Unknown command\n", commandbuf);
mprintf("ERROR C=%s. Unknown command\n", commandbuf);
}
}