disk: More properly detect non-present removable media
This commit is contained in:
parent
3e4b4a6b9b
commit
54862a8269
@ -20,7 +20,7 @@ E9_OUTPUT = false
|
|||||||
BUILD_ID := $(shell dd if=/dev/urandom count=8 bs=1 | od -An -t x8 | sed 's/^ /0x/')
|
BUILD_ID := $(shell dd if=/dev/urandom count=8 bs=1 | od -An -t x8 | sed 's/^ /0x/')
|
||||||
LIMINE_VERSION := $(shell git describe --exact-match --tags `git log -n1 --pretty='%h'` || git log -n1 --pretty='%h')
|
LIMINE_VERSION := $(shell git describe --exact-match --tags `git log -n1 --pretty='%h'` || git log -n1 --pretty='%h')
|
||||||
WERROR = -Werror
|
WERROR = -Werror
|
||||||
CFLAGS = -Os -pipe -Wall -Wextra $(WERROR)
|
CFLAGS = -Os -g -pipe -Wall -Wextra $(WERROR)
|
||||||
|
|
||||||
INTERNAL_CFLAGS := \
|
INTERNAL_CFLAGS := \
|
||||||
-std=gnu11 \
|
-std=gnu11 \
|
||||||
@ -52,7 +52,7 @@ ifeq ($(TARGET), uefi)
|
|||||||
-mcmodel=small
|
-mcmodel=small
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDFLAGS = -Os
|
LDFLAGS = -Os -g
|
||||||
|
|
||||||
INTERNAL_LDFLAGS := \
|
INTERNAL_LDFLAGS := \
|
||||||
-fno-lto \
|
-fno-lto \
|
||||||
@ -85,9 +85,9 @@ endif
|
|||||||
HEADER_DEPS := $(C_FILES:.c=.d)
|
HEADER_DEPS := $(C_FILES:.c=.d)
|
||||||
|
|
||||||
ifeq ($(TARGET), bios)
|
ifeq ($(TARGET), bios)
|
||||||
all: limine.sys stage2.bin stage2.bin.gz
|
all: limine_dbg.elf limine.sys stage2.bin stage2.bin.gz
|
||||||
else ifeq ($(TARGET), uefi)
|
else ifeq ($(TARGET), uefi)
|
||||||
all: BOOTX64.EFI
|
all: limine_dbg.elf BOOTX64.EFI
|
||||||
endif
|
endif
|
||||||
|
|
||||||
BOOTX64.EFI: limine.elf
|
BOOTX64.EFI: limine.elf
|
||||||
@ -109,7 +109,7 @@ endif
|
|||||||
limine.sys: limine.elf
|
limine.sys: limine.elf
|
||||||
$(OBJCOPY) -O binary $< $@
|
$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
limine_nomap.elf: $(OBJ)
|
limine_nomap.elf: $(OBJ) font.o
|
||||||
$(LD) $(OBJ) font.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap_$(TARGET).ld -o $@
|
$(LD) $(OBJ) font.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap_$(TARGET).ld -o $@
|
||||||
ifeq ($(TARGET), bios)
|
ifeq ($(TARGET), bios)
|
||||||
$(LD) $(OBJ) font.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Wl,--gc-sections -Tlinker_stage2only.ld -o limine_stage2only.elf || \
|
$(LD) $(OBJ) font.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Wl,--gc-sections -Tlinker_stage2only.ld -o limine_stage2only.elf || \
|
||||||
@ -117,6 +117,9 @@ ifeq ($(TARGET), bios)
|
|||||||
false )
|
false )
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
limine_dbg.elf: $(OBJ) font.o
|
||||||
|
$(LD) $(OBJ) font.o $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@
|
||||||
|
|
||||||
font.o:
|
font.o:
|
||||||
$(OBJCOPY) -B i8086 -I binary -O default font.bin $@
|
$(OBJCOPY) -B i8086 -I binary -O default font.bin $@
|
||||||
|
|
||||||
|
@ -50,9 +50,16 @@ bool disk_read_sectors(struct volume *volume, void *buf, uint64_t block, size_t
|
|||||||
|
|
||||||
if (r.eflags & EFLAGS_CF) {
|
if (r.eflags & EFLAGS_CF) {
|
||||||
int ah = (r.eax >> 8) & 0xff;
|
int ah = (r.eax >> 8) & 0xff;
|
||||||
panic("Disk error %x. Drive %x, LBA %x.", ah, volume->drive, dap->lba);
|
switch (ah) {
|
||||||
|
case 0x0c:
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
panic("Disk error %x. Drive %x, LBA %x.",
|
||||||
|
ah, volume->drive, dap->lba);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (buf != NULL)
|
||||||
memcpy(buf, xfer_buf, count * volume->sector_size);
|
memcpy(buf, xfer_buf, count * volume->sector_size);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -91,6 +98,13 @@ size_t disk_create_index(struct volume **ret) {
|
|||||||
block.first_sect = 0;
|
block.first_sect = 0;
|
||||||
block.sect_count = drive_params.lba_count;
|
block.sect_count = drive_params.lba_count;
|
||||||
|
|
||||||
|
// The medium could not be present (e.g.: CD-ROMs)
|
||||||
|
// Do a test run to see if we can actually read it
|
||||||
|
if (!disk_read_sectors(&block, NULL, 0, 1)) {
|
||||||
|
print(" ... Ignoring drive...\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (int part = 0; ; part++) {
|
for (int part = 0; ; part++) {
|
||||||
struct volume p;
|
struct volume p;
|
||||||
int ret = part_get(&p, &block, part);
|
int ret = part_get(&p, &block, part);
|
||||||
@ -130,6 +144,12 @@ size_t disk_create_index(struct volume **ret) {
|
|||||||
block->first_sect = 0;
|
block->first_sect = 0;
|
||||||
block->sect_count = drive_params.lba_count;
|
block->sect_count = drive_params.lba_count;
|
||||||
|
|
||||||
|
// The medium could not be present (e.g.: CD-ROMs)
|
||||||
|
// Do a test run to see if we can actually read it
|
||||||
|
if (!disk_read_sectors(block, NULL, 0, 1)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (gpt_get_guid(&block->guid, block)) {
|
if (gpt_get_guid(&block->guid, block)) {
|
||||||
block->guid_valid = true;
|
block->guid_valid = true;
|
||||||
}
|
}
|
||||||
|
@ -32,13 +32,6 @@ char *trace_address(size_t *off, size_t addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void print_stacktrace(size_t *base_ptr) {
|
void print_stacktrace(size_t *base_ptr) {
|
||||||
#if defined (bios)
|
|
||||||
if (!stage3_loaded) {
|
|
||||||
print("trace: Stack trace omitted because stage 3 was not loaded yet.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (base_ptr == NULL) {
|
if (base_ptr == NULL) {
|
||||||
asm volatile (
|
asm volatile (
|
||||||
#if defined (bios)
|
#if defined (bios)
|
||||||
|
51
stage23/linker_dbg.ld
Normal file
51
stage23/linker_dbg.ld
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
OUTPUT_FORMAT(elf32-i386)
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0x8000;
|
||||||
|
|
||||||
|
.entry : {
|
||||||
|
*(.entry*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.realmode : {
|
||||||
|
*(.realmode*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.stage2.text : {
|
||||||
|
*.s2.o(.text*)
|
||||||
|
*libgcc.a:*(.text*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.stage2.data : {
|
||||||
|
*.s2.o(.data*)
|
||||||
|
*.s2.o(.rodata*)
|
||||||
|
*libgcc.a:*(.data*)
|
||||||
|
*libgcc.a:*(.rodata*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.stage3.text : {
|
||||||
|
stage3_addr = .;
|
||||||
|
*(.stage3_entry*)
|
||||||
|
*(.stage3_build_id*)
|
||||||
|
*(.text*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.stage3.data : {
|
||||||
|
*(.data*)
|
||||||
|
*(.rodata*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.map : {
|
||||||
|
limine_map = .;
|
||||||
|
limine_sys_size = .;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss : {
|
||||||
|
bss_begin = .;
|
||||||
|
*(COMMON)
|
||||||
|
*(.bss*)
|
||||||
|
bss_end = .;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user