summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-boot/cromwell')
-rw-r--r--sys-boot/cromwell/ChangeLog10
-rw-r--r--sys-boot/cromwell/Manifest14
-rw-r--r--sys-boot/cromwell/cromwell-2.40-r3.ebuild33
-rw-r--r--sys-boot/cromwell/files/cromwell-2.40-r3-cvs-fixes.patch704
4 files changed, 758 insertions, 3 deletions
diff --git a/sys-boot/cromwell/ChangeLog b/sys-boot/cromwell/ChangeLog
index 0c9f1ba80160..b3f3a1f557b0 100644
--- a/sys-boot/cromwell/ChangeLog
+++ b/sys-boot/cromwell/ChangeLog
@@ -1,6 +1,12 @@
# ChangeLog for sys-boot/cromwell
-# Copyright 1999-2007 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-boot/cromwell/ChangeLog,v 1.9 2007/07/02 15:30:28 peper Exp $
+# Copyright 1999-2008 Gentoo Foundation; Distributed under the GPL v2
+# $Header: /var/cvsroot/gentoo-x86/sys-boot/cromwell/ChangeLog,v 1.10 2008/06/07 15:27:08 vapier Exp $
+
+*cromwell-2.40-r3 (07 Jun 2008)
+
+ 07 Jun 2008; Mike Frysinger <vapier@gentoo.org>
+ +files/cromwell-2.40-r3-cvs-fixes.patch, +cromwell-2.40-r3.ebuild:
+ Add fixes from upstream #204026 by Alan Kingsley.
02 Jul 2007; Piotr Jaroszyński <peper@gentoo.org>
cromwell-2.40-r2.ebuild:
diff --git a/sys-boot/cromwell/Manifest b/sys-boot/cromwell/Manifest
index 025f1d074e83..0fb4866cf687 100644
--- a/sys-boot/cromwell/Manifest
+++ b/sys-boot/cromwell/Manifest
@@ -1,5 +1,17 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
AUX cromwell-2.40-cvs-fixes.patch 18123 RMD160 ad9b195d78aa8b929d6b4ea45a385a34ee58c844 SHA1 96314895f081db8d5aa95a0d5950bba4244ddca2 SHA256 eef162d46296e47207339750044a6986143be009f94eac21510e1f3531e231c5
+AUX cromwell-2.40-r3-cvs-fixes.patch 21694 RMD160 dfe5fc3d487491e171b88597f207c482ccb982aa SHA1 72d4bafe2939518358e20e247ebb6559661d74aa SHA256 f8b520efb2fa6e73370a71a2d3b8def4351af491d7406a0e1ade21266e395b0b
DIST cromwell-2.40.tar.bz2 943015 RMD160 0b1efe4bee94e9d4b130008641fe4d2989439f43 SHA1 ce1b1d5a39f2c319d79ddb162f927ea053e1f354 SHA256 115cf68afad311f6e7490c3091dfb81870416cec3f2cb35d30360a919888cc3c
EBUILD cromwell-2.40-r2.ebuild 744 RMD160 102928e9a9f38303e56dadd8d9f88ac744dd90a1 SHA1 4ef495860b524e368b4b5f1fce7e7be6412b4b08 SHA256 3ab3f305c1670e60339bd7c986b85b7d2d10cb06ced0960032b1a62895ceea95
-MISC ChangeLog 1534 RMD160 c0a21ef2a3a078fb75afc6f2842f8e86073ce41f SHA1 ee2c198e18cb652390faf3bf4e9a33f2053ff3d8 SHA256 b841d2e464cc2276e4d30a6807ace85d73f78f66ccce1a9475430b852e808f90
+EBUILD cromwell-2.40-r3.ebuild 705 RMD160 71179158b2e0061dda86164b2351f7421fb60f1c SHA1 01aaa28481c71af8d46152d9d79b81943547c0b6 SHA256 5b8e2b4e14b2adbca7b25987fe676e6b35f1442078e5187a0c6d6e17687e1943
+MISC ChangeLog 1741 RMD160 b2334c8fb208f52f112f317f44f41eec67b6354c SHA1 2c4b7973bd3ef47b05ed61b8562436a7e9086cf0 SHA256 52dfd2b6851950842c76ac8d473a812b04de7ca81f6098e358e54f1f55c06225
MISC metadata.xml 213 RMD160 bd8c3555a7b97a82edc5c3b353e6daaf04c76c33 SHA1 d0dd456e741194ee9456c96a92df62121047db65 SHA256 71b6e267424942a7a763d7b1cc2cf7524a940d3f7edc042ef074933b135a906e
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.7 (GNU/Linux)
+
+iD8DBQFISqjSj9hvisErhMIRAhE8AJsEFl2h5t6y1xJoPaAaoLRxnChe1QCgjpSE
+L1PQCLU+osjzB4ro3wxLtOo=
+=3GQ7
+-----END PGP SIGNATURE-----
diff --git a/sys-boot/cromwell/cromwell-2.40-r3.ebuild b/sys-boot/cromwell/cromwell-2.40-r3.ebuild
new file mode 100644
index 000000000000..ddc410c4ca01
--- /dev/null
+++ b/sys-boot/cromwell/cromwell-2.40-r3.ebuild
@@ -0,0 +1,33 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-boot/cromwell/cromwell-2.40-r3.ebuild,v 1.1 2008/06/07 15:27:08 vapier Exp $
+
+inherit eutils mount-boot
+
+DESCRIPTION="Xbox boot loader"
+HOMEPAGE="http://www.xbox-linux.org/wiki/Cromwell"
+SRC_URI="mirror://gentoo/${P}.tar.bz2"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="-* ~x86"
+IUSE=""
+RESTRICT="strip"
+
+DEPEND=""
+PROVIDE="virtual/bootloader"
+
+src_unpack() {
+ unpack ${A}
+ cd "${S}"
+ epatch "${FILESDIR}"/${P}-r3-cvs-fixes.patch
+}
+
+src_compile() {
+ emake -j1 || die
+}
+
+src_install() {
+ insinto /boot/${PN}
+ doins image/cromwell{,_1024}.bin xbe/xromwell.xbe || die
+}
diff --git a/sys-boot/cromwell/files/cromwell-2.40-r3-cvs-fixes.patch b/sys-boot/cromwell/files/cromwell-2.40-r3-cvs-fixes.patch
new file mode 100644
index 000000000000..2160f2047772
--- /dev/null
+++ b/sys-boot/cromwell/files/cromwell-2.40-r3-cvs-fixes.patch
@@ -0,0 +1,704 @@
+--- cromwell-2.40/boot/LoadLinux.c
++++ cromwell-2.40/boot/LoadLinux.c
+@@ -33,10 +33,12 @@
+
+
+ void ExittoLinux(CONFIGENTRY *config);
+-void startLinux(void* initrdStart, unsigned long initrdSize, const char* appendLine);
++void startLinux(void* initrdStart, unsigned long initrdSize, const char* appendLine, unsigned int entry);
+ void setup(void* KernelPos, void* PhysInitrdPos, unsigned long InitrdSize, const char* kernel_cmdline);
+ void I2CRebootSlow(void);
+
++void try_elf_boot (char* data, int len);
++
+
+ void BootPrintConfig(CONFIGENTRY *config) {
+ int CharsProcessed=0, CharsSinceNewline=0, Length=0;
+@@ -69,6 +71,10 @@
+ unsigned int nSizeHeader=((*(kernelOrg + 0x01f1))+1)*512;
+ memcpy((u8 *)KERNEL_SETUP, kernelOrg, nSizeHeader);
+ memcpy((u8 *)KERNEL_PM_CODE,(kernelOrg+nSizeHeader),kernelSize-nSizeHeader);
++
++ /* Try to execute a pure ELF binary here, using the etherboot
++ * code. This is required for ELF kernels, such as FreeBSD */
++ try_elf_boot ((char*)kernelOrg, kernelSize);
+ }
+
+
+@@ -313,9 +319,15 @@
+ configLoaded=1;
+ break;
+ }
++ dwConfigSize = BootIso9660GetFile(cdromId,"/linuxboot.cfg", (u8 *)KERNEL_SETUP, 0x800);
++ if (dwConfigSize>0) {
++ configLoaded=1;
++ break;
++ }
+ wait_ms(250);
+ }
+
++ //We couldn't read the disk, so we eject the drive so the user can insert one.
+ if (!configLoaded) {
+ //Needs to be changed for non-xbox drives, which don't have an eject line
+ //Need to send ATA eject command.
+@@ -326,20 +338,29 @@
+ printk("\2Please insert CD and press Button A\n\n");
+
+ while(1) {
++ // Make button 'A' close the DVD tray
+ if (risefall_xpad_BUTTON(TRIGGER_XPAD_KEY_A) == 1) {
+- I2CTransmitWord(0x10, 0x0c01); // close DVD tray
++ I2CTransmitWord(0x10, 0x0c01);
+ wait_ms(500);
+ break;
+ }
+- wait_ms(10);
+-
+- //Keep trying to read, in case somebody puts the tray in manually, without pressing A
+- dwConfigSize = BootIso9660GetFile(cdromId,"/linuxboo.cfg", (u8 *)KERNEL_SETUP, 0x800);
+- if (dwConfigSize>0) {
+- configLoaded=1;
++ else if (DVD_TRAY_STATE == DVD_CLOSING) {
++ //It's an xbox drive, and somebody pushed the tray in manually
++ wait_ms(500);
+ break;
+ }
+- }
++ else if (BootIso9660GetFile(cdromId,"/linuxboo.cfg", (u8 *)KERNEL_SETUP, 0x800)>0) {
++ //It isnt an xbox drive, and somebody pushed the tray in manually, and
++ //the cd is valid.
++ break;
++ }
++ else if (BootIso9660GetFile(cdromId,"/linuxboot.cfg", (u8 *)KERNEL_SETUP, 0x800)>0) {
++ break;
++ }
++ wait_ms(10);
++ }
++
++ wait_ms(250);
+
+ VIDEO_ATTR=0xffffffff;
+
+@@ -351,6 +372,11 @@
+ configLoaded=1;
+ break;
+ }
++ dwConfigSize = BootIso9660GetFile(cdromId,"/linuxboot.cfg", (u8 *)KERNEL_SETUP, 0x800);
++ if (dwConfigSize>0) {
++ configLoaded=1;
++ break;
++ }
+ wait_ms(250);
+ }
+ }
+@@ -423,7 +449,7 @@
+ //Try for 4 seconds.
+ I2CTransmitWord(0x10, 0x0c01); // close DVD tray
+ for (n=0;n<16;++n) {
+- if((BootIso9660GetFile(cdromId,"/image.bin", (u8 *)KERNEL_SETUP, 0x10)) >=0 ) {
++ if((BootIso9660GetFile(cdromId,"/image.bin", (u8 *)KERNEL_PM_CODE, 0x10)) >=0 ) {
+ cdPresent=1;
+ break;
+ }
+@@ -454,7 +480,7 @@
+
+ // wait until the media is readable
+ while(1) {
+- if((BootIso9660GetFile(cdromId,"/image.bin", (u8 *)KERNEL_SETUP, 0x10)) >=0 ) {
++ if((BootIso9660GetFile(cdromId,"/image.bin", (u8 *)KERNEL_PM_CODE, 0x10)) >=0 ) {
+ break;
+ }
+ wait_ms(200);
+@@ -462,7 +488,7 @@
+ }
+ printk("CDROM: ");
+ printk("Loading bios image from CDROM:/image.bin. \n");
+- dwConfigSize=BootIso9660GetFile(cdromId, "/image.bin", (u8 *)KERNEL_PM_CODE, 256*1024);
++ dwConfigSize=BootIso9660GetFile(cdromId, "/image.bin", (u8 *)KERNEL_PM_CODE, 256*1024);
+
+ if( dwConfigSize < 0 ) { //It's not there
+ printk("image.bin not found on CDROM... Halting\n");
+@@ -508,12 +534,12 @@
+ VIDEO_ATTR=0xff9f9fbf;
+ printk(sz);
+ }
+- I2cSetFrontpanelLed(I2C_LED_RED0 | I2C_LED_RED1 | I2C_LED_RED2 | I2C_LED_RED3 );
+- startLinux((void*)INITRD_START, dwInitrdSize, config->szAppend);
++ setLED("rrrr");
++ startLinux((void*)INITRD_START, dwInitrdSize, config->szAppend, 0x100000);
+ }
+
+
+-void startLinux(void* initrdStart, unsigned long initrdSize, const char* appendLine)
++void startLinux(void* initrdStart, unsigned long initrdSize, const char* appendLine, unsigned int entry)
+ {
+ int nAta=0;
+ // turn off USB
+@@ -535,10 +561,7 @@
+ BootIdeSetTransferMode(1, 0x40 | nAta);
+
+ // orange, people seem to like that colour
+- I2cSetFrontpanelLed(
+- I2C_LED_GREEN0 | I2C_LED_GREEN1 | I2C_LED_GREEN2 | I2C_LED_GREEN3 |
+- I2C_LED_RED0 | I2C_LED_RED1 | I2C_LED_RED2 | I2C_LED_RED3
+- );
++ setLED("oooo");
+
+ // Set framebuffer address to final location (for vesafb driver)
+ (*(unsigned int*)0xFD600800) = (0xf0000000 | ((xbox_ram*0x100000) - FB_SIZE));
+@@ -549,6 +572,8 @@
+ // clear idt area
+ memset((void*)IDT_LOC,0x0,1024*8);
+
++ __asm__ ("movl %0,%%ebx" : : "a" (entry)); /* ebx = entry */
++
+ __asm __volatile__ (
+ "wbinvd\n"
+
+@@ -597,13 +622,15 @@
+ // Set the stack pointer to give us a valid stack
+ "movl $0x03BFFFFC, %esp \n"
+
+- "xor %ebx, %ebx \n"
+ "xor %eax, %eax \n"
+ "xor %ecx, %ecx \n"
+ "xor %edx, %edx \n"
+ "xor %edi, %edi \n"
+ "movl $0x90000, %esi\n" // kernel setup area
+- "ljmp $0x10, $0x100000\n" // Jump to Kernel protected mode entry
++ "pushl $0x10\n"
++ "pushl %ebx\n" // 0x10:ebx is the entry point
++ "xor %ebx,%ebx\n" // clean leftover ebx (held entry point)
++ ".byte 0xcb\n " // retf
+ );
+
+ // We are not longer here, we are already in the Linux loader, we never come back here
+--- cromwell-2.40/boot_rom/bootrom.ld
++++ cromwell-2.40/boot_rom/bootrom.ld
+@@ -45,6 +45,7 @@
+ .rodata ( RAM_CODE + SIZEOF(.text) + SIZEOF(.data) ) : AT ( SIZEOF(.low_rom) + SIZEOF(.text) + SIZEOF(.data)) {
+ *(.rodata);
+ *(.rodata.str1.1);
++ *(.rodata.str1.4);
+ *(.rodata.str1.32);
+ *(.rodata.cst4);
+ *(.rodata.cst8);
+--- cromwell-2.40/drivers/ide/BootHddKey.c
++++ cromwell-2.40/drivers/ide/BootHddKey.c
+@@ -5,13 +5,8 @@
+ #include <stdarg.h>
+ //#include <string.h>
+
+-
+-
+ void HMAC_hdd_calculation(int version,unsigned char *HMAC_result, ... );
+
+-extern size_t strlen(const char * s);
+-
+-
+ int copy_swap_trim(unsigned char *dst, unsigned char *src, int len)
+ {
+ unsigned char tmp;
+--- cromwell-2.40/drivers/video/encoder.h
++++ cromwell-2.40/drivers/video/encoder.h
+@@ -21,13 +21,13 @@
+ #define NUM_CONEXANT_REGS 0x69
+ #define MAX_ENCODER_REGS 256
+
+-#define u8 unsigned char
+ #define U032 long
+ #ifndef encoder_h
+ #define encoder_h
+
+ //#include <linux/xboxfbctl.h>
+ #include "VideoInitialization.h"
++#include "boot.h"
+
+ typedef struct {
+ double m_dHzBurstFrequency;
+--- cromwell-2.40/drivers/video/focus.c
++++ cromwell-2.40/drivers/video/focus.c
+@@ -13,6 +13,7 @@
+ */
+ #include "focus.h"
+ #include "encoder.h"
++#include "boot.h"
+
+ typedef struct _focus_pll_settings{
+ long dotclock;
+--- cromwell-2.40/etherboot/core/Makefile
++++ cromwell-2.40/etherboot/core/Makefile
+@@ -1,4 +1,4 @@
+
+-O_TARGET := nfs.o nic.o osloader.o proto_tftm.o xbox_misc.o xbox_pci.o etherboot_config.o xbox_main.o
++O_TARGET := nfs.o nic.o osloader.o proto_tftm.o xbox_misc.o xbox_pci.o etherboot_config.o xbox_main.o exec_elf.o
+
+ include $(TOPDIR)/Rules.make
+--- cromwell-2.40/etherboot/core/exec_elf.c
++++ cromwell-2.40/etherboot/core/exec_elf.c
+@@ -0,0 +1,22 @@
++#include "etherboot.h"
++
++/*
++ * This is a helper function; it tries to execute an ELF image using
++ * the Etherboot code. This is because *BSD kernels are raw ELF files,
++ * which are unsupported when booting from CD-ROM or disk.
++ */
++void
++try_elf_boot (char* image, int len)
++{
++ os_download_t os_download;
++
++ /* do nothing if the ELF magic mismatches */
++ if (*(int*)image != 0x464c457f)
++ return;
++
++ os_download = probe_image (image, len);
++ if (os_download == 0)
++ return;
++
++ os_download (image, len, 1);
++}
+--- cromwell-2.40/fs/cdrom/iso9660.c
++++ cromwell-2.40/fs/cdrom/iso9660.c
+@@ -10,7 +10,11 @@
+ 2004-07-22 "Edgar Hucek"<hostmaster@ed-soft.at> Created
+ */
+
++#ifndef STANDALONE
+ #include "boot.h"
++#else
++# define printk printf
++#endif
+ #include "iso_fs.h"
+
+ int isupper( int ch )
+@@ -96,25 +100,31 @@
+ sprintf(newfilename, "%s/",filename);
+ iso9660_name_translate(newfilename + strlen(newfilename),
+ dir->name, (unsigned char)dir->name_len[0]);
+-// printk("Read : Sector %d Filename %s %d\n",
+-// *((unsigned long *)(dir->extent)), newfilename,
+-// (unsigned char)dir->ext_attr_length[0]);
++#ifdef DEBUG_ISO
++ printk("Read : Sector %d Filename %s %d\n",
++ *((unsigned long *)(dir->extent)), newfilename,
++ (unsigned char)dir->ext_attr_length[0]);
++#endif
+ }
+
+ if(strlen(newfilename) <= strlen(search)) {
+ if(memcmp(newfilename, search, strlen(search)) == 0) {
+ sect = *((unsigned long *)(dir->extent));
+ memcpy(dir_found, dir, sizeof(struct iso_directory_record));
+-// printk("Found : Sector %d Directory %s Filename %s %d %d \n",
+-// sect, newfilename, search,
+-// strlen(newfilename), strlen(search));
++#ifdef DEBUG_ISO
++ printk("Found : Sector %d Directory %s Filename %s %d %d \n",
++ sect, newfilename, search,
++ strlen(newfilename), strlen(search));
++#endif
+ // free(newfilename);
+ // free(buffer);
+ return sect;
+ }
+ }
+ if((*((char *)(dir->flags)) & IS_DIR) && (*((unsigned char *)(dir->name_len)) > 1)) {
+-// printk("Directory %s Filename %s\n", newfilename, search);
++#ifdef DEBUG_ISO
++ printk("Directory %s Filename %s\n", newfilename, search);
++#endif
+ if (strlen(newfilename) < strlen(search) && !memcmp(search,newfilename,
+ strlen(newfilename)) && search[strlen(newfilename)]=='/') {
+ sect = read_dir(driveId, dir, search, newfilename, dir_found);
+@@ -131,35 +141,46 @@
+ return sect;
+ }
+
+-void read_file(int driveId, struct iso_directory_record *dir_read, char *buffer) {
++unsigned long read_file(int driveId, struct iso_directory_record *dir_read, char *buffer, unsigned int max_bytes_to_read) {
+ unsigned long read_size;
++ unsigned long bytes_read;
+ unsigned long offset;
+ int i;
+ char *tmpbuff;
+
++
+ offset = *((unsigned long *)(dir_read->extent));
+ tmpbuff = (char *) malloc(ISO_BLOCKSIZE);
++
++ if (max_bytes_to_read > *((unsigned int *)(dir_read->size)) ) {
++ read_size = *(unsigned long *)dir_read->size;
++ }
++ else read_size = *(unsigned long *)max_bytes_to_read;
++
++ bytes_read = read_size;
+
+- read_size = *((unsigned long *)(dir_read->size));
+ if(read_size <= ISO_BLOCKSIZE) {
+ read_size = ISO_BLOCKSIZE;
+ } else {
+ read_size+=(ISO_BLOCKSIZE - (read_size % ISO_BLOCKSIZE));
+ }
+
+-// printk(" read_file sector %d %d\n", offset, read_size);
+-
++#ifdef DEBUG_ISO
++ printk(" read_file sector %d %d\n", offset, read_size);
++#endif
+ for(i = 0; i < (read_size >> ISOFS_BLOCK_BITS) ; i++) {
+ memset(tmpbuff, 0x0, ISO_BLOCKSIZE);
+ BootIdeReadSector(driveId, tmpbuff, offset , 0, ISO_BLOCKSIZE);
+ offset++;
+ if(((i+1) * ISO_BLOCKSIZE) > read_size) {
+- memcpy(&buffer[i * ISO_BLOCKSIZE], tmpbuff, (i * ISO_BLOCKSIZE) - *((unsigned long *)(dir_read->size)));
++ memcpy(&buffer[i * ISO_BLOCKSIZE], tmpbuff, (i * ISO_BLOCKSIZE) - read_size);
+ } else {
+ memcpy(&buffer[i * ISO_BLOCKSIZE], tmpbuff, ISO_BLOCKSIZE);
+ }
+ }
+ free(tmpbuff);
++
++ return bytes_read;
+ }
+
+ int BootIso9660GetFile(int driveId, char *szcPath, unsigned char *pbaFile, unsigned int dwFileLengthMax) {
+@@ -177,7 +198,9 @@
+ memset(dir,0x0,sizeof(struct iso_directory_record));
+
+ if(BootIdeReadSector(driveId, pvd, 16 , 0, ISO_BLOCKSIZE)) {
+-// printk("BootIso9660GetFile : Error read Sector\n");
++#ifdef DEBUG_ISO
++ printk("BootIso9660GetFile : Error read Sector\n");
++#endif
+ free(pvd);
+ free(dir);
+ return -1;
+@@ -187,14 +210,9 @@
+ offset = read_dir(driveId, rootd, szcPath, "", dir);
+
+ if(offset > 0) {
+- if(*((unsigned long *)(dir->size)) > dwFileLengthMax) {
+- free(pvd);
+- free(dir);
+- return -1;
+- }
+- read_file(driveId, dir, pbaFile);
+- return *((unsigned long *)(dir->size));
++ return read_file(driveId, dir, pbaFile, dwFileLengthMax);
+ } else {
++ //Not found
+ free(pvd);
+ free(dir);
+ return -1;
+--- cromwell-2.40/fs/grub/fsys_ext2fs.c
++++ cromwell-2.40/fs/grub/fsys_ext2fs.c
+@@ -16,6 +16,7 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
++#include "boot.h"
+
+ #ifdef FSYS_EXT2FS
+
+--- cromwell-2.40/fs/grub/fsys_reiserfs.c
++++ cromwell-2.40/fs/grub/fsys_reiserfs.c
+@@ -17,7 +17,7 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+-
++#include "boot.h"
+ #ifdef FSYS_REISERFS
+ #include "shared.h"
+ #include "filesys.h"
+@@ -367,7 +367,7 @@
+
+
+ static __inline__ unsigned long
+-log2 (unsigned long word)
++reiser_log2 (unsigned long word)
+ {
+ __asm__ ("bsfl %1,%0"
+ : "=r" (word)
+@@ -609,7 +609,7 @@
+
+ INFO->version = super.s_version;
+ INFO->blocksize = super.s_blocksize;
+- INFO->fullblocksize_shift = log2 (super.s_blocksize);
++ INFO->fullblocksize_shift = reiser_log2 (super.s_blocksize);
+ INFO->blocksize_shift = INFO->fullblocksize_shift - SECTOR_BITS;
+ INFO->cached_slots =
+ (FSYSREISER_CACHE_SIZE >> INFO->fullblocksize_shift) - 1;
+--- cromwell-2.40/include/boot.h
++++ cromwell-2.40/include/boot.h
+@@ -331,8 +331,12 @@
+ unsigned char *text1, int text1_length,
+ unsigned char *text2, int text2_length );
+
+-char *HelpGetLine(char *ptr);
+-void HelpGetParm(char *szBuffer, char *szOrig);
+ char *strrchr0(char *string, char ch);
+
++void setLED(void *pattern);
++
++int strlen(const char * s);
++int sprintf(char * buf, const char *fmt, ...);
++char * strncpy(char * dest,const char *src,int count);
++char * strstr(const char * s1,const char * s2);
+ #endif // _Boot_H_
+--- cromwell-2.40/include/config.h
++++ cromwell-2.40/include/config.h
+@@ -1,7 +1,7 @@
+ ////////////////////// compile-time options ////////////////////////////////
+
+ //Cromwell version number
+-#define VERSION "2.40"
++#define VERSION "2.40-r3"
+
+ // selects between the supported video modes, see boot.h for enum listing those available
+ //#define VIDEO_PREFERRED_MODE VIDEO_MODE_800x600
+--- cromwell-2.40/lib/gzip/misc.c
++++ cromwell-2.40/lib/gzip/misc.c
+@@ -29,8 +29,6 @@
+ *
+ * Incomprehensible are the ways of bootloaders.
+ */
+-static void* memset(void *, int, size_t);
+-static void* memcpy(void *, __const void *, size_t);
+ #define memzero(s, n) memset ((s), 0, (n))
+
+ typedef unsigned char uch;
+@@ -138,25 +136,6 @@
+ free_mem_ptr = (long) *ptr;
+ }
+
+-static void* memset(void* s, int c, size_t n)
+-{
+- int i;
+- char *ss = (char*)s;
+-
+- for (i=0;i<n;i++) ss[i] = c;
+- return s;
+-}
+-
+-static void* memcpy(void* __dest, __const void* __src,
+- size_t __n)
+-{
+- int i;
+- char *d = (char *)__dest, *s = (char *)__src;
+-
+- for (i=0;i<__n;i++) d[i] = s[i];
+- return __dest;
+-}
+-
+ /* ===========================================================================
+ * Fill the input buffer. This is called only when the buffer is empty
+ * and at least one byte is really needed.
+--- cromwell-2.40/lib/misc/BootLibrary.c
++++ cromwell-2.40/lib/misc/BootLibrary.c
+@@ -36,7 +36,7 @@
+ }
+
+
+-size_t strlen(const char * s)
++int strlen(const char * s)
+ {
+ int d0;
+ register int __res;
+@@ -99,7 +99,7 @@
+ return dest;
+ }
+
+-char * strncpy(char * dest,const char *src,size_t count)
++char * strncpy(char * dest,const char *src,int count)
+ {
+ int d0, d1, d2, d3;
+ __asm__ __volatile__(
+--- cromwell-2.40/lib/misc/LED.c
++++ cromwell-2.40/lib/misc/LED.c
+@@ -0,0 +1,52 @@
++/**
++ * Xbox LED Pattern setting for Cromwell.
++ * Copyright (C) Thomas "ShALLaX" Pedley (gentoox@shallax.com)
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++// Set the pattern of the LED.
++// The pattern must be 4 characters long and must consist
++// only of 'r', 'g', 'o' and 'x'.
++//
++// r = Red
++// g = Green
++// o = Orange
++// x = Off
++//
++// E.g. rgog will cycle through red, green, orange, green and then loop.
++
++void setLED(char *pattern) {
++ int i, r, g;
++ r = g = 0;
++
++ for (i=0; i<4; ++i) {
++ switch (pattern[i]) {
++ case 'r':
++ r++;
++ break;
++ case 'g':
++ g++;
++ break;
++ case 'o':
++ r++;
++ g++;
++ break;
++ }
++ r *= 2;
++ g *= 2;
++ }
++ I2cSetFrontpanelLed(((r<<4) & 0xF0) + (g & 0xF));
++}
+--- cromwell-2.40/lib/misc/Makefile
++++ cromwell-2.40/lib/misc/Makefile
+@@ -1,4 +1,4 @@
+
+-O_TARGET := BootLibrary.o BootParser.o setup.o vsprintf.o
++O_TARGET := BootLibrary.o BootParser.o setup.o vsprintf.o LED.o
+
+ include $(TOPDIR)/Rules.make
+--- cromwell-2.40/menu/iconmenu/IconMenuInit.c
++++ cromwell-2.40/menu/iconmenu/IconMenuInit.c
+@@ -26,7 +26,7 @@
+ if (tsaHarddiskInfo[i].m_fAtapi) {
+ char *driveName=malloc(sizeof(char)*14);
+ sprintf(driveName,"CD-ROM (hd%c)",i ? 'b':'a');
+- iconPtr = (ICON *)malloc(sizeof(ICON));
++ iconPtr = malloc(sizeof(ICON));
+ iconPtr->iconSlot = ICON_SOURCE_SLOT2;
+ iconPtr->szCaption = driveName;
+ iconPtr->functionPtr = BootFromCD;
+@@ -41,7 +41,7 @@
+
+ #ifdef ETHERBOOT
+ //Etherboot icon - if it's compiled in, it's always available.
+- iconPtr = (ICON *)malloc(sizeof(ICON));
++ iconPtr = malloc(sizeof(ICON));
+ iconPtr->iconSlot = ICON_SOURCE_SLOT3;
+ iconPtr->szCaption = "Etherboot";
+ iconPtr->functionPtr = BootFromEtherboot;
+@@ -49,7 +49,7 @@
+ #endif
+
+ #ifdef ADVANCED_MENU
+- iconPtr = (ICON *)malloc(sizeof(ICON));
++ iconPtr = malloc(sizeof(ICON));
+ iconPtr->iconSlot = ICON_SOURCE_SLOT0;
+ iconPtr->szCaption = "Advanced";
+ iconPtr->functionPtr = AdvancedMenu;
+@@ -74,7 +74,7 @@
+ CONFIGENTRY *entry = (CONFIGENTRY*)LoadConfigFatX();
+ if (entry !=NULL) {
+ //There is a config file present.
+- iconPtr = (ICON *)malloc(sizeof(ICON));
++ iconPtr = malloc(sizeof(ICON));
+ iconPtr->iconSlot = ICON_SOURCE_SLOT4;
+ iconPtr->szCaption="FatX (E:)";
+ iconPtr->functionPtr = DrawBootMenu;
+@@ -101,10 +101,10 @@
+ memset(ba,0x00,512);
+ BootIdeReadSector(driveId, ba, 0, 0, 512);
+
+- //See if there is an MBR - no MBR means no native boot options.
+- if( !(ba[0x1fe]==0x55) || !(ba[0x1ff]==0xaa)) return;
++ //See if there is an MBR - no MBR means no native boot options for this drive.
++ if( !(ba[0x1fe]==0x55) || !(ba[0x1ff]==0xaa)) continue;
+
+- (volatile u8 *)pb=&ba[0x1be];
++ pb=&ba[0x1be];
+ //Check the primary partitions
+ for (n=0; n<4; n++,pb+=16) {
+ if(pb[0]&0x80) {
+@@ -113,10 +113,10 @@
+ if (entry!=NULL) {
+ //There is a valid config file here.
+ //Add an icon for this partition
+- iconPtr = (ICON *)malloc(sizeof(ICON));
++ iconPtr = malloc(sizeof(ICON));
+ iconPtr->iconSlot = ICON_SOURCE_SLOT1;
+ iconPtr->szCaption=malloc(10);
+- sprintf(iconPtr->szCaption, "hd%c%d", driveId+'a', n);
++ sprintf(iconPtr->szCaption, "hd%c%d", driveId+'a', n+1);
+ iconPtr->functionPtr = DrawBootMenu;
+ iconPtr->functionDataPtr = (void *)entry;
+ AddIcon(iconPtr);
+--- cromwell-2.40/Makefile
++++ cromwell-2.40/Makefile
+@@ -10,11 +10,15 @@
+ -I$(TOPDIR)/startuploader -I$(TOPDIR)/drivers/cpu \
+ -I$(TOPDIR)/lib/jpeg/
+
+-CFLAGS = -O2 -mcpu=pentium -Werror $(INCLUDE) -Wstrict-prototypes -fomit-frame-pointer -pipe
++#These are intended to be non-overridable.
++CROM_CFLAGS=$(INCLUDE)
+
+-# add the option for gcc 3.3 only
++#You can override these if you wish.
++CFLAGS= -O2 -g -march=pentium -pipe -fomit-frame-pointer -Wstrict-prototypes
++
++# add the option for gcc 3.3 only, again, non-overridable
+ ifeq ($(GCC_3.3), 1)
+-CFLAGS += -fno-zero-initialized-in-bss
++CROM_CFLAGS += -fno-zero-initialized-in-bss
+ endif
+
+ LD = ld
+@@ -27,9 +31,9 @@
+ #### Etherboot specific stuff
+ ifeq ($(ETHERBOOT), yes)
+ ETH_SUBDIRS = etherboot
+-CFLAGS += -DETHERBOOT
++CROM_CFLAGS += -DETHERBOOT
+ ETH_INCLUDE = -I$(TOPDIR)/etherboot/include -I$(TOPDIR)/etherboot/arch/i386/include
+-ETH_CFLAGS = -O2 -mcpu=pentium -Werror $(ETH_INCLUDE) -Wstrict-prototypes -fomit-frame-pointer -pipe -Ui386
++ETH_CFLAGS = -O2 -march=pentium -Werror $(ETH_INCLUDE) -Wstrict-prototypes -fomit-frame-pointer -pipe -Ui386
+ endif
+
+ LDFLAGS-ROM = -s -S -T $(TOPDIR)/scripts/ldscript-crom.ld
+@@ -107,6 +111,7 @@
+ OBJECTS-CROM += $(TOPDIR)/obj/BootEEPROM.o
+ OBJECTS-CROM += $(TOPDIR)/obj/BootParser.o
+ OBJECTS-CROM += $(TOPDIR)/obj/BootFATX.o
++OBJECTS-CROM += $(TOPDIR)/obj/LED.o
+ #USB
+ OBJECTS-CROM += $(TOPDIR)/obj/config.o
+ OBJECTS-CROM += $(TOPDIR)/obj/hcd-pci.o
+@@ -137,6 +142,7 @@
+ OBJECTS-CROM += $(TOPDIR)/obj/etherboot_config.o
+ OBJECTS-CROM += $(TOPDIR)/obj/xbox_main.o
+ OBJECTS-CROM += $(TOPDIR)/obj/elf.o
++OBJECTS-CROM += $(TOPDIR)/obj/exec_elf.o
+ endif
+
+ RESOURCES = $(TOPDIR)/obj/backdrop.elf
+@@ -159,7 +165,7 @@
+
+ cromsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))
+ $(patsubst %, _dir_%, $(SUBDIRS)) : dummy
+- $(MAKE) CFLAGS="$(CFLAGS)" -C $(patsubst _dir_%, %, $@)
++ $(MAKE) CFLAGS="$(CFLAGS) $(CROM_CFLAGS)" -C $(patsubst _dir_%, %, $@)
+
+ dummy:
+