The function MOUSE.function.print_field() is not always called directly but its pointer is copied in a register and a call to the content of the register is done. The register is not reused at all. Causes problems with an assembler post-processor.
$ /home/etienne/projet/toolchain/bin/gcc -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../configure --prefix=/home/etienne/projet/toolchain --enable-languages=c --with-gmp=/home/etienne/projet/toolchain Thread model: posix gcc version 4.4.0 (GCC) $ /home/etienne/projet/toolchain/bin/gcc -fno-builtin -fverbose-asm -fno-function-cse -Os -Wall -S -o m.S m1.c $ grep "MOUSE.function.print_field" m.S call *MOUSE+32 # MOUSE.function.print_field movl MOUSE+32, %esi # MOUSE.function.print_field, D.2606 $ grep "call.*\*%esi" m.S call *%esi # D.2606 $ cat m1.c typedef struct { unsigned char jmpinstruction[2]; unsigned char EBIOSaccess; unsigned char String[8]; unsigned short Bytepersector; unsigned char Sectorpercluster; unsigned short Reservedsector; unsigned char NbFAT; unsigned short NbRootdirentry; unsigned short NbTotalsector; unsigned char Mediadescriptor; unsigned short NbSectorperFAT; unsigned short NbSectorpertrack; unsigned short NbHead; unsigned NbHiddensector; unsigned NbTotalsector2; } __attribute__ ((packed, aligned(1))) FAT_bootsect1_t; typedef struct { unsigned NbSectorperFAT2; struct FAT32_flags_str { unsigned short active_fat : 4; unsigned short reserved1 : 3; unsigned short one_fat_active : 1; unsigned short reserved2 : 8; } __attribute__ ((packed)) flags; unsigned short version; unsigned root_cluster; unsigned short FSinfosector; unsigned short save_bootrecord; unsigned char reserved[12]; } __attribute__ ((packed, aligned(1))) FAT32_bootsect_t; typedef struct { unsigned char PhysicaldriveNb; unsigned char dirty_flag : 1; unsigned char surface_scan : 1; unsigned char FATreserved : 6; unsigned char Signaturebyte0x29; unsigned VolumeserialNb; unsigned char Volumelabel[11]; unsigned char FileSysName[8]; } __attribute__ ((packed, aligned(1))) FAT_bootsect2_t; typedef struct { FAT_bootsect1_t part1; FAT_bootsect2_t part2; } __attribute__ ((packed, aligned(1))) bootbefore_t; typedef struct { FAT_bootsect1_t part1; FAT32_bootsect_t partFAT32; FAT_bootsect2_t part2; } __attribute__ ((packed, aligned(1))) bootbefore_FAT32_t; typedef struct { struct { unsigned short next; unsigned short checksum; unsigned short nbword; } __attribute__ ((packed)) header; union diskcmd { struct diskcmd_bios { unsigned short reg_dx; unsigned short reg_ax; unsigned short reg_cx; unsigned short dummy; unsigned long will_be_set_to_esbx; } __attribute__ ((packed)) int1302; struct diskcmd_ebios { unsigned short reg_dx; unsigned short reg_ax; unsigned char cst_16; unsigned char cst_0; unsigned char nb_block; unsigned char cst2_0; unsigned short offset, segment; unsigned long long lba; } __attribute__ ((packed)) int1342; struct diskcmd_hard { unsigned short ide_dcr_address; unsigned short reg_ax; unsigned short base_ide_plus7; unsigned char lba_head; unsigned char lba48_cylinder_high; unsigned char lba48_cylinder_low; unsigned char lba48_sector; unsigned char lba48_nb_sect; unsigned char cylinder_high; unsigned char cylinder_low; unsigned char sector; unsigned char nb_sect; unsigned char ide_command; unsigned short nb_sect_read; unsigned short sector_size_div2; } __attribute__ ((packed)) hardide; } bootloader2_cmd; } __attribute__ ((packed, aligned(1))) bootloader2_t; enum gujin_param_attrib_enum { enum_verbose, enum_lock_bpp, enum_lock_text_graphic, enum_menu_with_disk, enum_menu_with_parttype, enum_menu_with_partition, enum_menu_with_initrd, enum_force_textmode, enum_ATA_protect_partition, enum_force_probe_root, enum_IDE_in_BIOS_order, enum_ignore_kernel_option, enum_disk_write_enable, enum_hide_unhide_partitions, enum_VGA_interface, enum_download_ansi_font, enum_VESA_interface, enum_enable_VESA_hardwin, enum_VESA2_interface, enum_enable_joystick, enum_search_disk_mbr, enum_search_part_mbr, enum_keep_all_part_mbr, enum_search_el_torito, enum_search_topdir_files, enum_search_subdir_files, enum_probe_bios_floppy_disk, enum_probe_bios_hard_disk, enum_probe_ide_disk, enum_probe_cdrom, enum_probe_dos_disk, enum_gujin_param_attrib_end }; typedef struct { unsigned magic; unsigned short version; struct gujin_param_compilation_attrib { unsigned short vga_support : 1; unsigned short big_malloc : 1; unsigned short bios_only : 1; unsigned short initrd_loader : 1; unsigned short vmlinuz_loader : 1; unsigned short elf_loader : 1; unsigned short multiboot_loader : 1; unsigned short reserved : 9; } __attribute__ ((packed)) compilation_attrib; char dot_msg[4]; char go_msg[8]; char scanpath[16]; unsigned short default_video_mode, default_text_video_mode, default_graphic_video_mode; unsigned char min_nb_initrd; unsigned char stop_emulation; struct gujin_param_attrib { unsigned verbose : 1; unsigned lock_bpp : 1; unsigned lock_text_graphic : 1; unsigned menu_with_disk : 1; unsigned menu_with_parttype : 1; unsigned menu_with_partition : 1; unsigned menu_with_initrd : 1; unsigned force_textmode : 1; unsigned ATA_protect_partition : 1; unsigned force_probe_root : 1; unsigned IDE_in_BIOS_order : 1; unsigned ignore_kernel_option : 1; unsigned disk_write_enable : 1; unsigned hide_unhide_partitions : 1; unsigned VGA_interface : 1; unsigned download_ansi_font : 1; unsigned VESA_interface : 1; unsigned enable_VESA_hardwin : 1; unsigned VESA2_interface : 1; unsigned enable_joystick : 1; unsigned search_disk_mbr : 1; unsigned search_part_mbr : 1; unsigned keep_all_part_mbr : 1; unsigned search_el_torito : 1; unsigned search_topdir_files : 1; unsigned search_subdir_files : 1; unsigned probe_bios_floppy_disk : 1; unsigned probe_bios_hard_disk : 1; unsigned probe_ide_disk : 1; unsigned probe_cdrom : 1; unsigned probe_dos_disk : 1; unsigned write_disabled_written_once : 1; } __attribute__ ((packed)) attrib; struct autoload_str { unsigned char last_loaded; unsigned char total_loadable; unsigned char init_page; unsigned char total_page; } __attribute__ ((packed)) autoload; unsigned char timeout_autoload; unsigned char kbdmap; signed char time_hour_offset, time_minute_offset; unsigned reserved2[4]; char extra_cmdline[64]; unsigned char cardname[32]; unsigned char VGA_valid_mode[16]; struct vga_mode_str { unsigned isgraphic : 1; unsigned reserved : 1; unsigned number : 7; unsigned bpp : 4; unsigned height : 11; unsigned width_div8 : 8; } __attribute__ ((packed)) vga_mode[30]; unsigned short partial_checksum __attribute__ ((aligned (2))); } __attribute__ ((packed)) gujin_param_t; typedef struct { unsigned char boot_indicator; enum { boot_media_noemul = 0, boot_media_120 = 1, boot_media_144 = 2, boot_media_288 = 3, boot_media_hd = 4 } boot_media_type : 8; unsigned short load_segment; unsigned char system_type; unsigned char unused; unsigned short sector_count; unsigned sector_lba; unsigned char reserved[0x1F - 0x0C +1]; } __attribute__ ((packed)) ISO9660_Default_entry; struct vesa_color_layout_str { struct { unsigned char MaskSize; unsigned char FieldPosition; } __attribute__ ((packed)) Red, Green, Blue, Rsvd; } __attribute__ ((packed)); void __ERROR(void); extern unsigned char fourKbuffer[(4U * 1024U)]; extern char memory[]; extern inline void _memset (void *buffer, int value, unsigned size) { asm ( " cld # _memset modify %2 \n" " rep stosb %%al,%%es:(%%edi) \n" : "+c" (size), "+D" (buffer), "=m" (*memory) : "a" (value) : "cc", "memory"); } extern inline void _memcpy (void *dst, const void *src, unsigned size) { asm ( " cld # _memcpy modify %3 \n" " rep movsb %%ds:(%%esi),%%es:(%%edi) \n" : "+c" (size), "+D" (dst), "+S" (src), "=m" (*memory) : "m" (*memory) : "cc", "memory"); } extern inline int _memcmp (const void *_s1, const void *_s2, unsigned nb) { const unsigned char *s1 = (const unsigned char *)_s1, *s2 = (const unsigned char *)_s2; asm ( " cld # _memcmp depends on %3 \n" " repe cmpsb %%es:(%%edi),%%ds:(%%esi) \n" : "+c" (nb), "+S" (s1), "+D" (s2) : "m" (*memory) : "cc" ); s1--; s2--; if (*s1 == *s2) return 0; if (*s1 > *s2) return 1; else return -1; } extern inline int _memeql (const void *s1, const void *s2, unsigned nb) { asm ("cld; repe cmpsb %%es:(%%edi),%%ds:(%%esi) " : "+c" (nb), "+S" (s1), "+D" (s2) : "m" (*memory)); return !nb; } extern inline const char *_strnchr (const char *str, char c, unsigned size) { asm ("cld ; repne scasb %%es:(%%edi),%%al" : "+c" (size), "+D" (str) : "a" (c), "X" (*str) : "cc"); return str - 1; } extern inline int hexval (char c) { extern const char *const itoa_array; extern const unsigned itoa_len; const char *ptr = _strnchr (itoa_array, c, itoa_len); if (*ptr == c) return (ptr - itoa_array) & 0x0F; return -1; } extern inline void *memcpy (void *dst, const void *src, const unsigned size) { if (__builtin_constant_p (size)) { if (size == 1) { ((unsigned char *)dst)[0] = ((const unsigned char *)src)[0]; return dst; } else if (size == 2) { ((unsigned short *)dst)[0] = ((const unsigned short *)src)[0]; return dst; } else if (size == 3) { ((unsigned short *)dst)[0] = ((const unsigned short *)src)[0]; ((unsigned char *)dst)[2] = ((const unsigned char *)src)[2]; return dst; } else if (size == 4) { ((unsigned *)dst)[0] = ((const unsigned *)src)[0]; return dst; } else if (size == 5) { ((unsigned *)dst)[0] = ((const unsigned *)src)[0]; ((unsigned char *)dst)[4] = ((const unsigned char *)src)[4]; return dst; } else if (size == 6) { ((unsigned *)dst)[0] = ((const unsigned *)src)[0]; ((unsigned short *)dst)[2] = ((const unsigned short *)src)[2]; return dst; } else if (size == 8) { ((unsigned *)dst)[0] = ((const unsigned *)src)[0]; ((unsigned *)dst)[1] = ((const unsigned *)src)[1]; return dst; } } _memcpy (dst, src, size); return dst; } extern inline unsigned memeql (const void *dst, const void *src, const unsigned size) { if (__builtin_constant_p (size)) { if (size == 0) { __ERROR(); } else if (size == 1) { return ((const unsigned char *)dst)[0] == ((const unsigned char *)src)[0]; } else if (size == 2) { return ((const unsigned short *)dst)[0] == ((const unsigned short *)src)[0]; } else if (size == 3) { return ((((const unsigned *)dst)[0] ^ ((const unsigned *)src)[0]) & 0x00FFFFFF) == 0; } else if (size == 4) { return ((const unsigned *)dst)[0] == ((const unsigned *)src)[0]; } else if (size == 5) { return ((const unsigned *)dst)[0] == ((const unsigned *)src)[0] && ((const unsigned char *)dst)[4] == ((const unsigned char *)src)[4]; } else if (size == 6) { return ((const unsigned *)dst)[0] == ((const unsigned *)src)[0] && ((const unsigned short *)dst)[2] == ((const unsigned short *)src)[2]; } else if (size == 7) { return ((const unsigned *)dst)[0] == ((const unsigned *)src)[0] && ((((const unsigned *)dst)[1] ^ ((const unsigned *)src)[1]) & 0x00FFFFFF) == 0; } else if (size == 8) { return ((const unsigned *)dst)[0] == ((const unsigned *)src)[0] && ((const unsigned *)dst)[1] == ((const unsigned *)src)[1]; } } return _memeql (dst, src, size); } extern inline void *memset (void *dst, int value, const unsigned size) { if (__builtin_constant_p (size)) { if (size == 1) { ((unsigned char *)dst)[0] = value; return dst; } else if (size == 2) { ((unsigned short *)dst)[0] = 0x0101 * (value & 0xFF); return dst; } else if (size == 3) { ((unsigned short *)dst)[0] = 0x0101 * (value & 0xFF); ((unsigned char *)dst)[2] = value; return dst; } else if (size == 4) { ((unsigned *)dst)[0] = 0x01010101 * (value & 0xFF); return dst; } else if (size == 5) { ((unsigned *)dst)[0] = 0x01010101 * (value & 0xFF); ((unsigned char *)dst)[4] = value; return dst; } else if (size == 6) { ((unsigned *)dst)[0] = 0x01010101 * (value & 0xFF); ((unsigned short *)dst)[2] = 0x0101 * (value & 0xFF); return dst; } else if (size == 8) { ((unsigned *)dst)[0] = 0x01010101 * (value & 0xFF); ((unsigned *)dst)[1] = 0x01010101 * (value & 0xFF); return dst; } } _memset (dst, value, size); return dst; } extern inline int memcmp (const void *s1, const void *s2, unsigned nb) { return __builtin_memcmp (s1, s2, nb); } extern inline unsigned strlen (const char *str) { return _strnchr (str, '\0', (~0)) - str; } extern inline void _strncpy (char *dst, const char *src, unsigned nb) { unsigned len = strlen(src); if (len > nb) len = nb; memcpy (dst, src, len); dst[len] = '\0'; } extern inline int _strncmp (const char *s1, const char *s2, unsigned nb) { unsigned len = strlen(s1) + 1; if (len > nb) len = nb; return _memcmp (s1, s2, len); } extern inline const char *strchr (const char *str, char c) { const char *returned = _strnchr (str, c, strlen(str)); if (*returned == c) return returned; else return 0; } extern inline char *strcpy (char *dst, const char *src) { _strncpy (dst, src, (~0)); return dst; } extern inline char *strcat (char *dst, const char *src) { strcpy (dst + strlen (dst), src); return dst; } extern inline char *stradd (char *dst, const char *src) { unsigned len = strlen (src); memcpy (dst, src, len + 1); return dst + len; } extern inline int strncmp (const char *s1, const char *s2, unsigned nb) { return _strncmp (s1, s2, nb); } extern inline int strcmp (const char *s1, const char *s2) { return strncmp (s1, s2, (~0)); } extern const struct state_str { unsigned dataseg_adr; unsigned codeseg_adr; signed short serial_port; unsigned short has_just_been_uninstalled; unsigned diskcodeseg_adr; const gujin_param_t *gujin_param_ptr; const bootloader2_t *uninstall_mbr_ptr; unsigned char dos_running; unsigned char reserved[3]; unsigned reserved1; struct { signed low_limit; signed high_limit; } __attribute__ ((packed)) data_limit; const char *BoundMsg; unsigned xdataseg_adr; struct { signed low_limit; signed high_limit; } __attribute__ ((packed)) stack_limit; unsigned fscodeseg_adr; unsigned loadcodeseg_adr; unsigned usercodeseg_adr; } STATE; int printf (const char *format, ...) __attribute__ ((format (printf, 1, 2))); void print (const char *msg); void puts (const char *msg); int sprintf (char *dest, const char *format, ...) __attribute__ ((format (printf, 2, 3))); typedef unsigned farptr; void BOOT1_putstr (const char *str); extern const char ansi2pc[]; void BOOT1_ansi_putstr (const char *str); unsigned char BOOT1_uninstall_mbr (void); unsigned char BOOT1_update_bootparam (void); extern inline struct gujin_param_attrib get_gujin_param_attrib (void) { return ({ extern const gujin_param_t gujin_param; extern gujin_param_t *gujin_param_rw; typeof (gujin_param_rw->attrib) returned; asm volatile (" mov %%cs:%1,%0 " : "=q" (returned) : "m" (gujin_param.attrib)); returned; }); } typedef struct { unsigned short extended_fct : 1; unsigned short removable : 1; unsigned short enhanced : 1; unsigned short reserved : 13; } __attribute__ ((packed)) ebios_bitmap_t; typedef struct { unsigned short buffersize; unsigned short infobit; unsigned nbcylinder; unsigned nbhead; unsigned nbsectorpertrack; unsigned long long nbtotalsector; unsigned short bytepersector; farptr configptr; unsigned short signature0xBEDD; unsigned char lendevicepath; unsigned char reserved[3]; unsigned char bustype[4]; unsigned char Interface[8]; union interface_path_u { struct { unsigned short addr; unsigned char pad[6]; } __attribute__ ((packed)) isa; struct { unsigned char busnr; unsigned char devicenr; unsigned char functionnr; unsigned char pad[5]; } __attribute__ ((packed)) pci; } bus; union device_path_u { struct { unsigned char slave; unsigned char pad[7]; unsigned long long reserved; } __attribute__ ((packed)) ata; struct { unsigned char slave; unsigned char logical_unit_nr; unsigned char pad[6]; unsigned long long reserved; } __attribute__ ((packed)) atapi; struct { unsigned char logical_unit_nr; unsigned char pad[7]; unsigned long long reserved; } __attribute__ ((packed)) scsi; struct { unsigned char tobedefined; unsigned char pad[7]; unsigned long long reserved; } __attribute__ ((packed)) usb; struct { unsigned long long FireWireGeneralUniqueID; unsigned long long reserved; } __attribute__ ((packed)) ieee1394; struct { unsigned long long WorldWideNumber; unsigned long long reserved; } __attribute__ ((packed)) FibreChannel; } device; unsigned char zero; unsigned char bytechecksum; } __attribute__ ((packed)) ebiosinfo_t; typedef void allocmem __attribute__((aligned(32))); allocmem *malloc (unsigned size); void free (allocmem *ptr); allocmem *realloc (allocmem *ptr, unsigned size); void detect_environment (void); unsigned hide_unhide_partitions (unsigned index); struct diskparam_str; unsigned long long get_remote_uninstall_lba (struct diskparam_str *dp, const bootbefore_t *bootbefore); void reorder_IDE_for_linux (void); unsigned initrd_file (unsigned index); unsigned set_A20 (unsigned enabled); unsigned segment_door (unsigned open); unsigned short kbd_translate (unsigned short key); unsigned kbd_detect (void); unsigned get_line (char *buffer, unsigned maxlen, char display, char lowlimit, char highlimit); unsigned set_command_line (void); unsigned get_number (unsigned deflt, unsigned max); void adjust_extended_partition_length (void); struct config_multiword_dma_s { unsigned short mode0 : 1; unsigned short mode1 : 1; unsigned short mode2 : 1; unsigned short reserved : 13; } __attribute__ ((packed)); struct config_ultra_dma_s { unsigned short mode0 : 1; unsigned short mode1 : 1; unsigned short mode2 : 1; unsigned short mode3 : 1; unsigned short mode4 : 1; unsigned short mode5 : 1; unsigned short reserved : 10; } __attribute__ ((packed)); struct config_feature_s { unsigned short smart_feature : 1; unsigned short smart_selftest : 1; unsigned short smart_errorlog : 1; unsigned short security : 1; unsigned short standby_powerup : 1; unsigned short RW_DMA_queued : 1; unsigned short acoustic : 1; unsigned short host_prot_area : 1; unsigned short lba48 : 1; unsigned short reserved : 7; } __attribute__ ((packed)); enum IDE_security_enum { IDE_security_unlock_user = 0, IDE_security_unlock_master = 1, IDE_security_set_pw_user = 2, IDE_security_set_pw_master = 3, IDE_security_disable_user = 4, IDE_security_disable_master = 5, IDE_security_erase_user = 6, IDE_security_erase_master = 7, }; enum sector_type_enum { all_sector_type = 0, CD_DA_sector_type = 1, mode_1_sector_type = 2, mode_2_formless_sector_type = 3, mode_2_form_1_sector_type = 4, mode_2_form_2_sector_type = 5 }; struct diskparam_str; extern struct disk_interface_str { unsigned nbdisk; unsigned char max_disk, max_partition, max_freelist, max_IDE_found; unsigned short sizeof_diskparam_str, sizeof_partition_str; unsigned short sizeof_freelist_str, sizeof_IDE_found_str; unsigned char nb_bios_fd, nb_bios_hd, cannot_reset_floppy, nb_bios_blacklist; unsigned char bios_blacklist[4]; unsigned reserved1[2]; unsigned char (*readsector) (struct diskparam_str *dp, int partition, unsigned long long lba, unsigned number, farptr buffer); unsigned char (*writesector) (struct diskparam_str *dp, int partition, unsigned long long lba, unsigned number, farptr buffer); int (*ideSecurity) (struct diskparam_str *dp, char password[32], enum IDE_security_enum action); unsigned long long last_lba_read_or_write; struct diskparam_str { enum { bios_chs, ebios_lba, hardide_chs, hardide_lba, hardide_lba48, hardide_atapi, dos_part } access : 8; unsigned char disknb; unsigned char biostype; unsigned char drivetype; unsigned char diskname[32]; struct ide_attribute_str { unsigned smart : 1; unsigned host_protected_area : 1; unsigned security : 1; unsigned lba48 : 1; unsigned removable : 1; unsigned SAORAB : 1; unsigned config_overlay : 1; unsigned reserved : 25; } ide_attribute; struct error_log_str { unsigned read_media : 1; unsigned write_media : 1; unsigned access_over_disk_tryed : 1; unsigned access_over_partition_tryed: 1; unsigned no_ebios_fct : 1; unsigned ebios_size_zero : 1; unsigned chs_bios_part_mismatch : 1; unsigned chs_ajusted_bootsect : 1; unsigned diskheader_ignored : 1; unsigned disk_locked : 1; unsigned disk_was_pw_locked : 1; unsigned SMART_disabled : 1; unsigned SMART_failure : 1; unsigned analyse_partition_failed : 1; unsigned NB_PARTITION_exceded : 1; unsigned partition_overlap : 1; unsigned partition_over_limit : 1; unsigned beer_checksum_error : 1; unsigned beer_in_extended_partition : 1; unsigned read_media_retried : 1; unsigned ideReadConfig_failed : 1; unsigned reserved : 11; } error_log; unsigned short bytepersector; unsigned short nbhead; unsigned nbcylinder; unsigned BEER_size; unsigned long long BEER_sector; unsigned long long BEER_HostProtectedArea_start; unsigned long long BEER_ReservedAreaBootCodeAddress; unsigned long long BEER_disksize; signed long long fulldisk_offset; unsigned long long fulldisk_size; unsigned long long nbtotalsector; unsigned long long config_max_lba; unsigned short nbsectorpertrack; unsigned short infobit; unsigned char ebios_version; unsigned char ebios_extension; ebios_bitmap_t ebios_bitmap; unsigned short reserved3; unsigned char ebios_bustype[4]; unsigned char ebios_Interface[8]; union interface_path_u ebios_bus; union device_path_u ebios_device; unsigned short reserved4; unsigned short ide_master_password_revision; unsigned short ideIOadr; unsigned short ideIOctrladr; unsigned char lba_slave_mask; unsigned char irq; unsigned char multiplemode; unsigned char BEER_device_index; struct config_multiword_dma_s initial_multiDMA, maximum_multiDMA; struct config_ultra_dma_s initial_ultraDMA, maximum_ultraDMA; struct config_feature_s initial_feature, maximum_feature; unsigned CalibrationIdeloop; unsigned short bios_nbcylinder; unsigned char bios_nbhead; unsigned char bios_nbsectorpertrack; unsigned char bootable; unsigned char OSdisknumber; unsigned short nbpartition; unsigned short nbOSnumber; unsigned short reserved5; unsigned first_ext_partition_start; struct partition_str { unsigned long long start, length; unsigned char type, OSnumber; struct partition_misc_str { unsigned char order : 6; unsigned char fsanalyse_toobig : 1; unsigned char fsanalyse_error : 1; unsigned char maybe_root : 1; unsigned char fat_bootable : 1; unsigned char beer_partition : 1; unsigned char swap_partition : 1; unsigned char reserved : 2; enum part_state { part_invalid = 0, part_active, part_inactive, part_extended } active : 2; } __attribute__ ((packed)) misc; unsigned char name[(64-20-4)]; ISO9660_Default_entry *ElToritoCatalog; } __attribute__ ((packed)) *partition; unsigned nbfreelist; struct freelist_str { unsigned long long start, length; } *freelist; char set_max_password[32]; } *param; unsigned nb_IDE_found; struct IDE_found_str { unsigned short ideIOadr; unsigned short ideIOctrladr; unsigned char irq; unsigned char bios_order; unsigned short reserved; } *IDE_found; } DI; extern struct BOOTWAY_str { unsigned short nb, nb_initrd, sizeof_desc_str, nb_bdi; unsigned char max_name_length, max_desc_array; struct desc_str { unsigned inode; unsigned filesize; unsigned char disk; unsigned char partition; unsigned char name_offset; enum curdir_e { inRoot = 0, inSlashBoot, inSlashImage } curdir : 3; enum boottype_e { is_MBR, is_PBR, is_kernel_with_header, is_kernel_without_header, is_initrd, is_bdi_file, is_el_torito, is_initramfs, is_multiboot } boottype : 4; unsigned char unused : 1; char filename[52]; } __attribute__ ((packed)) *desc; } BOOTWAY; void disk_analyse (struct gujin_param_attrib gujin_attr); unsigned system_file_load (struct desc_str *elem); unsigned file_get_chain (struct desc_str *elem, unsigned *nb_fragment, unsigned *fragment_array[2]); enum stdcolor_enum { black, blue, green, cyan, red, magenta, brown, lightgray, darkgray, lightblue, lightgreen, lightcyan, lightred, lightmagenta, yellow, white }; struct DAC_str { unsigned char blue, green, red, align; }; typedef struct { unsigned short x, y; } __attribute__ ((packed)) coord; struct user_interface_str { unsigned cursor_bgcolor; unsigned fgcolor, bgcolor; unsigned stdcolor[16]; struct { struct attribute_str { unsigned char underline :1; unsigned char reverse :1; unsigned char blink :1; unsigned char brighter :1; unsigned char darker :1; unsigned char transparent :1; unsigned char reserved :2; } __attribute__ ((packed)) current, valid; } attributes; unsigned short monitor; unsigned short align1; struct { unsigned char _VGA_get_display_combination_code_works : 1; unsigned char _EGA_getdisplay_works : 1; unsigned char _VGA_get_functionality_info_works : 1; unsigned char EDID_detect_and_read_works : 1; unsigned char reserved : 4; } videocard; unsigned char nbmode; struct videomode_str { unsigned short number; unsigned short width; unsigned short height; unsigned char bpp; unsigned char text : 1; unsigned char attr : 1; unsigned char vesa : 1; unsigned char reserved : 5; } __attribute__ ((packed)) *mode; union { struct { unsigned short version; unsigned short memory_64Kb; unsigned char cardname[40]; } vesa; struct { unsigned max_mode; unsigned char terminalname[40]; } serial; } info; struct edid_str { unsigned short horizontal_resolution; unsigned short vertical_resolution; unsigned short frequency; unsigned char Hsize_cm, Vsize_cm; unsigned char lowHfreq, highHfreq, lowVfreq, highVfreq; } edid; unsigned short ProtectedModeIO[32]; struct { unsigned address; unsigned short length; unsigned short align; } ProtectedModeMem[4]; struct video_parameter_str { unsigned identification; unsigned nbcolor; unsigned short width, height; unsigned base_address; unsigned char row, col; unsigned char nbrow, nbcol; unsigned char charwidth, charheight; struct { unsigned char isgraphic : 1; unsigned char graphicbgcolor : 1; unsigned char ansi_font : 1; } attr; unsigned char nbimage; struct vesa_color_layout_str layout; farptr font; unsigned winadr; unsigned winsize; unsigned short linelength; unsigned char bitperpixel; unsigned char nbplane; unsigned char memtype; unsigned char EGA_compatible; unsigned char BIOS_compatible; unsigned char align3; unsigned char NbWin; unsigned char winNo; unsigned short align4; unsigned short *offsetarray; struct hardwindow_str { unsigned short instruction; unsigned short port; unsigned data; } *hardwindow; unsigned wingranul; unsigned winreadadr; unsigned readdelta; unsigned short *readoffsetarray; struct hardwindow_str *readhardwindow; unsigned addrpositionfarfct; } parameter; struct user_interface_fct_str { unsigned (*getsize) (unsigned mode, struct video_parameter_str *param); unsigned (*setmode) (unsigned mode); unsigned (*getmode) (void); void (*clearscreen) (void); unsigned (*setcursor) (unsigned char row, unsigned char col); unsigned (*getcursor) (unsigned char *row, unsigned char *col); unsigned (*setfgcolor) (unsigned color); unsigned (*setbgcolor) (unsigned color); void (*setattribute) (struct attribute_str attr); void (*putstr) (const char *str); void (*setpixel) (coord xy, unsigned color) __attribute__ (( fastcall )); unsigned (*getpixel) (coord xy) __attribute__ (( fastcall )); void (*plotHline) (coord xy, unsigned short xend, unsigned color); unsigned (*getkey) (unsigned timeout); } function; }; extern struct user_interface_str UI; unsigned BIOS_probemonitor (void); unsigned __attribute__ ((const)) VESA_color (unsigned char _red, unsigned char _green, unsigned char _blue); void setup_gujin_param_vga_mode (void); void restore_gujin_param_vga_mode (void); void UI_init (unsigned serial); unsigned VESA_preinit (void); unsigned VESA_init (void); unsigned VGA_init (void); unsigned SERIAL_init (void); void reset_low_valid_mode (unsigned up_to); unsigned SERIAL_setcursor (unsigned char row, unsigned char col); unsigned SERIAL_getcursor (unsigned char *row, unsigned char *col); void draw_bg_box (unsigned baserow, unsigned height, unsigned color); void show_ladders (unsigned bgcolor); struct { unsigned short curpage, totalpage, nbperpage, nbtotal, interline; enum { kernel_bottom_menu, setup_bottom_menu } type; } Menu; union mouse_cursor { struct { unsigned char b0 :1, b1 :1, b2 :1, b3 :1, b4 :1, b5 :1, b6 :1, b7 :1; } __attribute__ ((packed)) bit; unsigned char group; }; extern const struct mousefieldattr_str reset_all_fields; struct mousefield_str { const char *str; unsigned short keypress; coord upperleft, lowerright; struct mousefieldattr_str { unsigned short fullscreenfield : 1; unsigned short upperfield : 1; unsigned short mainfield : 1; unsigned short active : 1; unsigned short pressed : 1; unsigned short checkbox : 1; unsigned short greyed : 1; } attr; }; struct mouse_interface_str { coord position, maximum; struct mouse_button_str { unsigned char left : 1; unsigned char right : 1; unsigned char middle : 1; unsigned char top : 1; unsigned char reserved : 2; unsigned char notfunny : 1; unsigned char hidden : 1; } __attribute__ ((packed)) button; unsigned char curmaskindex; unsigned char curs_row, curs_col; enum MOUSE_type { MOUSE_NONE= 0, MOUSE_PS2 = 0xAA, MOUSE_SERIAL_COM1 = 0x10, MOUSE_SERIAL_COM2, MOUSE_SERIAL_COM3, MOUSE_SERIAL_COM4, MOUSE_SERIAL3_COM1 = 0x30, MOUSE_SERIAL3_COM2, MOUSE_SERIAL3_COM3, MOUSE_SERIAL3_COM4, MOUSE_SERIALM_COM1 = 0x40, MOUSE_SERIALM_COM2, MOUSE_SERIALM_COM3, MOUSE_SERIALM_COM4 } type; unsigned nb_field; struct mousefield_str *fields; union mouse_color_union { struct mouse_color_str { unsigned deflt : 4; unsigned leftbutton : 4; unsigned rightbutton : 4; unsigned middlebutton : 4; unsigned topbutton : 4; unsigned twobutton : 4; unsigned invalid : 4; unsigned infield : 4; } colors; unsigned all; } all_colors; struct { void (*reset_field) (struct mousefieldattr_str attr); void (*print_field) (const char *str, struct mousefieldattr_str attr, unsigned short key, unsigned short row, unsigned short col); } function; union { struct PS2_struct { unsigned short reservedword : 16; signed char y_data : 8; signed char y_reserved : 8; signed char x_data : 8; signed char x_reserved : 8; unsigned char left_button : 1; unsigned char right_button : 1; unsigned char middle_button : 1; unsigned char reservedbit : 1; unsigned char x_negative : 1; unsigned char y_negative : 1; unsigned char x_overflow : 1; unsigned char y_overflow : 1; unsigned char reservedbyte : 8; } __attribute__ ((packed)) PS2; struct { unsigned comIOaddr : 16; unsigned comport : 8; unsigned cpt : 8; union { unsigned char bytes[5]; unsigned char align[8]; struct { unsigned char xmsb : 2; unsigned char ymsb : 2; unsigned char right_button : 1; unsigned char left_button : 1; unsigned char cste1 : 1; unsigned char sevenbit1 : 1; unsigned char x : 6; unsigned char cste0_1 : 1; unsigned char sevenbit2 : 1; unsigned char y : 6; unsigned char cste0_2 : 1; unsigned char sevenbit3 : 1; unsigned logitech : 8; } __attribute__ ((packed)) stddata; struct { unsigned char right_button : 1; unsigned char middle_button : 1; unsigned char left_button : 1; unsigned char synchro_0x10 : 5; signed char x : 8; signed char y : 8; signed char deltax : 8; signed char deltay : 8; } __attribute__ ((packed)) mmdata; } received; } serial; } data; struct joystick_str { unsigned short Xmin, Xmid, Xmax, Ymin, Ymid, Ymax; struct mouse_button_str button; unsigned char accelerate; unsigned short last_nbtick; } joystick; unsigned savearray[8 * 14]; }; extern struct mouse_interface_str MOUSE; extern inline void MOUSE_print_field (const char *str, struct mousefieldattr_str attr, unsigned short key, unsigned short row, unsigned short col) { MOUSE.function.print_field (str, attr, key, row, col); } static inline unsigned begin_line_kernel_field (char *buffer, struct diskparam_str *dp, struct desc_str *ptr, struct gujin_param_attrib gujin_attr) { char *buf = buffer; if (gujin_attr.menu_with_disk) { unsigned char *ptr = dp->diskname; while (*ptr) *buf++ = *ptr++; if (dp->nbpartition == 0) buf = ({ memcpy (buf, " ", sizeof (" ")); buf + sizeof (" ") - 1; }); else buf = ({ memcpy (buf, ": ", sizeof (": ")); buf + sizeof (": ") - 1; }); } if (gujin_attr.menu_with_parttype && dp->nbpartition != 0) { if (ptr->boottype == is_MBR) buf = ({ memcpy (buf, "MBR: ", sizeof ("MBR: ")); buf + sizeof ("MBR: ") - 1; }); else if (ptr->boottype == is_el_torito) buf = ({ memcpy (buf, "El Torito: ", sizeof ("El Torito: ")); buf + sizeof ("El Torito: ") - 1; }); else if (ptr->boottype == is_bdi_file) buf = ({ memcpy (buf, "Boot Device Image: ", sizeof ("Boot Device Image: ")); buf + sizeof ("Boot Device Image: ") - 1; }); else { static const unsigned char partnb[] = { 0x0, 0x1, 0x11, 0x4, 0x14, 0x6, 0x16, 0x0E, 0x1E, 0x0B, 0x0C, 0x1B, 0x1C, 0x7, 0x17, 0x5, 0x0F, 0x85, 0x42, 0x63, 0x81, 0x82, 0x83, 0xA5, 0xA6, 0xA9, 0xB7, 0xB8, 0xBE, 0xE3, 0xF2, 0xFD, }; static const char partname_concat[] = " unknown\0" "empty" "\0" "FAT12" "\0" "Hidden FAT12" "\0" "FAT16" "\0" "Hidden FAT16" "\0" "Big FAT16" "\0" "Hidden Big FAT16" "\0" "FAT16 LBA" "\0" "Hidden FAT16 LBA" "\0" "FAT32" "\0" "FAT32 LBA" "\0" "Hidden FAT32" "\0" "Hidden FAT32 LBA" "\0" "NTFS/HPFS" "\0" "Hidden NTFS" "\0" "extended" "\0" "extended LBA" "\0" "Linux extended" "\0" "LDM" "\0" "GNU HURD" "\0" "MINIX" "\0" "Linux swap" "\0" "Linux" "\0" "FreeBSD, BSD/386" "\0" "OpenBSD" "\0" "NetBSD" "\0" "BSDI fs" "\0" "BSDI swap" "\0" "Solaris boot" "\0" "DOS R/O" "\0" "DOS secondary" "\0" "Linux RAID autodetect" "\0" ; const char *parttypename = partname_concat; int cpt = (sizeof (partnb) / sizeof (partnb[0])); while (--cpt >= 0) if (partnb[cpt] == dp->partition[ptr->partition].type) { do do parttypename++; while (*parttypename); while (--cpt >= 0); break; } while (*++parttypename) *buf++ = *parttypename; buf = ({ memcpy (buf, ": ", sizeof (": ")); buf + sizeof (": ") - 1; }); } } if (gujin_attr.menu_with_partition && ptr->boottype != is_MBR) { char sep, *nameptr; if (dp->nbpartition == 0) { sep = '"'; nameptr = (char *)dp->partition; } else { struct partition_str *curpart = &dp->partition[ptr->partition]; nameptr = (char *)curpart->name; if (curpart->misc.beer_partition) sep = '`'; else if (curpart->misc.active == part_active) sep = '"'; else sep = '\''; } if (nameptr) { *buf++ = sep; while (*nameptr) *buf++ = *nameptr++; *buf++ = sep; } buf = ({ memcpy (buf, ": ", sizeof (": ")); buf + sizeof (": ") - 1; }); } *buf = 0; return buf - buffer; } static inline void redraw_kernel_field (int field, unsigned short row, unsigned short col) { struct desc_str *ptr = &BOOTWAY.desc[(((field) < 0)? -(field) : (field)) - 1]; char buffer[128], *dst = buffer; struct gujin_param_attrib gujin_attr = get_gujin_param_attrib(); unsigned buflen; struct mousefieldattr_str mouse_attr = {}; buflen = begin_line_kernel_field (buffer, &DI.param[ptr->disk], ptr, gujin_attr); print (buffer); col += buflen; unsigned index; if ( gujin_attr.menu_with_initrd && (ptr->boottype == is_kernel_with_header || ptr->boottype == is_kernel_without_header) && (index = initrd_file ((((field) < 0)? -(field) : (field)) - 1)) != 0) { char *fnsrc = ptr->filename, *insrc = BOOTWAY.desc[index].filename; while (*fnsrc == *insrc && *fnsrc) { *dst++ = *fnsrc++; insrc++; } *dst++ = '{'; unsigned nb = ptr->name_offset - (fnsrc - ptr->filename) + 1; while (--nb) *dst++ = *fnsrc++; *dst++ = ','; nb = BOOTWAY.desc[index].name_offset - (insrc - BOOTWAY.desc[index].filename) + 1; while (--nb) *dst++ = *insrc++; if (*(unsigned *)insrc == *(unsigned *)".img") insrc += 4; *dst++ = '}'; while (*fnsrc == *insrc && *fnsrc) { *dst++ = *fnsrc++; insrc++; } if (*(unsigned *)insrc == *(unsigned *)".img") insrc += 4; if (*fnsrc || *insrc) { *dst++ = '{'; while (*fnsrc) *dst++ = *fnsrc++; *dst++ = ','; while (*insrc) *dst++ = *insrc++; *dst++ = '}'; } *dst++ = '\0'; } else { char *src = ptr->filename; while (*src) *dst++ = *src++; *dst = '\0'; } if (dst - buffer >= UI.parameter.nbcol - col) *(unsigned *)&buffer[UI.parameter.nbcol - col - 4] = *(unsigned *)"..."; mouse_attr.mainfield = 1; mouse_attr.active = 1; MOUSE_print_field (buffer, mouse_attr, ((((((field) < 0)? -(field) : (field)) - Menu.curpage * Menu.nbperpage <= 10)? (0x3AU + (((field) < 0)? -(field) : (field)) - Menu.curpage * Menu.nbperpage) : (0x85U + (((field) < 0)? -(field) : (field)) - Menu.curpage * Menu.nbperpage - 11)) << 8), row, col); } static inline unsigned attr_is_greyed (unsigned absnb) { if (STATE.dos_running) { if ( absnb == enum_search_disk_mbr || absnb == enum_search_part_mbr || absnb == enum_probe_ide_disk || absnb == enum_probe_cdrom) return 1; } return 0; } static inline int redraw_setup_attribute_field (int field, unsigned short keyNo, unsigned short row, unsigned short col) { const char *startstr = 0; char active = 0; unsigned absnb = (((field) < 0)? -(field) : (field)) - 1; static const char * const Smenu[] = { "verbose", "BPP locked when +/-", "text/graphic locked when +/-", "display disk in menu", "display partition type in menu", "display partition in menu", "display initial RAM disks", "force last text mode at startup", "protect other partitions by ATA/HPA", "force root probing", "keep IDE in the BIOS order", "ignore kernel IDE options", "enable disk write", "manage visible/hidden partitions", "VGA interface", "load ANSI font", "VESA interface", "VESA window I/O detection", "VESA linear interface", "enable Joystick", "search disk's MBR", "search partition's PBR", "keep all partition's PBR", "search El-Torito sessions", "search files in root", "search files in directory", "probe BIOS floppy disks", "probe BIOS hard disks", "probe IDE disks", "probe CDROMs and DVDs", "probe DOS disks", }; union { unsigned value; struct gujin_param_attrib params; } tmp; if (absnb == enum_probe_dos_disk && !STATE.dos_running) startstr = "probe BDI image files"; else if (absnb == enum_disk_write_enable) startstr = "enable disk write (boot device read only)"; else startstr = Smenu[absnb]; tmp.params = get_gujin_param_attrib (); active = ((tmp.value & (1U << absnb)) != 0); if (startstr) { char field[2]; unsigned oldbgcolor = 0; struct mousefieldattr_str mouse_attr = {}; if (field < 0) return strlen (startstr) + sizeof("[X]") - 1 + 1 + 1; if (UI.attributes.valid.transparent) { mouse_attr.pressed = 1; oldbgcolor = UI.bgcolor; UI.function.setbgcolor (UI.stdcolor[white]); } else { print ("[ ]"); col += 1; UI.function.setcursor (row, col); } if (!active) field[0] = ' '; else if (STATE.dos_running || STATE.serial_port >= 0) field[0] = 'X'; else field[0] = '\x17'; field[1] = '\0'; mouse_attr.checkbox = 1; mouse_attr.mainfield = 1; mouse_attr.active = 1; mouse_attr.greyed = attr_is_greyed(absnb); MOUSE_print_field (field, mouse_attr, (((keyNo <= 10)? (0x3AU + keyNo) : (0x85U + keyNo - 11)) << 8), row, col); if (UI.attributes.valid.transparent) UI.function.setbgcolor (oldbgcolor); if (!UI.attributes.valid.transparent) col += 1; UI.function.setcursor (row, col + 2); print (startstr); } return 0; } static inline int redraw_setup_action_field (int field, unsigned short keyNo, unsigned short row, unsigned short col) { const char *fieldname; struct mousefieldattr_str mouse_attr = {}; mouse_attr.mainfield = 1; switch ((field >= 0)? field : -field) { case 1: fieldname = "probe VESA modes 0..0x7F"; mouse_attr.active = !!(((1<< 0)|(1<< 1)|(1<< 8)|(1<< 10)|(1<< 13)|(1<< 14)|(1<< 16)|(1<< 12)|(1<< 11)|(1<< 15)|(1<< 22)|(1<< 24)|(1<< 17)|(1<< 23)|(1<< 18)|(1<< 19)|(1<< 21)|(1<< 20)|(1<< 25)|(1<< 26)|(1<< 28)|(1<< 29)|(1<< 30)) & ((1<< 17)|(1<< 18)|(1<< 19)|(1<< 20) |(1<< 21)|(1<< 22)|(1<< 23)|(1<< 24))); break; case 2: fieldname = "probe VGA modes 0..0x13"; mouse_attr.active = !!(((1<< 0)|(1<< 1)|(1<< 8)|(1<< 10)|(1<< 13)|(1<< 14)|(1<< 16)|(1<< 12)|(1<< 11)|(1<< 15)|(1<< 22)|(1<< 24)|(1<< 17)|(1<< 23)|(1<< 18)|(1<< 19)|(1<< 21)|(1<< 20)|(1<< 25)|(1<< 26)|(1<< 28)|(1<< 29)|(1<< 30)) & (1<< 0)); break; case 3: fieldname = "probe VGA modes 0x14..0x7F"; mouse_attr.active = !!(((1<< 0)|(1<< 1)|(1<< 8)|(1<< 10)|(1<< 13)|(1<< 14)|(1<< 16)|(1<< 12)|(1<< 11)|(1<< 15)|(1<< 22)|(1<< 24)|(1<< 17)|(1<< 23)|(1<< 18)|(1<< 19)|(1<< 21)|(1<< 20)|(1<< 25)|(1<< 26)|(1<< 28)|(1<< 29)|(1<< 30)) & (1<< 0)); break; case 4: fieldname = "reset VGA/VESA modes 0..0x7F"; mouse_attr.active = !!(((1<< 0)|(1<< 1)|(1<< 8)|(1<< 10)|(1<< 13)|(1<< 14)|(1<< 16)|(1<< 12)|(1<< 11)|(1<< 15)|(1<< 22)|(1<< 24)|(1<< 17)|(1<< 23)|(1<< 18)|(1<< 19)|(1<< 21)|(1<< 20)|(1<< 25)|(1<< 26)|(1<< 28)|(1<< 29)|(1<< 30)) & (1<< 0)); break; case 5: fieldname = "reset all saved parameters"; mouse_attr.active = 1; break; case 6: fieldname = STATE.dos_running? "exit to DOS" : "turn power off"; mouse_attr.active = 1; break; case 7: fieldname = "set stop CDROM FD/HD emulation"; mouse_attr.active = !STATE.dos_running; break; case 8: fieldname = "set min nb char initrd"; mouse_attr.active = 1; break; case 9: fieldname = "set time offset"; mouse_attr.active = 1; break; case 10: fieldname = "set auto-booting timeout"; mouse_attr.active = 1; break; case 11: fieldname = "change keyboard type"; mouse_attr.active = !STATE.dos_running || STATE.serial_port >= 0; break; case 12: fieldname = "change command line"; mouse_attr.active = 1; break; case 13: fieldname = "set the end of the extended partition"; mouse_attr.active = !STATE.dos_running; break; case 14: fieldname = "uninstall Gujin MBR"; mouse_attr.active = ({ extern bootloader2_t uninstall_mbr; typeof (uninstall_mbr.header.nbword) returned; asm volatile (" mov %%cs:%1,%0 " : "=r" (returned) : "m" (uninstall_mbr.header.nbword)); returned; }) == 256 && STATE.has_just_been_uninstalled != 1367; break; case 0: return 14; default: return 0; } if (field > 0) { MOUSE_print_field (fieldname, mouse_attr, (((keyNo <= 10)? (0x3AU + keyNo) : (0x85U + keyNo - 11)) << 8), row, col); return 0; } else { return strlen (fieldname) + 1 + 1; } } int redraw_setup_field (int field, unsigned short row, unsigned short col) { unsigned short keyNo = (((field) < 0)? -(field) : (field)) - Menu.curpage * Menu.nbperpage; if (field == 0) return redraw_setup_action_field (0, 0, 0, 0); else if ((((field) < 0)? -(field) : (field)) <= enum_gujin_param_attrib_end) return redraw_setup_attribute_field (field, keyNo, row, col); else return redraw_setup_action_field (field + ((field > 0) ? - enum_gujin_param_attrib_end : enum_gujin_param_attrib_end), keyNo, row, col); } -- Summary: -fno-function-cse not working Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: etienne_lorrain at yahoo dot fr GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39892