Shave off bytes to compensate boot.img size increase

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-04-18 18:22:58 +02:00
parent ee9056d097
commit b076cdc730
3 changed files with 42 additions and 45 deletions

View file

@ -45,8 +45,9 @@ boot_version: .byte GRUB_BOOT_VERSION_MAJOR, GRUB_BOOT_VERSION_MINOR
* load address plus the size of the prepended A.OUT header (32 bytes). * load address plus the size of the prepended A.OUT header (32 bytes).
*/ */
boot_path: boot_path:
. = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR . = _start + GRUB_BOOT_MACHINE_KERNEL_BYTE
kernel_sector: .xword 2 boot_path_end:
kernel_byte: .xword (2 << 9)
kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
prom_finddev_name: .asciz "finddevice" prom_finddev_name: .asciz "finddevice"
@ -77,11 +78,23 @@ prom_error:
/* %o0: OF call name /* %o0: OF call name
* %o1: input arg 1 * %o1: input arg 1
*/ */
prom_call_1_1: prom_call_1_1_o2:
mov 1, %g1 clr %o2
ba prom_call ba prom_call_x_1
mov 1, %o5 mov 1, %g1
prom_call_getprop:
mov 4, %g1
stx %g1, [%l1 + 256]
mov CHOSEN_NODE_REG, %o1
ba prom_call_x_1
GET_ABS(prom_getprop_name, %o0)
prom_call_3_1_o1:
ba prom_call_3_1
mov BOOTDEV_REG, %o1
/* %o2: message string /* %o2: message string
* %o3: message length * %o3: message length
*/ */
@ -95,8 +108,9 @@ console_write:
* %o2: input arg 2 * %o2: input arg 2
* %o3: input arg 3 * %o3: input arg 3
*/ */
prom_call_3_1: prom_call_3_1:
mov 3, %g1 mov 3, %g1
prom_call_x_1:
mov 1, %o5 mov 1, %o5
/* fallthru */ /* fallthru */
@ -126,23 +140,17 @@ boot_continue:
* chosen_node = prom_finddevice("/chosen") * chosen_node = prom_finddevice("/chosen")
*/ */
GET_ABS(prom_finddev_name, %o0) GET_ABS(prom_finddev_name, %o0)
GET_ABS(prom_chosen_path, %o1) call prom_call_1_1_o2
call prom_call_1_1 GET_ABS(prom_chosen_path, %o1)
clr %o2
ldx [%l1 + 0x20], CHOSEN_NODE_REG ldx [%l1 + 0x20], CHOSEN_NODE_REG
brz CHOSEN_NODE_REG, prom_error brz CHOSEN_NODE_REG, prom_error
/* getprop(chosen_node, "stdout", &buffer, buffer_size) */ /* getprop(chosen_node, "stdout", &buffer, buffer_size) */
GET_ABS(prom_getprop_name, %o0) GET_ABS(prom_stdout_name, %o2)
mov 4, %g1
mov 1, %o5
mov CHOSEN_NODE_REG, %o1
GET_ABS(prom_stdout_name, %o2)
add %l1, 256, %o3 add %l1, 256, %o3
mov 1024, %o4 call prom_call_getprop
call prom_call mov 1024, %o4
stx %g1, [%l1 + 256]
lduw [%l1 + 256], STDOUT_NODE_REG lduw [%l1 + 256], STDOUT_NODE_REG
brz,pn STDOUT_NODE_REG, prom_error brz,pn STDOUT_NODE_REG, prom_error
@ -155,16 +163,11 @@ boot_continue:
GET_ABS(boot_path, %o3) GET_ABS(boot_path, %o3)
ldub [%o3], %o1 ldub [%o3], %o1
brnz,pn %o1, bootpath_known brnz,pn %o1, bootpath_known
mov 4, %g1
/* getprop(chosen_node, "bootpath", &buffer, buffer_size) */ /* getprop(chosen_node, "bootpath", &buffer, buffer_size) */
GET_ABS(prom_getprop_name, %o0) GET_ABS(prom_bootpath_name, %o2)
mov 1, %o5 call prom_call_getprop
mov CHOSEN_NODE_REG, %o1 mov (boot_path_end - boot_path), %o4
GET_ABS(prom_bootpath_name, %o2)
mov (kernel_sector - boot_path), %o4
call prom_call
stx %g1, [%l1 + 256]
bootpath_known: bootpath_known:
@ -174,9 +177,8 @@ bootpath_known:
* bootdev_handle = open(boot_path) * bootdev_handle = open(boot_path)
*/ */
GET_ABS(prom_open_name, %o0) GET_ABS(prom_open_name, %o0)
GET_ABS(boot_path, %o1) call prom_call_1_1_o2
call prom_call_1_1 GET_ABS(boot_path, %o1)
clr %o2
ldx [%l1 + 0x20], BOOTDEV_REG ldx [%l1 + 0x20], BOOTDEV_REG
brz,pn BOOTDEV_REG, prom_open_error brz,pn BOOTDEV_REG, prom_open_error
@ -184,28 +186,23 @@ bootpath_known:
/* Since we have 64-bit cells, the high cell of the seek offset /* Since we have 64-bit cells, the high cell of the seek offset
* is zero and the low cell is the entire value. * is zero and the low cell is the entire value.
* *
* seek(bootdev, 0, *kernel_sector << 9) * seek(bootdev, 0, *kernel_byte)
*/ */
GET_ABS(prom_seek_name, %o0) GET_ABS(prom_seek_name, %o0)
mov BOOTDEV_REG, %o1
clr %o2 clr %o2
LDX_ABS(kernel_sector, 0x00, %o3) call prom_call_3_1_o1
call prom_call_3_1 LDX_ABS(kernel_byte, 0x00, %o3)
sllx %o3, 9, %o3
/* read(bootdev, *kernel_address, 512) */ /* read(bootdev, *kernel_address, 512) */
GET_ABS(prom_read_name, %o0) GET_ABS(prom_read_name, %o0)
mov BOOTDEV_REG, %o1
LDUW_ABS(kernel_address, 0x00, %o2) LDUW_ABS(kernel_address, 0x00, %o2)
call prom_call_3_1 call prom_call_3_1_o1
mov 512, %o3 mov 512, %o3
LDUW_ABS(kernel_address, 0x00, %o2) LDUW_ABS(kernel_address, 0x00, %o2)
jmpl %o2, %o7 jmpl %o2, %o7
nop nop
1: ba,a 1b
. = _start + GRUB_BOOT_MACHINE_CODE_END . = _start + GRUB_BOOT_MACHINE_CODE_END
/* the last 4 bytes in the sector 0 contain the signature */ /* the last 4 bytes in the sector 0 contain the signature */

View file

@ -43,9 +43,9 @@
#define GRUB_BOOT_MACHINE_BOOT_DEVPATH 0x0a #define GRUB_BOOT_MACHINE_BOOT_DEVPATH 0x0a
#define GRUB_BOOT_MACHINE_BOOT_DEVPATH_END (0x80 - 40) #define GRUB_BOOT_MACHINE_BOOT_DEVPATH_END 0x80
#define GRUB_BOOT_MACHINE_KERNEL_SECTOR (0x80 - 40) #define GRUB_BOOT_MACHINE_KERNEL_BYTE 0x80
#define GRUB_BOOT_MACHINE_CODE_END \ #define GRUB_BOOT_MACHINE_CODE_END \
(0x1fc - GRUB_BOOT_AOUT_HEADER_SIZE) (0x1fc - GRUB_BOOT_AOUT_HEADER_SIZE)

View file

@ -115,7 +115,7 @@ setup (const char *prefix, const char *dir,
grub_uint16_t core_sectors; grub_uint16_t core_sectors;
grub_device_t root_dev, dest_dev; grub_device_t root_dev, dest_dev;
char *boot_devpath; char *boot_devpath;
grub_disk_addr_t *kernel_sector; grub_disk_addr_t *kernel_byte;
struct boot_blocklist *first_block, *block; struct boot_blocklist *first_block, *block;
char *tmp_img; char *tmp_img;
int i; int i;
@ -187,9 +187,9 @@ setup (const char *prefix, const char *dir,
boot_devpath = (char *) (boot_img boot_devpath = (char *) (boot_img
+ GRUB_BOOT_AOUT_HEADER_SIZE + GRUB_BOOT_AOUT_HEADER_SIZE
+ GRUB_BOOT_MACHINE_BOOT_DEVPATH); + GRUB_BOOT_MACHINE_BOOT_DEVPATH);
kernel_sector = (grub_disk_addr_t *) (boot_img kernel_byte = (grub_disk_addr_t *) (boot_img
+ GRUB_BOOT_AOUT_HEADER_SIZE + GRUB_BOOT_AOUT_HEADER_SIZE
+ GRUB_BOOT_MACHINE_KERNEL_SECTOR); + GRUB_BOOT_MACHINE_KERNEL_BYTE);
core_path = grub_util_get_path (dir, core_file); core_path = grub_util_get_path (dir, core_file);
core_size = grub_util_get_image_size (core_path); core_size = grub_util_get_image_size (core_path);
@ -350,7 +350,7 @@ setup (const char *prefix, const char *dir,
free (core_path); free (core_path);
free (tmp_img); free (tmp_img);
*kernel_sector = grub_cpu_to_be64 (first_sector); *kernel_byte = grub_cpu_to_be64 (first_sector << GRUB_DISK_SECTOR_BITS);
grub_util_info ("boot device path %s, prefix is %s, dest is %s", grub_util_info ("boot device path %s, prefix is %s, dest is %s",
boot_devpath, prefix, dest); boot_devpath, prefix, dest);