From: srs5694
Originally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/configfile.html b/docs/refind/configfile.html index ca6b444..d6ee318 100644 --- a/docs/refind/configfile.html +++ b/docs/refind/configfile.html @@ -15,7 +15,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/drivers.html b/docs/refind/drivers.html index 579ddac..0946e17 100644 --- a/docs/refind/drivers.html +++ b/docs/refind/drivers.html @@ -15,7 +15,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 4/19/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/features.html b/docs/refind/features.html index 0fdd59b..d779d57 100644 --- a/docs/refind/features.html +++ b/docs/refind/features.html @@ -15,7 +15,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/getting.html b/docs/refind/getting.html index 1a43a2f..54c4500 100644 --- a/docs/refind/getting.html +++ b/docs/refind/getting.html @@ -15,7 +15,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
@@ -97,7 +97,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/installing.html b/docs/refind/installing.html index 0b28864..938fc02 100644 --- a/docs/refind/installing.html +++ b/docs/refind/installing.html @@ -15,7 +15,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
@@ -169,6 +169,19 @@ Installation has completed successfully. href="https://sourceforge.net/p/refind/discussion/general/thread/5c7d0195/">this forum thread for a discussion of the topic.Originally written: 3/19/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/revisions.html b/docs/refind/revisions.html index 8bac805..6fda6e4 100644 --- a/docs/refind/revisions.html +++ b/docs/refind/revisions.html @@ -14,7 +14,7 @@by Roderick W. Smith, rodsmith@rodsbooks.com
-Last Web page update: 5/20/2012
+Last Web page update: 5/25/2012
I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
@@ -93,6 +93,8 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.comOriginally written: 4/19/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/docs/refind/todo.html b/docs/refind/todo.html index 9201b69..952e74e 100644 --- a/docs/refind/todo.html +++ b/docs/refind/todo.html @@ -157,6 +157,20 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com from the partition data is harder than extracting the volume's label or counting up the filesystem numbers.Originally written: 3/14/2012; last Web page update: -5/20/2012, referencing rEFInd 0.4.0
+5/25/2012, referencing rEFInd 0.4.1I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
diff --git a/filesystems/Make.common b/filesystems/Make.common index f636bad..1301150 100644 --- a/filesystems/Make.common +++ b/filesystems/Make.common @@ -3,20 +3,24 @@ # Build control file for rEFInd's EFI filesystem drivers # -SRCDIR = . - -VPATH = $(SRCDIR) - HOSTARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) ARCH := $(HOSTARCH) +# Note: IA64 options are untested; taken from Debian's rEFIt package. +ifeq ($(ARCH),ia64) + # EFI specs allows only lower floating point partition to be used + ARCH_C_CFLAGS = -frename-registers -mfixed-range=f32-f127 + # TODO: Add ARCHDIR and FILENAME_CODE as appropriate +endif + ifeq ($(ARCH),ia32) + ARCH_C_FLAGS = -m32 ARCHDIR = Ia32 FILENAME_CODE = ia32 endif ifeq ($(ARCH),x86_64) - ARCH_C_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" -mcmodel=large + ARCH_C_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" -mcmodel=large -m64 ARCHDIR = X64 FILENAME_CODE = x64 endif @@ -26,29 +30,23 @@ EDK2BASE = /usr/local/UDK2010/MyWorkSpace # Below file defines TARGET (RELEASE or DEBUG), TARGET_ARCH (X64 or IA32), and TOOL_CHAIN_TAG (GCC44, GCC45, GCC46, or GCC47) include $(EDK2BASE)/Conf/target.txt -EFIINC = $(EDK2BASE)/MdePkg/Include/ EFILIB = $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library -ALL_EFILIBS = $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib/OUTPUT/BaseDebugPrintErrorLevelLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/BasePrintLib/BasePrintLib/OUTPUT/BasePrintLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/BasePcdLibNull/BasePcdLibNull/OUTPUT/BasePcdLibNull.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut/OUTPUT/UefiDebugLibConOut.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/BaseLib/BaseLib/OUTPUT/BaseLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/BaseMemoryLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib/OUTPUT/UefiBootServicesTableLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib/OUTPUT/UefiMemoryAllocationLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib/OUTPUT/UefiDevicePathLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib/OUTPUT/UefiRuntimeServicesTableLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiLib/UefiLib/OUTPUT/UefiLib.lib \ - $(EDK2BASE)/Build/MdeModule/$(TARGET)_$(TOOL_CHAIN_TAG)/$(TARGET_ARCH)/MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint/OUTPUT/UefiDriverEntryPoint.lib - -OS = $(shell uname -s) -CPPFLAGS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/Protocol -I$(EFIINC)/$(ARCHDIR) -DNO_BUILTIN_VA_FUNCS +ALL_EFILIBS = $(EFILIB)/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib/OUTPUT/BaseDebugPrintErrorLevelLib.lib \ + $(EFILIB)/BasePrintLib/BasePrintLib/OUTPUT/BasePrintLib.lib \ + $(EFILIB)/BasePcdLibNull/BasePcdLibNull/OUTPUT/BasePcdLibNull.lib \ + $(EFILIB)/UefiDebugLibConOut/UefiDebugLibConOut/OUTPUT/UefiDebugLibConOut.lib \ + $(EFILIB)/BaseLib/BaseLib/OUTPUT/BaseLib.lib \ + $(EFILIB)/BaseMemoryLib/BaseMemoryLib/OUTPUT/BaseMemoryLib.lib \ + $(EFILIB)/UefiBootServicesTableLib/UefiBootServicesTableLib/OUTPUT/UefiBootServicesTableLib.lib \ + $(EFILIB)/UefiMemoryAllocationLib/UefiMemoryAllocationLib/OUTPUT/UefiMemoryAllocationLib.lib \ + $(EFILIB)/UefiDevicePathLib/UefiDevicePathLib/OUTPUT/UefiDevicePathLib.lib \ + $(EFILIB)/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib/OUTPUT/UefiRuntimeServicesTableLib.lib \ + $(EFILIB)/UefiLib/UefiLib/OUTPUT/UefiLib.lib \ + $(EFILIB)/UefiDriverEntryPoint/UefiDriverEntryPoint/OUTPUT/UefiDriverEntryPoint.lib INCLUDE_DIRS = -I $(EDK2BASE)/MdePkg \ -I $(EDK2BASE)/MdePkg/Include \ - -I $(EDK2BASE)/MdePkg/Include/$(ARCHDIR) \ - -I $(EDK2BASE)/IntelFrameworkModulePkg \ - -I $(EDK2BASE)/IntelFrameworkModulePkg/Include \ + -I $(EDK2BASE)/MdePkg/Include/$(ARCHDIR) FSW_NAMES = fsw_efi fsw_core fsw_efi_lib fsw_lib AutoGen OBJS = $(FSW_NAMES:=.o) @@ -56,12 +54,8 @@ OBJS = $(FSW_NAMES:=.o) BUILDME = $(DRIVERNAME)_$(FILENAME_CODE).efi OPTIMFLAGS = -fno-strict-aliasing -mno-red-zone -Wno-address -Os -#OPTIMFLAGS = -fno-strict-aliasing -mno-red-zone -Wno-address -mcmodel=large -Os -DEBUGFLAGS = -Wall -Werror -Wno-missing-braces -Wno-array-bounds -ffunction-sections -fdata-sections -c -include AutoGen.h -#CFLAGS = $(ARCH3264) $(OPTIMFLAGS) -fpic -fshort-wchar $(DEBUGFLAGS) -CFLAGS = $(ARCH3264) $(OPTIMFLAGS) -g -fshort-wchar -fno-stack-protector $(DEBUGFLAGS) -ASFLAGS = $(ARCH3264) -LDFLAGS = -nostdlib -znocombreloc -dp --entry=fsw_efi_main +DEBUGFLAGS = -Wall -Wno-missing-braces -Wno-array-bounds -ffunction-sections -fdata-sections +CFLAGS = $(OPTIMFLAGS) -g -fshort-wchar -fno-stack-protector $(DEBUGFLAGS) -c -include AutoGen.h prefix = /usr/bin/ CC = $(prefix)gcc @@ -70,40 +64,19 @@ LD = $(prefix)ld AR = $(prefix)ar RANLIB = $(prefix)ranlib OBJCOPY = $(prefix)objcopy -GENFW = $(EDK2BASE)/BaseTools/BinWrappers/PosixLike/GenFw - -ifeq ($(ARCH),ia64) - # EFI specs allows only lower floating point partition to be used - CFLAGS += -frename-registers -mfixed-range=f32-f127 -endif - -ifeq ($(ARCH),x86_64) -# CFLAGS += -DEFI_FUNCTION_WRAPPER -# CPPFLAGS += -DEFIX64 - - ARCH3264 = -m64 -endif - -ifeq ($(ARCH),ia32) -# CPPFLAGS += -DEFI32 - - ARCH3264 = -m32 - -endif +GENFW = $(EDK2BASE)/BaseTools/Source/C/bin/GenFw LDSCRIPT = $(EDK2BASE)/BaseTools/Scripts/gcc4.4-ld-script LDFLAGS = -nostdlib -n -q --gc-sections --script=$(EDK2BASE)/BaseTools/Scripts/gcc4.4-ld-script \ --entry _ModuleEntryPoint -u _ModuleEntryPoint -LIBS = $(shell $(CC) $(ARCH3264) -print-libgcc-file-name) %.o: %.c - $(CC) $(CPPFLAGS) $(ARCH_C_FLAGS) $(CFLAGS) $(INCLUDE_DIRS) -DFSTYPE=$(DRIVERNAME) -c $< -o $@ + $(CC) $(ARCH_C_FLAGS) $(CFLAGS) $(INCLUDE_DIRS) -DFSTYPE=$(DRIVERNAME) -DNO_BUILTIN_VA_FUNCS -c $< -o $@ ifneq (,$(filter %.efi,$(BUILDME))) -SHLIB_TARGET = $(subst .efi,.lib,$(BUILDME)) DLL_TARGET = $(subst .efi,.dll,$(BUILDME)) all: $(BUILDME) @@ -113,12 +86,11 @@ $(DLL_TARGET): $(OBJS) fsw_$(DRIVERNAME).o $(BUILDME): $(DLL_TARGET) $(OBJCOPY) --strip-unneeded $(DLL_TARGET) - $(OBJCOPY) $(DLL_TARGET) $(GENFW) -e UEFI_DRIVER -o $(BUILDME) $(DLL_TARGET) +# $(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ +# -j .rela -j .reloc --rename-section .data=.hii --target=efi-bsdrv-$(ARCH) $< $@ mkdir -p ../drivers cp $(BUILDME) ../drivers -# $(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ -# -j .rela -j .reloc --target=efi-bsdrv-$(ARCH) $< $@ endif diff --git a/filesystems/Makefile b/filesystems/Makefile index de697bf..902df49 100644 --- a/filesystems/Makefile +++ b/filesystems/Makefile @@ -8,7 +8,10 @@ INSTALL_DIR = /boot/efi/EFI/refind/drivers -all: ext2 reiserfs iso9660 hfs +FILESYSTEMS = ext2 reiserfs iso9660 hfs +TEXTFILES = $(FILESYSTEMS:=*.txt) + +all: $(FILESYSTEMS) ext2: rm -f fsw_efi.o @@ -29,7 +32,7 @@ hfs: # utility rules clean: - rm -f *~ *.so *.o *.efi *.dll err.txt ext2*.txt hfs*.txt iso9660*.txt reiserfs*.txt + rm -f *~ *.bak *.o *.efi *.dll err.txt $(TEXTFILES) install: diff --git a/filesystems/fsw_efi.c b/filesystems/fsw_efi.c index 2f5a4c6..a364a2d 100644 --- a/filesystems/fsw_efi.c +++ b/filesystems/fsw_efi.c @@ -77,7 +77,7 @@ /** Helper macro for stringification. */ #define FSW_EFI_STRINGIFY(x) #x /** Expands to the EFI driver name given the file system type name. */ -#define FSW_EFI_DRIVER_NAME(t) L"rEFInd 0.4.0 " FSW_EFI_STRINGIFY(t) L" File System Driver" +#define FSW_EFI_DRIVER_NAME(t) L"rEFInd 0.4.1 " FSW_EFI_STRINGIFY(t) L" File System Driver" // function prototypes diff --git a/filesystems/fsw_ext2.c b/filesystems/fsw_ext2.c index 5c98ede..a6e88bf 100644 --- a/filesystems/fsw_ext2.c +++ b/filesystems/fsw_ext2.c @@ -54,7 +54,7 @@ struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(ext2) = { { FSW_STRING_TYPE_ISO88591, 4, 4, "ext2" }, sizeof(struct fsw_ext2_volume), sizeof(struct fsw_ext2_dnode), - + fsw_ext2_volume_mount, fsw_ext2_volume_free, fsw_ext2_volume_stat, @@ -81,12 +81,12 @@ static fsw_status_t fsw_ext2_volume_mount(struct fsw_ext2_volume *vol) struct ext2_group_desc *gdesc; int i; struct fsw_string s; - + // allocate memory to keep the superblock around status = fsw_alloc(sizeof(struct ext2_super_block), &vol->sb); if (status) return status; - + // read the superblock into its buffer fsw_set_blocksize(vol, EXT2_SUPERBLOCK_BLOCKSIZE, EXT2_SUPERBLOCK_BLOCKSIZE); status = fsw_block_get(vol, EXT2_SUPERBLOCK_BLOCKNO, 0, &buffer); @@ -94,7 +94,7 @@ static fsw_status_t fsw_ext2_volume_mount(struct fsw_ext2_volume *vol) return status; fsw_memcpy(vol->sb, buffer, sizeof(struct ext2_super_block)); fsw_block_release(vol, EXT2_SUPERBLOCK_BLOCKNO, buffer); - + // check the superblock if (vol->sb->s_magic != EXT2_SUPER_MAGIC) return FSW_UNSUPPORTED; @@ -148,14 +148,14 @@ static fsw_status_t fsw_ext2_volume_mount(struct fsw_ext2_volume *vol) vol->inotab_bno[groupno] = gdesc->bg_inode_table; fsw_block_release(vol, gdesc_bno, buffer); } - + // setup the root dnode status = fsw_dnode_create_root(vol, EXT2_ROOT_INO, &vol->g.root); if (status) return status; - + FSW_MSG_DEBUG((FSW_MSGSTR("fsw_ext2_volume_mount: success, blocksize %d\n"), blocksize)); - + return FSW_SUCCESS; } @@ -197,12 +197,12 @@ static fsw_status_t fsw_ext2_dnode_fill(struct fsw_ext2_volume *vol, struct fsw_ fsw_status_t status; fsw_u32 groupno, ino_in_group, ino_bno, ino_index; fsw_u8 *buffer; - + if (dno->raw) return FSW_SUCCESS; - + FSW_MSG_DEBUG((FSW_MSGSTR("fsw_ext2_dnode_fill: inode %d\n"), dno->g.dnode_id)); - + // read the inode block groupno = (dno->g.dnode_id - 1) / vol->sb->s_inodes_per_group; ino_in_group = (dno->g.dnode_id - 1) % vol->sb->s_inodes_per_group; @@ -212,13 +212,13 @@ static fsw_status_t fsw_ext2_dnode_fill(struct fsw_ext2_volume *vol, struct fsw_ status = fsw_block_get(vol, ino_bno, 2, (void **)&buffer); if (status) return status; - + // keep our inode around status = fsw_memdup((void **)&dno->raw, buffer + ino_index * vol->inode_size, vol->inode_size); fsw_block_release(vol, ino_bno, buffer); if (status) return status; - + // get info from the inode dno->g.size = dno->raw->i_size; // TODO: check docs for 64-bit sized files @@ -230,7 +230,7 @@ static fsw_status_t fsw_ext2_dnode_fill(struct fsw_ext2_volume *vol, struct fsw_ dno->g.type = FSW_DNODE_TYPE_SYMLINK; else dno->g.type = FSW_DNODE_TYPE_SPECIAL; - + return FSW_SUCCESS; } @@ -261,7 +261,7 @@ static fsw_status_t fsw_ext2_dnode_stat(struct fsw_ext2_volume *vol, struct fsw_ sb->store_time_posix(sb, FSW_DNODE_STAT_ATIME, dno->raw->i_atime); sb->store_time_posix(sb, FSW_DNODE_STAT_MTIME, dno->raw->i_mtime); sb->store_attr_posix(sb, dno->raw->i_mode); - + return FSW_SUCCESS; } @@ -285,22 +285,22 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ fsw_u32 bno, release_bno, buf_bcnt, file_bcnt; fsw_u32 *buffer; int path[5], i; - + // Preconditions: The caller has checked that the requested logical block // is within the file's size. The dnode has complete information, i.e. // fsw_ext2_dnode_read_info was called successfully on it. - + extent->type = FSW_EXTENT_TYPE_PHYSBLOCK; extent->log_count = 1; bno = extent->log_start; - + // try direct block pointers in the inode if (bno < EXT2_NDIR_BLOCKS) { path[0] = bno; path[1] = -1; } else { bno -= EXT2_NDIR_BLOCKS; - + // try indirect block if (bno < vol->ind_bcnt) { path[0] = EXT2_IND_BLOCK; @@ -308,7 +308,7 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ path[2] = -1; } else { bno -= vol->ind_bcnt; - + // try double-indirect block if (bno < vol->dind_bcnt) { path[0] = EXT2_DIND_BLOCK; @@ -317,7 +317,7 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ path[3] = -1; } else { bno -= vol->dind_bcnt; - + // use the triple-indirect block path[0] = EXT2_TIND_BLOCK; path[1] = bno / vol->dind_bcnt; @@ -327,7 +327,7 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ } } } - + // follow the indirection path buffer = dno->raw->i_block; buf_bcnt = EXT2_NDIR_BLOCKS; @@ -342,7 +342,7 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ } if (path[i+1] < 0) break; - + if (release_bno) fsw_block_release(vol, release_bno, buffer); status = fsw_block_get(vol, bno, 1, (void **)&buffer); @@ -352,7 +352,7 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ buf_bcnt = vol->ind_bcnt; } extent->phys_start = bno; - + // check if the following blocks can be aggregated into one extent file_bcnt = (fsw_u32)((dno->g.size + vol->g.log_blocksize - 1) & (vol->g.log_blocksize - 1)); while (path[i] + extent->log_count < buf_bcnt && // indirect block has more block pointers @@ -362,7 +362,7 @@ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ else break; } - + if (release_bno) fsw_block_release(vol, release_bno, buffer); return FSW_SUCCESS; @@ -383,16 +383,16 @@ static fsw_status_t fsw_ext2_dir_lookup(struct fsw_ext2_volume *vol, struct fsw_ fsw_u32 child_ino; struct ext2_dir_entry entry; struct fsw_string entry_name; - + // Preconditions: The caller has checked that dno is a directory node. - + entry_name.type = FSW_STRING_TYPE_ISO88591; - + // setup handle to read the directory status = fsw_shandle_open(dno, &shand); if (status) return status; - + // scan the directory for the file child_ino = 0; while (child_ino == 0) { @@ -405,7 +405,7 @@ static fsw_status_t fsw_ext2_dir_lookup(struct fsw_ext2_volume *vol, struct fsw_ status = FSW_NOT_FOUND; goto errorexit; } - + // compare name entry_name.len = entry_name.size = entry.name_len; entry_name.data = entry.name; @@ -414,10 +414,10 @@ static fsw_status_t fsw_ext2_dir_lookup(struct fsw_ext2_volume *vol, struct fsw_ break; } } - + // setup a dnode for the child item status = fsw_dnode_create(dno, child_ino, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); - + errorexit: fsw_shandle_close(&shand); return status; @@ -437,11 +437,11 @@ static fsw_status_t fsw_ext2_dir_read(struct fsw_ext2_volume *vol, struct fsw_ex fsw_status_t status; struct ext2_dir_entry entry; struct fsw_string entry_name; - + // Preconditions: The caller has checked that dno is a directory node. The caller // has opened a storage handle to the directory's storage and keeps it around between // calls. - + while (1) { // read next entry status = fsw_ext2_read_dentry(shand, &entry); @@ -449,22 +449,22 @@ static fsw_status_t fsw_ext2_dir_read(struct fsw_ext2_volume *vol, struct fsw_ex return status; if (entry.inode == 0) // end of directory return FSW_NOT_FOUND; - + // skip . and .. if ((entry.name_len == 1 && entry.name[0] == '.') || (entry.name_len == 2 && entry.name[0] == '.' && entry.name[1] == '.')) continue; break; } - + // setup name entry_name.type = FSW_STRING_TYPE_ISO88591; entry_name.len = entry_name.size = entry.name_len; entry_name.data = entry.name; - + // setup a dnode for the child item status = fsw_dnode_create(dno, entry.inode, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); - + return status; } @@ -478,14 +478,14 @@ static fsw_status_t fsw_ext2_read_dentry(struct fsw_shandle *shand, struct ext2_ { fsw_status_t status; fsw_u32 buffer_size; - + while (1) { // read dir_entry header (fixed length) buffer_size = 8; status = fsw_shandle_read(shand, &buffer_size, entry); if (status) return status; - + if (buffer_size < 8 || entry->rec_len == 0) { // end of directory reached entry->inode = 0; @@ -499,11 +499,11 @@ static fsw_status_t fsw_ext2_read_dentry(struct fsw_shandle *shand, struct ext2_ return FSW_VOLUME_CORRUPTED; break; } - + // valid, but unused entry, skip it shand->pos += entry->rec_len - 8; } - + // read file name (variable length) buffer_size = entry->name_len; status = fsw_shandle_read(shand, &buffer_size, entry->name); @@ -511,10 +511,10 @@ static fsw_status_t fsw_ext2_read_dentry(struct fsw_shandle *shand, struct ext2_ return status; if (buffer_size < entry->name_len) return FSW_VOLUME_CORRUPTED; - + // skip any remaining padding shand->pos += entry->rec_len - (8 + entry->name_len); - + return FSW_SUCCESS; } @@ -535,12 +535,12 @@ static fsw_status_t fsw_ext2_readlink(struct fsw_ext2_volume *vol, struct fsw_ex fsw_status_t status; int ea_blocks; struct fsw_string s; - + if (dno->g.size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; - + ea_blocks = dno->raw->i_file_acl ? (vol->g.log_blocksize >> 9) : 0; - + if (dno->raw->i_blocks - ea_blocks == 0) { // "fast" symlink, path is stored inside the inode s.type = FSW_STRING_TYPE_ISO88591; @@ -551,7 +551,7 @@ static fsw_status_t fsw_ext2_readlink(struct fsw_ext2_volume *vol, struct fsw_ex // "slow" symlink, path is stored in normal inode data status = fsw_dnode_readlink_data(dno, link_target); } - + return status; } diff --git a/filesystems/fsw_hfs.c b/filesystems/fsw_hfs.c index 59823c6..2719568 100644 --- a/filesystems/fsw_hfs.c +++ b/filesystems/fsw_hfs.c @@ -215,13 +215,13 @@ HFSGetDescription(CICell ih, char *str, long strMaxLen) static fsw_status_t fsw_hfs_volume_mount(struct fsw_hfs_volume *vol) { - fsw_status_t status, rv; - void *buffer = NULL; - HFSPlusVolumeHeader *voldesc; - fsw_u32 blockno; - struct fsw_string s; - HFSMasterDirectoryBlock* mdb; - UINTN i; + fsw_status_t status, rv; + void *buffer = NULL; + HFSPlusVolumeHeader *voldesc; + fsw_u32 blockno; + struct fsw_string s; + HFSMasterDirectoryBlock* mdb; +// UINTN i; rv = FSW_UNSUPPORTED; @@ -253,7 +253,7 @@ static fsw_status_t fsw_hfs_volume_mount(struct fsw_hfs_volume *vol) { if (vol->hfs_kind == 0) { - // DPRINT("found HFS+\n"); +// DPRINT("found HFS+\n"); vol->hfs_kind = FSW_HFS_PLUS; } } @@ -298,15 +298,9 @@ static fsw_status_t fsw_hfs_volume_mount(struct fsw_hfs_volume *vol) fsw_set_blocksize(vol, block_size, block_size); /* get volume name */ - for (i = kHFSMaxVolumeNameChars; i > 0; i--) - if (mdb->drVN[i-1] != ' ') - break; - s.type = FSW_STRING_TYPE_ISO88591; - s.size = s.len = 0; - s.data = NULL; //&mdb->drVN; //"HFS+ volume"; - - //fsw_status_t fsw_strdup_coerce(struct fsw_string *dest, int type, struct fsw_string *src) + s.size = s.len = kHFSMaxVolumeNameChars; + s.data = "HFS+ volume"; status = fsw_strdup_coerce(&vol->g.label, vol->g.host_string_type, &s); CHECK(status); @@ -349,6 +343,13 @@ static fsw_status_t fsw_hfs_volume_mount(struct fsw_hfs_volume *vol) vol->catalog_tree.root_node = be32_to_cpu (tree_header.rootNode); vol->catalog_tree.node_size = be16_to_cpu (tree_header.nodeSize); +// /* get volume name */ +// s.type = FSW_STRING_TYPE_ISO88591; +// s.size = s.len = kHFSMaxVolumeNameChars; +// s.data = vol->catalog_tree.file->g.name.data; +// status = fsw_strdup_coerce(&vol->g.label, vol->g.host_string_type, &s); +// CHECK(status); + /* Read extents overflow file */ r = fsw_hfs_read_file(vol->extents_tree.file, sizeof (BTNodeDescriptor), diff --git a/install.sh b/install.sh old mode 100755 new mode 100644 index c70c803..87bc4cb --- a/install.sh +++ b/install.sh @@ -17,6 +17,7 @@ # # Revision history: # +# 0.4.1 -- Added check for rEFItBlesser in OS X # 0.3.3.1 -- Fixed OS X 10.7 bug; also works as make target # 0.3.2.1 -- Check for presence of source files; aborts if not present # 0.3.2 -- Initial version @@ -160,6 +161,19 @@ InstallOnOSX() { if [[ $? != 0 ]] ; then Problems=1 fi + if [[ -f /Library/StartupItems/rEFItBlesser ]] ; then + echo + echo "/Library/StartupItems/rEFItBlesser file found!" + echo "This program is part of rEFIt, and will cause rEFInd to fail to work after" + echo -n "its first boot. Do you want to remove rEFItBlesser (Y/N)? " + read YesNo + if [[ $YesNo == "Y" || $YesNo == "y" ]] ; then + echo "Deleting /Library/StartupItems/rEFItBlesser..." + rm /Library/StartupItems/rEFItBlesser + else + echo "Not deleting rEFItBlesser." + fi + fi echo echo "WARNING: If you have an Advanced Format disk, *DO NOT* attempt to check the" echo "bless status with 'bless --info', since this is known to cause disk corruption" diff --git a/libeg/libeg.h b/libeg/libeg.h index 6a2b3c5..498db61 100644 --- a/libeg/libeg.h +++ b/libeg/libeg.h @@ -118,7 +118,7 @@ VOID egDrawImageArea(IN EG_IMAGE *Image, IN UINTN AreaPosX, IN UINTN AreaPosY, IN UINTN AreaWidth, IN UINTN AreaHeight, IN UINTN ScreenPosX, IN UINTN ScreenPosY); - +VOID egDisplayMessage(IN CHAR16 *Text, EG_PIXEL *BGColor); VOID egScreenShot(VOID); diff --git a/libeg/screen.c b/libeg/screen.c index a183578..fd441fe 100644 --- a/libeg/screen.c +++ b/libeg/screen.c @@ -39,7 +39,6 @@ #include "refit_call_wrapper.h" #include