| /* |
| * bootlacestart.S -- A utility for installing GRLDR boot sectors to MBR/OSBR |
| * Copyright (C) 2005 Tinybit(tinybit@163.net) |
| * |
| * 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., 675 Mass Ave, Cambridge, MA 02139, USA. |
| */ |
| |
| /* |
| * This program is used to generate the GRLDR-INSTALL file. |
| * |
| * Use the following shell command to generate the GRLDR-INSTALL file: |
| * |
| * cp bootlacestart bootlace.com |
| * |
| */ |
| |
| /* Use the following command to compile and build: |
| * |
| * gcc -o bootlacestart.exec -nostdlib -I. -I.. -I../stage1 -Wl,-N -Wl,-s bootlacestart.S |
| * |
| */ |
| |
| //#define ABS(x) (x-_start+0x08048000) |
| //#define ABS(x) (x) |
| |
| #define __DOT_COM |
| |
| .text |
| .globl _start |
| |
| _start: |
| |
| /* command-line arguments: |
| * bootlace.com [OPTIONS] DEVICE_OR_FILE |
| */ |
| |
| # ELF header begin |
| |
| .byte 0x7F, 0x45, 0x4C, 0x46 # ELF magic number |
| // 7F 45 = jg dos_entry_point |
| // 4C = decw %sp |
| // 46 = incw %si |
| |
| #if 0 |
| .byte 0x01 # 32-bit |
| .byte 0x01 # little-endian |
| // 01 01 = addw %ax, (%bx, %di) |
| #else |
| .byte 0x01 # 32-bit |
| .byte 0xC0 # corrupt-endian! |
| # Sorry! |
| # We have to use this for DOS code! |
| // 01 C0 = addw %ax, %ax |
| #endif |
| |
| .byte 0x01 # version |
| |
| #ifdef __DOT_COM |
| |
| .byte 0xC0 # pad char |
| // 01 C0 = addw %ax, %ax |
| |
| //.byte 0xFA # pad char |
| // // cli |
| .byte 0x90 # pad char |
| // nop |
| |
| .byte 0x44 # pad char |
| // incw %sp |
| |
| //.byte 0xFB # pad char |
| // // sti |
| .byte 0x90 # pad char |
| // nop |
| |
| .byte 0x4E # pad char |
| // decw %si |
| |
| .byte 0x90 # pad char |
| // nop |
| |
| .byte 0x90 # pad char |
| // nop |
| |
| .byte 0xEB, 0x24 # pad char |
| // jmp invalid_dos_exec |
| |
| #endif |
| |
| . = _start + 0x10 |
| |
| .word 2 # e_type = Executable |
| .word 3 # e_machine = i386 |
| .long 1 # e_version |
| .long _start_linux # e_entry |
| .long (_ph_offset - _start) # e_phoff |
| .long (_sh_offset - _start) # e_shoff(section header table) |
| .long 0 # e_flags |
| .word 0x34 # e_ehsize (ELF header size) |
| .word 0x20 # e_phentsize(prog header entry size) |
| .word 1 # e_phnum(prog header entry count) |
| .word 0x28 # e_shentsize |
| .word 5 # e_shnum |
| .word 4 # e_shstrndx |
| |
| # ELF header end |
| |
| . = _start + 0x34 // aux dos entry point |
| |
| #ifdef __DOT_COM |
| |
| //invalid_dos_exec: |
| |
| /* this is real mode dos code */ |
| |
| .code16 |
| |
| #define __DOS_16 |
| #include "bootlace.inc" |
| |
| |
| bios_drive_number: |
| .long 0xff |
| |
| #if 0 |
| msg_invalid_dos: |
| |
| .ascii "\r\nError: Unsupported DOS. The DOS exec function call(int21/AX=4B00) did not\r\ntransfer flags of GREATER-THAN to this program. Report this problem to the\r\nmaintainers of GRUB FOR DOS.\r\n\r\n\0" |
| #endif |
| |
| .align 0x10 |
| #endif |
| |
| _ph_offset: |
| |
| .long 1 # p_type |
| .long (_start_linux - _start) # p_offset |
| .long _start_linux # p_vaddr |
| .long _start_linux # p_paddr |
| .long (pre_stage2_start - _start_linux) # p_filesz |
| .long (pre_stage2_start - _start_linux + 0x7E00) # p_memszz |
| .long 7 # p_flags |
| .long 0x200 # p_align |
| |
| |
| .align 0x200 |
| |
| _start_linux: |
| |
| /* this is protected mode linux code */ |
| |
| .code32 |
| |
| #undef __DOS_16 |
| #include "bootlace.inc" |
| |
| option_no_backup_mbr: |
| .ascii "--no-backup-mbr\0" |
| |
| option_force_backup_mbr: |
| .ascii "--force-backup-mbr\0" |
| |
| option_mbr_enable_floppy: |
| .ascii "--mbr-enable-floppy\0" |
| |
| option_mbr_disable_floppy: |
| .ascii "--mbr-disable-floppy\0" |
| |
| option_mbr_enable_osbr: |
| .ascii "--mbr-enable-osbr\0" |
| |
| option_mbr_disable_osbr: |
| .ascii "--mbr-disable-osbr\0" |
| |
| option_duce: |
| .ascii "--duce\0" |
| |
| option_boot_prevmbr_first: |
| .ascii "--boot-prevmbr-first\0" |
| |
| option_boot_prevmbr_last: |
| .ascii "--boot-prevmbr-last\0" |
| |
| option_preferred_drive: |
| .ascii "--preferred-drive=\0" |
| |
| option_preferred_partition: |
| .ascii "--preferred-partition=\0" |
| |
| option_install_partition: |
| .ascii "--install-partition=\0" |
| |
| option_sectors_per_track: |
| .ascii "--sectors-per-track=\0" |
| |
| option_heads: |
| .ascii "--heads=\0" |
| |
| option_start_sector: |
| .ascii "--start-sector=\0" |
| |
| option_total_sectors: |
| .ascii "--total-sectors=\0" |
| |
| option_floppy_partition: |
| .ascii "--floppy=\0" |
| |
| option_time_out: |
| .ascii "--time-out=\0" |
| |
| option_hot_key: |
| .ascii "--hot-key=\0" |
| |
| option_read_only: |
| .ascii "--read-only\0" |
| |
| option_floppy: |
| .ascii "--floppy\0" |
| |
| option_lba: |
| .ascii "--lba\0" |
| |
| option_chs: |
| .ascii "--chs\0" |
| |
| option_fat12: |
| .ascii "--fat12\0" |
| |
| option_fat16: |
| .ascii "--fat16\0" |
| |
| option_fat32: |
| .ascii "--fat32\0" |
| |
| option_ntfs: |
| .ascii "--ntfs\0" |
| |
| option_ext2: |
| .ascii "--ext2\0" |
| |
| option_vfat: |
| .ascii "--vfat\0" |
| |
| msg_start: |
| |
| /* messages begins at here */ |
| |
| msg_no_args: |
| |
| .ascii "\r\nError: No command-line arguments specified.\r\n\r\n\0" |
| |
| msg_too_many_files: |
| |
| .ascii "\r\nError: More than one files specified.\r\n\r\n\0" |
| |
| msg_no_file: |
| |
| .ascii "\r\nError: No device or file specified.\r\n\r\n\0" |
| |
| msg_option_backup_mbr: |
| .ascii "\r\nError: Specified an option twice for backing up MBR.\r\n\r\n\0" |
| |
| msg_option_backup_mbr_with_floppy: |
| .ascii "\r\nError: Specified --floppy with backing up MBR.\r\n\r\n\0" |
| |
| msg_option_backup_mbr_with_partition: |
| .ascii "\r\nError: Specified --install-partition with backing up MBR.\r\n\r\n\0" |
| |
| msg_option_mbr_floppy: |
| .ascii "\r\nError: Specified an option twice for searching floppy.\r\n\r\n\0" |
| |
| msg_option_mbr_floppy_with_floppy: |
| .ascii "\r\nError: Specified --floppy with MBR searching floppy.\r\n\r\n\0" |
| |
| msg_option_mbr_floppy_with_partition: |
| .ascii "\r\nError: Specified --install-partition with MBR searching floppy.\r\n\r\n\0" |
| |
| msg_option_mbr_osbr: |
| .ascii "\r\nError: Specified an option twice for booting osbr.\r\n\r\n\0" |
| |
| msg_option_mbr_osbr_with_floppy: |
| .ascii "\r\nError: Specified --floppy with booting osbr.\r\n\r\n\0" |
| |
| msg_option_mbr_osbr_with_partition: |
| .ascii "\r\nError: Specified --install-partition with booting osbr.\r\n\r\n\0" |
| |
| msg_option_duce: |
| .ascii "\r\nError: Specified --duce twice.\r\n\r\n\0" |
| |
| msg_option_duce_with_floppy: |
| .ascii "\r\nError: Specified --floppy with --duce.\r\n\r\n\0" |
| |
| msg_option_duce_with_partition: |
| .ascii "\r\nError: Specified --install-partition with --duce.\r\n\r\n\0" |
| |
| msg_option_boot_prevmbr: |
| .ascii "\r\nError: Specified an option twice for booting prevmbr.\r\n\r\n\0" |
| |
| msg_option_boot_prevmbr_with_floppy: |
| .ascii "\r\nError: Specified --floppy with booting prevmbr.\r\n\r\n\0" |
| |
| msg_option_boot_prevmbr_with_partition: |
| .ascii "\r\nError: Specified --install-partition with booting prevmbr.\r\n\r\n\0" |
| |
| msg_option_preferred_drive: |
| .ascii "\r\nError: Specified an option twice for preferred drive.\r\n\r\n\0" |
| |
| msg_option_preferred_drive_with_floppy: |
| .ascii "\r\nError: Specified --floppy with preferred drive.\r\n\r\n\0" |
| |
| msg_option_preferred_drive_with_partition: |
| .ascii "\r\nError: Specified --install-partition with preferred drive.\r\n\r\n\0" |
| |
| msg_option_preferred_partition: |
| .ascii "\r\nError: Specified an option twice for preferred partition.\r\n\r\n\0" |
| |
| msg_option_preferred_partition_with_floppy: |
| .ascii "\r\nError: Specified --floppy with preferred partition.\r\n\r\n\0" |
| |
| msg_option_preferred_partition_with_partition: |
| .ascii "\r\nError: Specified --install-partition with preferred partition.\r\n\r\n\0" |
| |
| msg_option_install_partition: |
| .ascii "\r\nError: Specified an option twice for install partition.\r\n\r\n\0" |
| |
| msg_option_install_partition_with_floppy: |
| .ascii "\r\nError: Specified --floppy with install partition.\r\n\r\n\0" |
| |
| msg_option_install_partition_not_implemented: |
| .ascii "\r\nSorry! --install-partition not yet implemented with this release.\r\n\r\n\0" |
| |
| msg_option_time_out: |
| .ascii "\r\nError: Specified an option twice for time out.\r\n\r\n\0" |
| |
| msg_option_time_out_with_floppy: |
| .ascii "\r\nError: Specified --floppy with time out.\r\n\r\n\0" |
| |
| msg_option_time_out_with_partition: |
| .ascii "\r\nError: Specified --install-partition with time out.\r\n\r\n\0" |
| |
| msg_option_time_out_without_prevmbr: |
| .ascii "\r\nError: Specified --time-out without specifying --boot-prevmbr-first.\r\n\r\n\0" |
| |
| msg_option_hot_key: |
| .ascii "\r\nError: Specified an option twice for hot key.\r\n\r\n\0" |
| |
| msg_option_hot_key_with_floppy: |
| .ascii "\r\nError: Specified --floppy with hot key.\r\n\r\n\0" |
| |
| msg_option_hot_key_with_partition: |
| .ascii "\r\nError: Specified --install-partition with hot key.\r\n\r\n\0" |
| |
| msg_option_hot_key_without_prevmbr: |
| .ascii "\r\nError: Specified --hot-key without specifying --boot-prevmbr-first.\r\n\r\n\0" |
| |
| msg_option_sectors_per_track: |
| .ascii "\r\nError: Specified an option twice for sectors per track.\r\n\r\n\0" |
| |
| msg_option_sectors_per_track_with_partition: |
| .ascii "\r\nError: Specified --install-partition with sectors per track.\r\n\r\n\0" |
| |
| msg_option_sectors_per_track_for_mbr: |
| .ascii "\r\nError: Specified --sectors-per-track for a hard drive.\r\n\r\n\0" |
| |
| msg_option_heads: |
| .ascii "\r\nError: Specified an option twice for heads.\r\n\r\n\0" |
| |
| msg_option_heads_with_partition: |
| .ascii "\r\nError: Specified --install-partition with --heads.\r\n\r\n\0" |
| |
| msg_option_heads_for_mbr: |
| .ascii "\r\nError: Specified --heads for a hard drive.\r\n\r\n\0" |
| |
| msg_option_start_sector: |
| .ascii "\r\nError: Specified an option twice for start sector.\r\n\r\n\0" |
| |
| msg_option_start_sector_with_partition: |
| .ascii "\r\nError: Specified --install-partition with --start-sector.\r\n\r\n\0" |
| |
| msg_option_start_sector_for_mbr: |
| .ascii "\r\nError: Specified --start-sector for a hard drive.\r\n\r\n\0" |
| |
| msg_option_total_sectors: |
| .ascii "\r\nError: Specified an option twice for total sectors.\r\n\r\n\0" |
| |
| msg_option_total_sectors_with_partition: |
| .ascii "\r\nError: Specified --install-partition with --total-sectors.\r\n\r\n\0" |
| |
| msg_option_total_sectors_for_mbr: |
| .ascii "\r\nError: Specified --total-sectors for a hard drive.\r\n\r\n\0" |
| |
| msg_option_read_only: |
| .ascii "\r\nError: Specified an option twice for read only.\r\n\r\n\0" |
| |
| msg_option_floppy: |
| .ascii "\r\nError: Specified an option twice for --floppy.\r\n\r\n\0" |
| |
| msg_option_lba: |
| .ascii "\r\nError: Specified an option twice for lba-chs mode.\r\n\r\n\0" |
| |
| msg_option_lba_for_mbr: |
| .ascii "\r\nError: Specified --lba for a hard drive.\r\n\r\n\0" |
| |
| msg_option_fstypes_for_mbr: |
| .ascii "\r\nError: Specified file system types for a hard-drive mbr device.\r\n\r\n\0" |
| |
| msg_partition_without_drive: |
| .ascii "\r\nError: Preferred partition without preferred drive.\r\n\r\n\0" |
| |
| msg_partition_start: |
| .ascii "\r\nError: For a single partition you must specify --start-sector to non-zero.\r\n\r\n\0" |
| |
| msg_floppy_start: |
| .ascii "\r\nError: For a real floppy you must specify --start-sector to 0.\r\n\r\n\0" |
| |
| msg_invalid_number: |
| .ascii "\r\nError: Invalid number format or invalid value for the specified option.\r\n\r\n\0" |
| |
| msg_invalid_option: |
| .ascii "\r\nError: Invalid option.\r\n\r\n\0" |
| |
| msg_open_file_rw: |
| .ascii "\r\nError: Cannot open file for read/write access.\r\n\r\n\0" |
| |
| msg_open_file_ro: |
| .ascii "\r\nError: Cannot open file for read-only access.\r\n\r\n\0" |
| |
| msg_read_file: |
| .ascii "\r\nError: Read file failed.\r\n\r\n\0" |
| |
| msg_lseek_file: |
| .ascii "\r\nError: Rewind file(lseek) failed.\r\n\r\n\0" |
| |
| msg_write_file: |
| .ascii "\r\nError: Write file failed.\r\n\r\n\0" |
| |
| msg_close_file: |
| .ascii "\r\nFatal! Close file failed. Please backup your disk in case it becomes unusable.\r\n\r\n\0" |
| |
| msg_boot_signature_mbr: |
| .ascii "\r\nError: No boot signature(55 AA). Must specify --floppy explicitly for floppy.\r\n\r\n\0" |
| |
| msg_invalid_partition_table: |
| .ascii "\r\nError: Invalid partition table. Must specify --floppy explicitly for floppy.\r\n\r\n\0" |
| |
| msg_floppy_partition_table: |
| .ascii "\r\nError: Specified --floppy for DEVICE_OR_FILE that has a valid partition table.\r\n\r\n\0" |
| |
| msg_sectors_per_track: |
| .ascii "\r\nError: Too few sectors(per track) to hold GRLDR.MBR.\r\n\r\n\0" |
| |
| msg_geometry_S: |
| .ascii "\r\nDisk geometry calculated according to the partition table:\r\n\r\n" |
| .ascii " Sectors per track = \0" |
| msg_geometry_H: |
| .ascii ", Number of heads = \0" |
| msg_success: |
| .ascii "\r\n\r\nSuccess.\r\n\r\n\0" |
| |
| msg_fstype_fat32_deny: |
| .ascii "\r\n\r\nError: Filesystem type is FAT32 but --fat32 was not specified.\r\n\r\n\0" |
| |
| msg_fstype_fat32_allow: |
| .ascii "\r\n\r\nFilesystem type is FAT32.\r\n\r\n\0" |
| |
| msg_fstype_ntfs_deny: |
| .ascii "\r\n\r\nError: Filesystem type is NTFS but --ntfs was not specified.\r\n\r\n\0" |
| |
| msg_fstype_ntfs_allow: |
| .ascii "\r\n\r\nFilesystem type is NTFS.\r\n\r\n\0" |
| |
| msg_fstype_fat12_deny: |
| .ascii "\r\n\r\nError: Filesystem type is FAT12 but --fat12 was not specified.\r\n\r\n\0" |
| |
| msg_fstype_fat12_allow: |
| .ascii "\r\n\r\nFilesystem type is FAT12.\r\n\r\n\0" |
| |
| msg_fstype_fat16_deny: |
| .ascii "\r\n\r\nError: Filesystem type is FAT16 but --fat16 was not specified.\r\n\r\n\0" |
| |
| msg_fstype_fat16_allow: |
| .ascii "\r\n\r\nFilesystem type is FAT16.\r\n\r\n\0" |
| |
| msg_fstype_ext2_deny: |
| .ascii "\r\n\r\nError: Filesystem type is EXT2 but --ext2 was not specified.\r\n\r\n\0" |
| |
| msg_fstype_ext2_allow: |
| .ascii "\r\n\r\nFilesystem type is EXT2.\r\n\r\n\0" |
| |
| msg_unsupported_fstype: |
| .ascii "\r\n\r\nError: Unsupported filesystem type.\r\n\r\n\0" |
| |
| msg_no_ntfs_boot_record: |
| .ascii "\r\n\r\nError: Filesystem type is NTFS, but no ntfs boot record was found.\r\n\r\n\0" |
| |
| msg_usage: |
| |
| .ascii "BOOTLACE writes GRLDR BOOT RECORD to MBR or to the boot area of a file system.\r\n" |
| .ascii "Usage: bootlace.com [OPTIONS] DEVICE_OR_FILE\r\n" |
| .ascii "Options: --read-only, --floppy[=N], --boot-prevmbr-first, --boot-prevmbr-last,\r\n" |
| .ascii "--no-backup-mbr, --force-backup-mbr, --mbr-enable-floppy, --mbr-disable-floppy,\r\n" |
| .ascii "--mbr-enable-osbr, --mbr-disable-osbr, --duce, --time-out=T, --hot-key=K, \r\n" |
| .ascii "--preferred-drive=D, --preferred-partition=P, --sectors-per-track=S, --heads=H,\r\n" |
| .ascii "--start-sector=B, --total-sectors=C, --install-partition=I, --lba, --chs,\r\n" |
| .ascii "--fat12, --fat16, --fat32, --vfat, --ntfs, --ext2\r\n" |
| .ascii "DEVICE_OR_FILE: Filename of the device or image. For DOS, a BIOS drive number\r\n" |
| .ascii "(in hex 0xHH or decimal DDD format)can be used to access the drive.\r\n\0" |
| |
| msg_end: |
| |
| .align 4 |
| |
| Cmax: .long 0 |
| Hmax: .long 0 |
| Smax: .long 0 |
| i: .long 0 |
| j: .long 0 |
| X: .long 0 |
| Y: .long 0 |
| C: # long, but high word is always 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| .word 0, 0 |
| H: |
| .long 0 |
| .long 0 |
| .long 0 |
| .long 0 |
| .long 0 |
| .long 0 |
| .long 0 |
| .long 0 |
| H8: .long 0 |
| L: |
| .long 0, 0 |
| .long 0, 0 |
| .long 0, 0 |
| .long 0, 0 |
| .long 0, 0 |
| .long 0, 0 |
| .long 0, 0 |
| .long 0, 0 |
| L8: .long 0, 0 |
| probed_sectors_per_track: |
| .long 0 |
| probed_heads: |
| .long 0 |
| number_digits: |
| .ascii " \0" /* 10 spaces */ |
| delimit_space: |
| .ascii " \0" /* 4 spaces */ |
| delimit_newline: |
| .ascii "\n\0" |
| backup_mbr: |
| |
| /* 0 no backup, Will not touch PREV_MBR |
| * 1 autobackup |
| * 2 forcebackup. Will overwrite the old PREV_MBR |
| */ |
| |
| .long 1 /* default is autobackup */ |
| |
| mbr_floppy: |
| |
| /* 0 enable floppy |
| * 1 disable floppy |
| * 2 enable floppy |
| */ |
| |
| .long 0 /* default is enable floppy */ |
| |
| mbr_osbr: |
| |
| /* 0 enable osbr |
| * 1 disable osbr |
| * 2 enable osbr |
| */ |
| |
| .long 0 /* default is enable osbr */ |
| |
| duce: |
| /* 0 enable unconditional command-line entrance |
| * 1 disable unconditional command-line entrance |
| * 2 enable unconditional command-line entrance |
| */ |
| |
| .long 0 /* default is enable unconditional command-line entrance */ |
| |
| boot_prevmbr: |
| |
| /* 0 boot prevmbr last |
| * 1 boot prevmbr first |
| * 2 boot prevmbr last |
| */ |
| |
| .long 0 /* default is boot prevmbr last */ |
| |
| preferred_drive: |
| |
| .long 0xff /* default is No Drive */ |
| |
| preferred_partition: |
| |
| .long 0xff /* default is Whole drive */ |
| |
| install_partition: |
| |
| .long 0xffffffff /* default is partition 0xff */ |
| |
| sectors_per_track: |
| |
| .long 0xffffff3f /* default is 63 */ |
| |
| heads: |
| |
| .long 0xffff00ff /* default is 255 */ |
| |
| start_sector: |
| |
| .long 0xffffffff /* default is invalid */ |
| |
| total_sectors: |
| |
| .long 0 /* default is invalid */ |
| |
| time_out: |
| |
| .long 0xffffff05 /* low byte default is 5 seconds */ |
| |
| hot_key: |
| |
| .long 0xffff3920 /* low word default is space bar */ |
| |
| read_only: |
| |
| /* 0 read only |
| * 2 read/write |
| */ |
| |
| .long 2 /* default is read/write */ |
| |
| floppy: |
| |
| /* 0xffffffff for hard drive image(with leading MBR) |
| * 0x000000ff for floppy image |
| * value < 0xff for partition image |
| */ |
| |
| .long 0xffffffff /* default is for hard drive MBR */ |
| |
| lba: |
| |
| /* 1 for lba, 0 for chs, -1 for `not specified'. */ |
| |
| .long 0xffffffff /* default is `not specified' */ |
| |
| fstypes: |
| |
| /* bit 0: fat12 */ |
| /* bit 1: fat16 */ |
| /* bit 2: fat32 */ |
| /* bit 3: ntfs */ |
| /* bit 4: ext2 */ |
| |
| .long 0xfffffff7 /* default is all types except ntfs */ |
| |
| sectors_to_write: |
| |
| /* default is number of sectors in GRLDR.MBR */ |
| |
| .long ((pre_stage2_start - _start1) / 512) |
| |
| current_partition: |
| .long 0 |
| |
| .align 0x200 |
| |
| #define GRLDR_INSTALL |
| #include "grldrstart.S" |
| |
| .code32 |
| |
| //.bss |
| |
| .align 0x200 |
| |
| mbr_63_sectors: |
| |
| //. = . + (63*512) |
| |
| .align 0x200 |
| |
| _string_table: |
| |
| .ascii "\0" |
| |
| .ascii ".shstrtab\0" |
| |
| .ascii ".text\0" |
| |
| .ascii ".data\0" |
| |
| .ascii ".bss\0" |
| |
| .align 4 |
| |
| _sh_offset: |
| |
| # SHT_UNDEF section |
| |
| .long 0 # sh_name = No name |
| .long 0 # sh_type = Inactive |
| .long 0 # sh_flags = No flags |
| .long 0 # sh_addr = No address |
| .long 0 # sh_offset = No file offset |
| .long 0 # sh_size = No size |
| .long 0 # sh_link = No link information |
| .long 0 # sh_info = No auxiliary information |
| .long 0 # sh_addralign = No alignment |
| .long 0 # sh_entsize = No entries |
| |
| # .text |
| |
| .long 0x0b # sh_name |
| .long 1 # sh_type = SHT_PROGBITS |
| .long 7 # sh_flags = WRITE,ALLOC, EXEC |
| |
| .long (_start_linux - _start + 0x08048000) |
| # sh_addr(in process space) |
| |
| .long (_start_linux - _start) |
| # sh_offset(from beginning of file) |
| |
| .long (pre_stage2_start - _start_linux) |
| # sh_size |
| |
| .long 0 # sh_link |
| .long 0 # sh_info |
| .long 0x200 # sh_addralign |
| .long 0 # sh_entsize |
| |
| # .data |
| |
| .long 0x11 # sh_name |
| .long 1 # sh_type = SHT_PROGBITS |
| .long 3 # sh_flags = WRITE, ALLOC |
| |
| .long (pre_stage2_start - _start + 0x08048000) |
| # sh_addr(in process space) |
| |
| .long (pre_stage2_start - _start) |
| # sh_offset(from beginning of file) |
| |
| .long 0 # sh_size (no data present) |
| .long 0 # sh_link |
| .long 0 # sh_info |
| .long 4 # sh_addralign |
| .long 0 # sh_entsize |
| |
| # .bss |
| |
| .long 0x17 # sh_name |
| .long 8 # sh_type = SHT_NOBITS |
| .long 3 # sh_flags = WRITE, ALLOC |
| |
| .long (pre_stage2_start - _start + 0x08048000) |
| # sh_addr(in process space) |
| |
| .long (pre_stage2_start - _start) |
| # sh_offset(from beginning of file) |
| |
| .long 0x7e00 # sh_size |
| .long 0 # sh_link |
| .long 0 # sh_info |
| .long 0x200 # sh_addralign |
| .long 0 # sh_entsize |
| |
| # .shstrtab |
| |
| .long 1 # sh_name |
| .long 3 # sh_type = SHT_STRTAB |
| .long 0 # sh_flags = no write,no alloc,no exec |
| .long 0 # sh_addr = not present in memory |
| |
| .long (_string_table - _start) |
| # sh_offset (where strtab begins at) |
| |
| .long (_sh_offset - _string_table) |
| # sh_size (size of the string table) |
| |
| .long 0 # sh_link |
| .long 0 # sh_info |
| .long 1 # sh_addralign |
| .long 0 # sh_entsize |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| //------------------------------------------------------------------- |
| |
| #if 0 /* begin backup sh.S for MandrakeISOinstall-10.0 */ |
| |
| /* Use the following command to compile and build: |
| * |
| * gcc -s -nostdlib -o sh sh.S |
| * |
| */ |
| |
| .globl _start |
| .text |
| |
| _start: |
| |
| /* fork() */ |
| xorl %eax, %eax |
| incl %eax |
| incl %eax |
| int $0x80 |
| testl %eax, %eax |
| jz 1f |
| /* exit(0) */ |
| xorl %ebx, %ebx |
| xorl %eax, %eax |
| incl %eax |
| int $0x80 |
| |
| 1: |
| #if 0 |
| /* setpgid(0,0) */ |
| xorl %ebx, %ebx |
| xorl %ecx, %ecx |
| xorl %eax, %eax |
| movb $57, %al |
| int $0x80 |
| #else |
| /* setsid() */ |
| xorl %eax, %eax |
| movb $66, %al |
| int $0x80 |
| #endif |
| 1: |
| /* sleep(1) */ |
| xorl %eax, %eax |
| movb $162, %al |
| movl $(time_sleep), %ebx |
| xorl %ecx, %ecx |
| int $0x80 |
| |
| /* access("/bin/sh", F_OK) */ |
| xorl %eax, %eax |
| movb $33, %al |
| movl $(shell_path), %ebx |
| xorl %ecx, %ecx |
| int $0x80 |
| orl %eax, %eax |
| jnz 1b /* loop when not exist */ |
| |
| /* execve("/bin/sh", argv, NULL) */ |
| xorl %eax, %eax |
| movb $11, %al |
| movl $(shell_path), %ebx |
| movl $(argv), %ecx |
| movl $(envp), %edx |
| int $0x80 |
| |
| /* exit(1) */ |
| xorl %ebx, %ebx |
| incl %ebx |
| xorl %eax, %eax |
| incl %eax |
| int $0x80 |
| |
| time_sleep: |
| .long 1 |
| .long 0 |
| |
| shell_path: |
| .string "/bin/sh" |
| arg0: |
| .string "mix_ISOs" |
| arg1: |
| .string "/tmp/mix_ISOs" |
| argv: |
| .long arg0 |
| .long arg1 |
| envp: |
| .long 0 |
| |
| #endif /* end backup sh.S for MandrakeISOinstall-10.0 */ |
| |