commit gfxboot for openSUSE:Factory
Hello community, here is the log from the commit of package gfxboot for openSUSE:Factory checked in at Fri Oct 30 16:54:13 CET 2009. -------- --- gfxboot/gfxboot.changes 2009-10-19 17:01:30.000000000 +0200 +++ /mounts/work_src_done/STABLE/gfxboot/gfxboot.changes 2009-10-30 12:18:05.000000000 +0100 @@ -1,0 +2,6 @@ +Fri Oct 30 12:17:52 CET 2009 - snwint@suse.de + +- extend interface so it works with gfxboot.c32 +- updated translations (bnc #551046) + +------------------------------------------------------------------- calling whatdependson for head-i586 Old: ---- gfxboot-4.1.37.tar.bz2 New: ---- gfxboot-4.1.39.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gfxboot.spec ++++++ --- /var/tmp/diff_new_pack.9Jf94r/_old 2009-10-30 16:53:57.000000000 +0100 +++ /var/tmp/diff_new_pack.9Jf94r/_new 2009-10-30 16:53:57.000000000 +0100 @@ -1,5 +1,5 @@ # -# spec file for package gfxboot (Version 4.1.37) +# spec file for package gfxboot (Version 4.1.39) # # Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany. # @@ -27,10 +27,10 @@ Requires: coreutils cpio mktemp perl master-boot-code dosfstools mtools perl-HTML-Parser AutoReqProv: on Summary: Graphical Boot Logo for GRUB, LILO and SYSLINUX -Version: 4.1.37 +Version: 4.1.39 Release: 1 BuildRoot: %{_tmppath}/%{name}-%{version}-build -Source: gfxboot-4.1.37.tar.bz2 +Source: gfxboot-4.1.39.tar.bz2 Source1: openSUSE.tar.bz2 Source2: SLED.tar.bz2 Source3: SLES.tar.bz2 ++++++ SLED.tar.bz2 ++++++ ++++++ SLES.tar.bz2 ++++++ ++++++ examples.tar.bz2 ++++++ ++++++ gfxboot-4.1.37.tar.bz2 -> gfxboot-4.1.39.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/Changelog new/gfxboot-4.1.39/Changelog --- old/gfxboot-4.1.37/Changelog 2009-10-19 16:55:59.000000000 +0200 +++ new/gfxboot-4.1.39/Changelog 2009-10-30 11:43:59.000000000 +0100 @@ -1,3 +1,9 @@ +30/10/2009: v4.1.39 + - updated translations (bnc #551046) + +29/10/2009: v4.1.38 + - extend interface so it works with gfxboot.c32 + 19/10/2009: v4.1.37 - fix progress indicator for PXE boot diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/VERSION new/gfxboot-4.1.39/VERSION --- old/gfxboot-4.1.37/VERSION 2009-10-19 16:54:50.000000000 +0200 +++ new/gfxboot-4.1.39/VERSION 2009-10-30 11:43:05.000000000 +0100 @@ -1 +1 @@ -4.1.37 +4.1.39 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/bincode.asm new/gfxboot-4.1.39/bincode.asm --- old/gfxboot-4.1.37/bincode.asm 2009-09-21 13:42:17.000000000 +0200 +++ new/gfxboot-4.1.39/bincode.asm 2009-10-29 12:25:03.000000000 +0100 @@ -68,7 +68,7 @@ link_entries equ 64 -; sysconfig data +; sysconfig data (64 bytes [sc.size]) sc.bootloader equ 0 sc.sector_shift equ 1 sc.media_type equ 2 @@ -90,6 +90,11 @@ sc.archive_end equ 40 sc.mem0_start equ 44 sc.mem0_end equ 48 +sc.xmem_start equ 52 +sc.xmem_end equ 56 +sc.features equ 60 +sc.reserved_1 equ 62 +sc.size equ 64 ; enum_type_t @@ -822,6 +827,22 @@ pop dword [malloc.area+4] mov ebx,[boot.sysconfig] + cmp byte [es:ebx+sc.sysconfig_size],sc.size + jb gfx_init_28 + ; pass back feature flags + mov word [es:ebx+sc.features],3 + ; only one xmem area + mov eax,[es:ebx+sc.xmem_start] + mov edx,[es:ebx+sc.xmem_end] + cmp edx,eax + jbe gfx_init_28 + ; ok, use only this one + mov [malloc.area+8],eax + mov [malloc.area+8+4],edx + jmp gfx_init_40 + +gfx_init_28: + ; old way to specify extended mem areas mov esi,malloc.area+8 mov ecx,malloc.areas-1 ; extended mem areas gfx_init_30: @@ -1236,6 +1257,10 @@ movzx edi,word [es:esi+menu_ent_list+2] shl edi,4 add edi,eax + cmp esi,1 << 20 + jb .low_mem + mov edi,[es:esi+menu_ent_list] +.low_mem: or ecx,ecx jz gfx_menu_init_45 gfx_menu_init_40: @@ -1257,6 +1282,10 @@ movzx edi,word [es:esi+menu_arg_list+2] shl edi,4 add edi,eax + cmp esi,1 << 20 + jb .low_mem + mov edi,[es:esi+menu_arg_list] +.low_mem: or ecx,ecx jz gfx_menu_init_55 gfx_menu_init_50: @@ -1272,6 +1301,10 @@ movzx edi,word [es:esi+menu_default+2] shl edi,4 add eax,edi + cmp esi,1 << 20 + jb .low_mem + mov eax,[es:esi+menu_default] +.low_mem: mov [tmp_var_3],eax mov ecx,cb_MenuInit diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/gfxboot new/gfxboot-4.1.39/gfxboot --- old/gfxboot-4.1.37/gfxboot 2009-10-19 16:26:46.000000000 +0200 +++ new/gfxboot-4.1.39/gfxboot 2009-10-21 15:36:43.000000000 +0200 @@ -948,6 +948,7 @@ my $opt_help_navi; my @opt_help_used; my %opt_help_entity; +my $opt_no_unpack = 0; my $sudo; my %config; @@ -1038,6 +1039,7 @@ 'used-pages=s{1,}' => \@opt_help_used, 'navi=s' => \$opt_help_navi, 'define=s%{1,}' => \%opt_help_entity, + 'no-unpack' => \$opt_no_unpack, ) || usage 1; $ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin"; @@ -1797,11 +1799,15 @@ mkdir "$dst/boot/$arch_dir/loader", 0755; } - my $bl_unpacked; - ( $bl_unpacked ) = unpack_archive $file; - my $bl_packed = pack_archive $bl_unpacked, 'bootlogo'; - - system "cp -a $bl_packed/* $dst/${loader}"; + if($opt_no_unpack) { + system "cp -a $file $dst/${loader}/bootlogo"; + } + else { + my $bl_unpacked; + ( $bl_unpacked ) = unpack_archive $file; + my $bl_packed = pack_archive $bl_unpacked, 'bootlogo'; + system "cp -a $bl_packed/* $dst/${loader}"; + } system "cp /boot/vmlinuz $dst/${loader}linux" if -f "/boot/vmlinuz"; system "cp /boot/initrd $dst/${loader}initrd" if -f "/boot/initrd"; @@ -1897,11 +1903,15 @@ my $dst = $gfxboot_tmp->dir('syslinux'); my $img = $gfxboot_tmp->file('syslinux.img'); - my $bl_unpacked; - ( $bl_unpacked ) = unpack_archive $file; - my $bl_packed = pack_archive $bl_unpacked, 'bootlogo'; - - system "cp -a $bl_packed/* $dst"; + if($opt_no_unpack) { + system "cp -a $file $dst/bootlogo"; + } + else { + my $bl_unpacked; + ( $bl_unpacked ) = unpack_archive $file; + my $bl_packed = pack_archive $bl_unpacked, 'bootlogo'; + system "cp -a $bl_packed/* $dst"; + } system "cp /boot/vmlinuz $dst/linux" if -f "/boot/vmlinuz"; system "cp /boot/initrd $dst/initrd" if -f "/boot/initrd"; @@ -2013,11 +2023,15 @@ mkdir "$dst/boot/$arch_dir/loader", 0755; } - my $bl_unpacked; - ( $bl_unpacked ) = unpack_archive $file; - my $bl_packed = pack_archive $bl_unpacked, 'bootlogo'; - - system "cp -a $bl_packed/* $dst/${loader}"; + if($opt_no_unpack) { + system "cp -a $file $dst/${loader}/bootlogo"; + } + else { + my $bl_unpacked; + ( $bl_unpacked ) = unpack_archive $file; + my $bl_packed = pack_archive $bl_unpacked, 'bootlogo'; + system "cp -a $bl_packed/* $dst/${loader}"; + } system "cp /boot/vmlinuz $dst/${loader}linux" if -f "/boot/vmlinuz"; system "cp /boot/initrd $dst/${loader}initrd" if -f "/boot/initrd"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/patches/gfxboot_c32.diff new/gfxboot-4.1.39/patches/gfxboot_c32.diff --- old/gfxboot-4.1.37/patches/gfxboot_c32.diff 1970-01-01 01:00:00.000000000 +0100 +++ new/gfxboot-4.1.39/patches/gfxboot_c32.diff 2009-10-29 16:23:21.000000000 +0100 @@ -0,0 +1,1080 @@ +diff --git a/Makefile b/Makefile +index 76abff5..c964e8d 100644 +--- a/Makefile ++++ b/Makefile +@@ -32,7 +32,7 @@ include $(topdir)/MCONFIG + # List of module objects that should be installed for all derivatives + MODULES = memdisk/memdisk memdump/memdump.com modules/*.com \ + com32/menu/*.c32 com32/modules/*.c32 com32/mboot/*.c32 \ +- com32/hdt/*.c32 com32/rosh/*.c32 ++ com32/hdt/*.c32 com32/rosh/*.c32 com32/gfxboot/*.c32 + + # syslinux.exe is BTARGET so as to not require everyone to have the + # mingw suite installed +diff --git a/com32/Makefile b/com32/Makefile +index 4a58485..69a125e 100644 +--- a/com32/Makefile ++++ b/com32/Makefile +@@ -1,3 +1,3 @@ +-SUBDIRS = lib gpllib libutil modules mboot menu samples rosh cmenu hdt ++SUBDIRS = lib gpllib libutil modules mboot menu samples rosh cmenu hdt gfxboot + all tidy dist clean spotless install: + set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done +diff --git a/com32/gfxboot/Makefile b/com32/gfxboot/Makefile +new file mode 100644 +index 0000000..2affcde +--- /dev/null ++++ b/com32/gfxboot/Makefile +@@ -0,0 +1,44 @@ ++## ----------------------------------------------------------------------- ++## ++## Copyright 2001-2009 H. Peter Anvin - All Rights Reserved ++## Copyright 2009 Intel Corporation; author: H. Peter Anvin ++## ++## 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, Inc., 53 Temple Place Ste 330, ++## Boston MA 02111-1307, USA; either version 2 of the License, or ++## (at your option) any later version; incorporated herein by reference. ++## ++## ----------------------------------------------------------------------- ++ ++topdir = ../.. ++include ../MCONFIG ++ ++MODULES = gfxboot.c32 ++ ++all: $(MODULES) ++ ++gfxboot.elf : gfxboot.o realmode_callback.o $(LIBS) $(C_LIBS) ++ $(LD) $(LDFLAGS) -o $@ $^ ++ ++realmode_callback.o: realmode_callback.asm ++ nasm -f bin -O99 -o $*.tmp -l $*.lst $< ++ objcopy -B i386 -I binary -O elf32-i386 \ ++ --redefine-sym _binary_$*_tmp_start=$*_start \ ++ --redefine-sym _binary_$*_tmp_end=$*_end \ ++ --strip-symbol _binary_$*_tmp_size \ ++ $*.tmp $@ ++ ++tidy dist: ++ rm -f *.o *.lo *.a *.lst *.elf .*.d *.tmp ++ ++clean: tidy ++ rm -f *.lnx ++ ++spotless: clean ++ rm -f *.lss *.c32 *.com ++ rm -f *~ \#* ++ ++install: ++ ++-include .*.d +diff --git a/com32/gfxboot/gfxboot.c b/com32/gfxboot/gfxboot.c +new file mode 100644 +index 0000000..e1b865a +--- /dev/null ++++ b/com32/gfxboot/gfxboot.c +@@ -0,0 +1,806 @@ ++/* ++ * ++ * gfxboot.c ++ * ++ * A com32 module to load gfxboot graphics. ++ * ++ * Copyright (c) 2009 Steffen Winterfeldt. ++ * ++ * 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, Inc., 53 Temple Place Ste 330, Boston MA ++ * 02111-1307, USA; either version 2 of the License, or (at your option) any ++ * later version; incorporated herein by reference. ++ * ++ */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <unistd.h> ++#include <string.h> ++#include <fcntl.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++ ++#include <syslinux/loadfile.h> ++#include <syslinux/config.h> ++#include <syslinux/linux.h> ++#include <syslinux/boot.h> ++#include <console.h> ++#include <com32.h> ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++#define MAX_CONFIG_LINE_LEN 2048 ++#define MAX_CMDLINE_LEN 2048 ++ ++// buffer for realmode callback ++// must be at least block size; can in theory be larger than 4k, but there's ++// not enough space left ++#define REALMODE_BUF_SIZE 4096 ++ ++// gfxboot working memory in MB ++#define GFX_MEMORY_SIZE 7 ++ ++// read chunk size for progress bar ++#define CHUNK_SIZE (64 << 10) ++ ++// callback function numbers ++#define GFX_CB_INIT 0 ++#define GFX_CB_DONE 1 ++#define GFX_CB_INPUT 2 ++#define GFX_CB_MENU_INIT 3 ++#define GFX_CB_INFOBOX_INIT 4 ++#define GFX_CB_INFOBOX_DONE 5 ++#define GFX_CB_PROGRESS_INIT 6 ++#define GFX_CB_PROGRESS_DONE 7 ++#define GFX_CB_PROGRESS_UPDATE 8 ++#define GFX_CB_PROGRESS_LIMIT 9 // unused ++#define GFX_CB_PASSWORD_INIT 10 ++#define GFX_CB_PASSWORD_DONE 11 ++ ++// real mode code chunk, will be placed into bounce buffer ++extern void realmode_callback_start, realmode_callback_end; ++ ++// gets in the way ++#undef linux ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// gfxboot config data (64 bytes) ++typedef struct __attribute__ ((packed)) { ++ uint8_t bootloader; // 0: boot loader type (0: lilo, 1: syslinux, 2: grub) ++ uint8_t sector_shift; // 1: sector shift ++ uint8_t media_type; // 2: media type (0: disk, 1: floppy, 2: cdrom) ++ uint8_t failsafe; // 3: turn on failsafe mode (bitmask) ++ // 0: SHIFT pressed ++ // 1: skip gfxboot ++ // 2: skip monitor detection ++ uint8_t sysconfig_size; // 4: size of sysconfig data ++ uint8_t boot_drive; // 5: BIOS boot drive ++ uint16_t callback; // 6: offset to callback handler ++ uint16_t bootloader_seg; // 8: code/data segment used by bootloader; must follow gfx_callback ++ uint16_t serial_port; // 10: syslinux initialized serial port from 'serial' option ++ uint32_t user_info_0; // 12: data for info box ++ uint32_t user_info_1; // 16: data for info box ++ uint32_t bios_mem_size; // 20: BIOS memory size (in bytes) ++ uint16_t xmem_0; // 24: extended mem area 0 (start:size in MB; 12:4 bits) - obsolete ++ uint16_t xmem_1; // 26: extended mem area 1 - obsolete ++ uint16_t xmem_2; // 28: extended mem area 2 - obsolete ++ uint16_t xmem_3; // 30: extended mem area 3 - obsolete ++ uint32_t file; // 32: start of gfx file ++ uint32_t archive_start; // 36: start of cpio archive ++ uint32_t archive_end; // 40: end of cpio archive ++ uint32_t mem0_start; // 44: low free memory start ++ uint32_t mem0_end; // 48: low free memory end ++ uint32_t xmem_start; // 52: extended mem start ++ uint32_t xmem_end; // 56: extended mem end ++ uint16_t features; // 60: feature flags returned by GFX_CB_INIT ++ // 0: GFX_CB_MENU_INIT accepts 32 bit addresses ++ // 1: knows about xmem_start, xmem_end ++ uint16_t reserved_1; // 62: ++} gfx_config_t; ++ ++ ++// gfxboot menu description (18 bytes) ++typedef struct __attribute__ ((packed)) { ++ uint16_t entries; ++ char *default_entry; ++ char *label_list; ++ uint16_t label_size; ++ char *arg_list; ++ uint16_t arg_size; ++} gfx_menu_t; ++ ++ ++// menu description ++typedef struct menu_s { ++ struct menu_s *next; ++ char *label; ++ char *kernel; ++ char *linux; ++ char *localboot; ++ char *initrd; ++ char *append; ++ char *ipappend; ++} menu_t; ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++gfx_config_t gfx_config; ++gfx_menu_t gfx_menu; ++ ++menu_t *menu; ++menu_t *menu_default; ++ ++struct { ++ uint32_t jmp_table[12]; ++ uint16_t code_seg; ++ char fname_buf[64]; ++} gfx; ++ ++void *lowmem_buf; ++unsigned lowmem_buf_size; ++ ++int timeout; ++ ++char cmdline[MAX_CMDLINE_LEN]; ++ ++void *save_buf; ++unsigned save_buf_size; ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++void show_message(char *file); ++char *get_config_file_name(void); ++char *skip_spaces(char *s); ++char *skip_nonspaces(char *s); ++void chop_line(char *s); ++int read_config_file(void); ++unsigned magic_ok(unsigned char *buf, unsigned *code_size); ++unsigned find_file(unsigned char *buf, unsigned len, unsigned *gfx_file_start, unsigned *file_len, unsigned *code_size); ++int gfx_init(char *file); ++int gfx_menu_init(void); ++void gfx_done(void); ++int gfx_input(void); ++ssize_t save_read(int fd, void *buf, size_t size); ++void *load_one(char *file, ssize_t *file_size); ++void boot(void); ++void boot_entry(menu_t *menu_ptr, char *arg); ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++int main(int argc, char **argv) ++{ ++ int menu_index; ++ enum syslinux_filesystem syslinux_id; ++ com32sys_t r; ++ ++ openconsole(&dev_stdcon_r, &dev_stdcon_w); ++ ++ syslinux_id = syslinux_version()->filesystem; ++ ++ lowmem_buf = __com32.cs_bounce; ++ lowmem_buf_size = __com32.cs_bounce_size; ++ ++ r.eax.l = 0x0a; // Get Derivative-Specific Information ++ r.ecx.l = 9; ++ __intcall(0x22, &r, &r); ++ gfx_config.sector_shift = (uint8_t) r.ecx.l; ++ gfx_config.boot_drive = (uint8_t) r.edx.l; ++ ++ if(syslinux_id == SYSLINUX_FS_PXELINUX) { ++ gfx_config.sector_shift = 11; ++ gfx_config.boot_drive = 0; ++ } ++ ++ gfx_config.bootloader = 1; ++ gfx_config.sysconfig_size = sizeof gfx_config; ++ gfx_config.bootloader_seg = 0; // apparently not needed ++ ++ save_buf_size = lowmem_buf_size; ++ save_buf = malloc(save_buf_size); ++ ++ if(argc < 2) { ++ printf("Usage: gfxboot.c32 bootlogo_file [message_file]\n"); ++ if(argc > 2) show_message(argv[2]); ++ ++ return 0; ++ } ++ ++ if(read_config_file()) { ++ printf("Error reading config file\n"); ++ if(argc > 2) show_message(argv[2]); ++ ++ return 0; ++ } ++ ++ if(gfx_init(argv[1])) { ++ printf("Error setting up gfxboot\n"); ++ if(argc > 2) show_message(argv[2]); ++ ++ return 0; ++ } ++ ++ gfx_menu_init(); ++ ++ for(;;) { ++ menu_index = gfx_input(); ++ ++ // abort gfx, return to text mode prompt ++ if(menu_index == -1) { ++ gfx_done(); ++ break; ++ } ++ ++ // does not return if it succeeds ++ boot(); ++ } ++ ++ if(argc > 2) show_message(argv[2]); ++ ++ return 0; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++void show_message(char *file) ++{ ++ int c; ++ FILE *f; ++ ++ if(!(f = fopen(file, "r"))) return; ++ ++ while((c = getc(f)) != EOF) { ++ if(c < ' ' && c != '\n' && c != '\t') continue; ++ printf("%c", c); ++ } ++ ++ fclose(f); ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++char *skip_spaces(char *s) ++{ ++ while(*s && (*s == ' ' || *s == '\t')) s++; ++ ++ return s; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++char *skip_nonspaces(char *s) ++{ ++ while(*s && *s != ' ' && *s != '\t') s++; ++ ++ return s; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++void chop_line(char *s) ++{ ++ int i = strlen(s); ++ ++ if(!i) return; ++ ++ while(--i >= 0) { ++ if(s[i] == ' ' || s[i] == '\t' || s[i] == '\n') { ++ s[i] = 0; ++ } ++ else { ++ break; ++ } ++ } ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Read and parse syslinux config file. ++// ++// return: ++// 0: ok, 1: error ++// ++int read_config_file(void) ++{ ++ FILE *f; ++ char *s, *t, buf[MAX_CONFIG_LINE_LEN]; ++ unsigned u, menu_idx = 0, label_size = 0, append_size = 0; ++ menu_t *menu_ptr = NULL, **menu_next = &menu; ++ ++ menu_default = calloc(1, sizeof *menu_default); ++ ++ if(!(f = fopen(syslinux_config_file(), "r"))) return 1; ++ ++ while((s = fgets(buf, sizeof buf, f))) { ++ chop_line(s); ++ s = skip_spaces(s); ++ if(!*s || *s == '#') continue; ++ t = skip_nonspaces(s); ++ if(*t) *t++ = 0; ++ t = skip_spaces(t); ++ ++ if(!strcmp(s, "timeout")) { ++ timeout = atoi(t); ++ continue; ++ } ++ ++ if(!strcmp(s, "default")) { ++ menu_default->label = strdup(t); ++ u = strlen(t); ++ if(u > label_size) label_size = u; ++ continue; ++ } ++ ++ if(!strcmp(s, "label")) { ++ menu_ptr = *menu_next = calloc(1, sizeof **menu_next); ++ menu_next = &menu_ptr->next; ++ menu_idx++; ++ menu_ptr->label = strdup(t); ++ u = strlen(t); ++ if(u > label_size) label_size = u; ++ continue; ++ } ++ ++ if(!strcmp(s, "kernel") && menu_ptr) { ++ menu_ptr->kernel = strdup(t); ++ continue; ++ } ++ ++ if(!strcmp(s, "linux") && menu_ptr) { ++ menu_ptr->linux = strdup(t); ++ continue; ++ } ++ ++ if(!strcmp(s, "localboot") && menu_ptr) { ++ menu_ptr->localboot = strdup(t); ++ continue; ++ } ++ ++ if(!strcmp(s, "initrd") && menu_ptr) { ++ menu_ptr->initrd = strdup(t); ++ continue; ++ } ++ ++ if(!strcmp(s, "append")) { ++ (menu_ptr ?: menu_default)->append = strdup(t); ++ u = strlen(t); ++ if(u > append_size) append_size = u; ++ continue; ++ } ++ ++ if(!strcmp(s, "ipappend")) { ++ (menu_ptr ?: menu_default)->ipappend = strdup(t); ++ continue; ++ } ++ } ++ ++ fclose(f); ++ ++ // final '\0' ++ label_size++; ++ append_size++; ++ ++ gfx_menu.entries = menu_idx; ++ gfx_menu.label_size = label_size; ++ gfx_menu.arg_size = append_size; ++ ++ gfx_menu.default_entry = menu_default->label; ++ if(!gfx_menu.default_entry && menu) { ++ gfx_menu.default_entry = menu->label; ++ } ++ ++ gfx_menu.label_list = calloc(menu_idx, label_size); ++ gfx_menu.arg_list = calloc(menu_idx, append_size); ++ ++ for(u = 0, menu_ptr = menu; menu_ptr; menu_ptr = menu_ptr->next, u++) { ++ if(!menu_ptr->append) menu_ptr->append = menu_default->append; ++ if(!menu_ptr->ipappend) menu_ptr->ipappend = menu_default->ipappend; ++ ++ if(menu_ptr->label) strcpy(gfx_menu.label_list + u * label_size, menu_ptr->label); ++ if(menu_ptr->append) strcpy(gfx_menu.arg_list + u * append_size, menu_ptr->append); ++ } ++ ++ return 0; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Check header and return code start offset. ++// ++unsigned magic_ok(unsigned char *buf, unsigned *code_size) ++{ ++ if( ++ *(unsigned *) buf == 0x0b2d97f00 && // magic id ++ (buf[4] == 8) // version 8 ++ ) { ++ *code_size = *(unsigned *) (buf + 12); ++ return *(unsigned *) (buf + 8); ++ } ++ ++ return 0; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Search cpio archive for gfx file. ++// ++unsigned find_file(unsigned char *buf, unsigned len, unsigned *gfx_file_start, unsigned *file_len, unsigned *code_size) ++{ ++ unsigned i, fname_len, code_start = 0; ++ ++ *gfx_file_start = 0; ++ *code_size = 0; ++ ++ for(i = 0; i < len;) { ++ if((len - i) >= 0x1a && (buf[i] + (buf[i + 1] << 8)) == 0x71c7) { ++ fname_len = *(unsigned short *) (buf + i + 20); ++ *file_len = *(unsigned short *) (buf + i + 24) + (*(unsigned short *) (buf + i + 22) << 16); ++ i += 26 + fname_len; ++ i = ((i + 1) & ~1); ++ if((code_start = magic_ok(buf + i, code_size))) { ++ *gfx_file_start = i; ++ return code_start; ++ } ++ i += *file_len; ++ i = ((i + 1) & ~1); ++ } ++ else { ++ break; ++ } ++ } ++ ++ return code_start; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Initialize gfxboot code. ++// ++// return: ++// 0: ok, 1: error ++// ++int gfx_init(char *file) ++{ ++ size_t archive_size = 0; ++ void *archive; ++ unsigned code_start, code_size, file_start, file_len, u; ++ com32sys_t r; ++ void *lowmem = lowmem_buf; ++ unsigned lowmem_size = lowmem_buf_size; ++ ++ printf("Loading %s...\n", file); ++ if(loadfile(file, &archive, &archive_size)) return 1; ++ ++ if(!archive_size) return 1; ++ ++ // printf("%s: %d\n", file, archive_size); ++ ++ gfx_config.archive_start = (uint32_t) archive; ++ gfx_config.archive_end = gfx_config.archive_start + archive_size; ++ ++ // locate file inside cpio archive ++ if(!(code_start = find_file(archive, archive_size, &file_start, &file_len, &code_size))) { ++ printf("%s: invalid file format\n", file); ++ return 1; ++ } ++ ++#if 0 ++ printf( ++ "code_start = 0x%x, code_size = 0x%x\n" ++ "archive_start = 0x%x, archive size = 0x%x\n" ++ "file_start = 0x%x, file_len = 0x%x\n", ++ code_start, code_size, ++ gfx_config.archive_start, archive_size, ++ file_start, file_len ++ ); ++#endif ++ ++ gfx_config.file = gfx_config.archive_start + file_start; ++ ++ u = &realmode_callback_end - &realmode_callback_start; ++ u = (u + REALMODE_BUF_SIZE + 0xf) & ~0xf; ++ ++ if(u + code_size > lowmem_size) { ++ printf("bounce buffer too small: size %u, needed %u\n", lowmem_size, u + code_size); ++ return 1; ++ } ++ ++ memcpy(lowmem + REALMODE_BUF_SIZE, &realmode_callback_start, &realmode_callback_end - &realmode_callback_start); ++ ++ // fill in buffer size and location ++ *(uint16_t *) (lowmem + REALMODE_BUF_SIZE) = REALMODE_BUF_SIZE; ++ *(uint16_t *) (lowmem + REALMODE_BUF_SIZE + 2) = (uint32_t) lowmem >> 4; ++ ++ gfx_config.bootloader_seg = ((uint32_t) lowmem + REALMODE_BUF_SIZE) >> 4; ++ gfx_config.callback = 4; // start address ++ ++ lowmem += u; ++ lowmem_size -= u; ++ ++ memcpy(lowmem, archive + file_start + code_start, code_size); ++ ++ gfx_config.mem0_start = (uint32_t) lowmem + code_size; ++ gfx_config.mem0_end = (uint32_t) lowmem + lowmem_size; ++ // align a bit ++ gfx_config.mem0_start = (gfx_config.mem0_start + 0xf) & ~0xf; ++ ++ gfx_config.xmem_start = (uint32_t) malloc(GFX_MEMORY_SIZE << 20); ++ if(gfx_config.xmem_start) { ++ gfx_config.xmem_end = gfx_config.xmem_start + (GFX_MEMORY_SIZE << 20); ++ } ++ ++ // fake; not used anyway ++ gfx_config.bios_mem_size = 256 << 20; ++ ++ gfx.code_seg = (uint32_t) lowmem >> 4; ++ ++ for(u = 0; u < sizeof gfx.jmp_table / sizeof *gfx.jmp_table; u++) { ++ gfx.jmp_table[u] = (gfx.code_seg << 16) + *(uint16_t *) (lowmem + 2 * u); ++ } ++ ++#if 0 ++ for(u = 0; u < sizeof gfx.jmp_table / sizeof *gfx.jmp_table; u++) { ++ printf("%d: 0x%08x\n", u, gfx.jmp_table[u]); ++ } ++#endif ++ ++ // we are ready to start ++ ++ r.esi.l = (uint32_t) &gfx_config; ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_INIT], &r, &r); ++ ++ if((r.eflags.l & EFLAGS_CF)) { ++ printf("graphics initialization failed\n"); ++ ++ return 1; ++ } ++ ++ if((gfx_config.features & 3) != 3) { ++ gfx_done(); ++ ++ printf("%s: boot graphics code too old, please use newer version\n", file); ++ ++ return 1; ++ } ++ ++ ++ return 0; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++int gfx_menu_init() ++{ ++ com32sys_t r; ++ ++ r.esi.l = (uint32_t) &gfx_menu; ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_MENU_INIT], &r, &r); ++ ++ return 0; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++void gfx_done() ++{ ++ com32sys_t r; ++ ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_DONE], &r, &r); ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Run gfxboot main loop. ++// ++// return: ++// boot menu index (-1: go to text mode prompt) ++// ++int gfx_input() ++{ ++ com32sys_t r; ++ ++ r.edi.l = (uint32_t) cmdline; ++ r.ecx.l = sizeof cmdline; ++ r.eax.l = timeout * 182 / 100; ++ timeout = 0; // use timeout only first time ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_INPUT], &r, &r); ++ if((r.eflags.l & EFLAGS_CF)) r.eax.l = 1; ++ ++ if(r.eax.l == 1) return -1; ++ ++ return r.ebx.l; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Like read(2) but preserve bounce buffer. ++// ++ssize_t save_read(int fd, void *buf, size_t size) ++{ ++ ssize_t i; ++ ++ memcpy(save_buf, lowmem_buf, save_buf_size); ++ i = read(fd, buf, size); ++ memcpy(lowmem_buf, save_buf, save_buf_size); ++ ++ return i; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Read file and update progress bar. ++// ++void *load_one(char *file, ssize_t *file_size) ++{ ++ int fd; ++ void *buf = NULL; ++ struct stat sbuf; ++ ssize_t size = 0, cur, i; ++ com32sys_t r; ++ ++ *file_size = 0; ++ ++ if((fd = open(file, O_RDONLY)) == -1) { ++ printf("%s: file not found\n", file); ++ return buf; ++ } ++ ++ if(!fstat(fd, &sbuf) && S_ISREG(sbuf.st_mode)) size = sbuf.st_size; ++ ++ i = 0; ++ ++ if(size) { ++ buf = malloc(size); ++ for(i = 1, cur = 0 ; cur < size && i > 0; cur += i) { ++ i = save_read(fd, buf + cur, CHUNK_SIZE); ++ r.eax.l = i >> gfx_config.sector_shift; ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_PROGRESS_UPDATE], &r, &r); ++ } ++ } ++ else { ++ do { ++ buf = realloc(buf, size + CHUNK_SIZE); ++ i = save_read(fd, buf + size, CHUNK_SIZE); ++ size += i; ++ r.eax.l = i >> gfx_config.sector_shift; ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_PROGRESS_UPDATE], &r, &r); ++ } while(i > 0); ++ } ++ ++ close(fd); ++ ++ if(i == -1) { ++ free(buf); ++ buf = NULL; ++ size = 0; ++ } ++ ++ *file_size = size; ++ ++ return buf; ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Locate menu entry and boot. ++// ++void boot() ++{ ++ char *label, *arg, *s; ++ menu_t *menu_ptr; ++ ++ label = skip_spaces(cmdline); ++ arg = skip_spaces(s = skip_nonspaces(label)); ++ *s = 0; ++ ++ for(menu_ptr = menu; menu_ptr; menu_ptr = menu_ptr->next) { ++ if(menu_ptr->label && !strcmp(menu_ptr->label, label)) break; ++ } ++ ++ boot_entry(menu_ptr, arg); ++} ++ ++ ++// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++// Load & run kernel. ++// ++// Returns only on error. ++// ++void boot_entry(menu_t *menu_ptr, char *arg) ++{ ++ void *kernel, *initrd_buf; ++ ssize_t kernel_size = 0, initrd_size = 0; ++ struct initramfs *initrd = NULL; ++ char *file, *cmd_buf; ++ int fd; ++ struct stat sbuf; ++ com32sys_t r; ++ char *s, *s0, *t, *initrd_arg; ++ ++ if(!menu_ptr) return; ++ ++ if(menu_ptr->localboot) { ++ gfx_done(); ++ syslinux_local_boot(atoi(arg)); ++ ++ return; ++ } ++ ++ file = menu_ptr->kernel; ++ if(!file) file = menu_ptr->linux; ++ if(!file) return; ++ ++ // first, load kernel ++ ++ r.eax.l = 0; // kernel size in sectors ++ ++ if((fd = open(file, O_RDONLY)) >= 0) { ++ if(!fstat(fd, &sbuf) && S_ISREG(sbuf.st_mode)) r.eax.l = sbuf.st_size >> gfx_config.sector_shift; ++ close(fd); ++ } ++ ++ r.esi.l = (uint32_t) file; ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_PROGRESS_INIT], &r, &r); ++ ++ kernel = load_one(file, &kernel_size); ++ ++ if(!kernel) { ++ gfx_done(); ++ printf("%s: read error\n", file); ++ return; ++ } ++ ++ if(kernel_size < 1024 || *(uint32_t *) (kernel + 0x202) != 0x53726448) { ++ // not a linux kernel ++ gfx_done(); ++ asprintf(&cmd_buf, "%s %s", menu_ptr->label, arg); ++ syslinux_run_command(cmd_buf); ++ return; ++ } ++ ++ // printf("kernel = %p, size = %d\n", kernel, kernel_size); ++ ++ // parse cmdline for "initrd" option ++ ++ initrd_arg = menu_ptr->initrd; ++ ++ s = s0 = strdup(arg); ++ ++ while(*s && strncmp(s, "initrd=", sizeof "initrd=" - 1)) { ++ s = skip_spaces(skip_nonspaces(s)); ++ } ++ ++ if(*s) { ++ s += sizeof "initrd=" - 1; ++ *skip_nonspaces(s) = 0; ++ initrd_arg = s; ++ } ++ ++ if(initrd_arg) { ++ initrd = initramfs_init(); ++ ++ while((t = strsep(&s, ","))) { ++ initrd_buf = load_one(t, &initrd_size); ++ ++ if(!initrd_buf) { ++ printf("%s: read error\n", t); ++ free(s0); ++ return; ++ } ++ ++ initramfs_add_data(initrd, initrd_buf, initrd_size, initrd_size, 4); ++ ++ // printf("initrd = %p, size = %d\n", initrd_buf, initrd_size); ++ } ++ } ++ ++ free(s0); ++ ++ __farcall(gfx.code_seg, gfx.jmp_table[GFX_CB_PROGRESS_DONE], &r, &r); ++ ++ syslinux_boot_linux(kernel, kernel_size, initrd, arg); ++} ++ ++ +diff --git a/com32/gfxboot/realmode_callback.asm b/com32/gfxboot/realmode_callback.asm +new file mode 100644 +index 0000000..fb5461d +--- /dev/null ++++ b/com32/gfxboot/realmode_callback.asm +@@ -0,0 +1,190 @@ ++ bits 16 ++ ++ section .text ++ ++ ; must be filled in ++f_buf_size dw 0 ++f_buf_seg dw 0 ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++gfx_cb: ++ push cs ++ pop ds ++ ++ cmp al,cb_len ++ jae gfx_cb_80 ++ ++ movzx bx,al ++ add bx,bx ++ call word [bx+cb_table] ++ jmp gfx_cb_90 ++ ++gfx_cb_80: ++ mov al,0ffh ++gfx_cb_90: ++ retf ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; Return status info. ++; ++; return: ++; edx filename buffer (64 bytes) ++; ++cb_status: ++ mov edx,cs ++ shl edx,4 ++ add edx,f_name ++ xor al,al ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; Open file. ++; ++; return: ++; al 0: ok, 1: file not found ++; ecx file length (al = 0) ++; ++cb_fopen: ++ mov si,f_name ++ push ds ++ pop es ++ mov ax,6 ++ int 22h ++ xchg edx,eax ++ mov al,1 ++ jc cb_fopen_90 ++ cmp cx,[f_buf_size] ++ ja cb_fopen_90 ++ or cx,cx ++ jz cb_fopen_90 ++ mov [f_block_size],cx ++ or edx,edx ++ jz cb_fopen_90 ++ mov [f_handle],si ++ mov [f_size],edx ++ mov ecx,edx ++ mov ax,[f_buf_size] ++ cwd ++ div word [f_block_size] ++ mov [f_blocks],ax ++ ++ xor al,al ++cb_fopen_90: ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; Read next chunk. ++; ++; return: ++; edx buffer address (linear) ++; ecx data length (< 64k) ++; ++cb_fread: ++ xor ecx,ecx ++ mov si,[f_handle] ++ or si,si ++ jz cb_fread_80 ++ mov cx,[f_blocks] ++ mov es,[f_buf_seg] ++ xor bx,bx ++ mov ax,7 ++ int 22h ++ mov [f_handle],si ++ mov al,1 ++ jc cb_fread_90 ++cb_fread_80: ++ xor al,al ++cb_fread_90: ++ movzx edx,word [f_buf_seg] ++ shl edx,4 ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; Return current working directory. ++; ++; return: ++; edx filename ++; ++cb_getcwd: ++ mov ax,15h ++ int 22h ++ mov edx,es ++ shl edx,4 ++ movzx ebx,bx ++ add edx,ebx ++ xor al,al ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; Set current working directory. ++; ++cb_chdir: ++ mov bx,f_name ++ push ds ++ pop es ++ mov ax,25h ++ int 22h ++ xor al,al ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; read sector ++; ++; edx sector ++; ++; return: ++; edx buffer (linear address) ++; ++; Note: does not return on error! ++; ++cb_readsector: ++ xor edi,edi ++ xor esi,esi ++ mov cx,1 ++ mov es,[f_buf_seg] ++ xor bx,bx ++ mov ax,19h ++ int 22h ++ movzx edx,word [f_buf_seg] ++ shl edx,4 ++ xor al,al ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; Re-read fs structures. ++; ++cb_mount: ++ mov ax,26h ++ int 22h ++ setc al ++ ret ++ ++ ++; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++; ++ align 2, db 0 ++ ++cb_table dw cb_status ++ dw cb_fopen ++ dw cb_fread ++ dw cb_getcwd ++ dw cb_chdir ++ dw cb_readsector ++ dw cb_mount ++cb_len equ ($-cb_table)/2 ++ ++f_handle dw 0 ++f_block_size dw 0 ++f_blocks dw 0 ++f_size dd 0 ++f_name times 64 db 0 ++f_name_len equ $ - f_name ++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/test/c32/gfxtest.config new/gfxboot-4.1.39/test/c32/gfxtest.config --- old/gfxboot-4.1.37/test/c32/gfxtest.config 1970-01-01 01:00:00.000000000 +0100 +++ new/gfxboot-4.1.39/test/c32/gfxtest.config 2009-10-20 12:29:04.000000000 +0200 @@ -0,0 +1,15 @@ +# all files in this directory ex this config file are added +# to the bootloader directory + +# archive file name in theme directory +archive=bootlogo + +# setup function name in 'gfxtest' script +setup=isolinux + +# list of files to remove in bootloader directory +rm_files="gfxboot.com" + +# additional 'gfxboot' args +args="" + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gfxboot-4.1.37/test/c32_pxe/gfxtest.config new/gfxboot-4.1.39/test/c32_pxe/gfxtest.config --- old/gfxboot-4.1.37/test/c32_pxe/gfxtest.config 1970-01-01 01:00:00.000000000 +0100 +++ new/gfxboot-4.1.39/test/c32_pxe/gfxtest.config 2009-10-21 12:34:40.000000000 +0200 @@ -0,0 +1,15 @@ +# all files in this directory ex this config file are added +# to the bootloader directory + +# archive file name in theme directory +archive=bootlogo + +# setup function name in 'gfxtest' script +setup=pxelinux + +# list of files to remove in bootloader directory +rm_files="gfxboot.com" + +# additional 'gfxboot' args +args="" + ++++++ openSUSE.tar.bz2 ++++++ ++++ 11961 lines of diff (skipped) ++++++ upstream.tar.bz2 ++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@Hilbert.suse.de