From 1f0a95e481255e8051cae4f3e63ac6035abb47b1 Mon Sep 17 00:00:00 2001 From: okuji Date: Fri, 19 Aug 2005 00:32:01 +0000 Subject: [PATCH] 2005-08-19 Yoshinori K. Okuji * DISTLIST: Replace commands/i386/pc/vbe_list_modes.c and commands/i386/pc/vbe_test.c with commands/i386/pc/vbeinfo.c and commands/i386/pc/vbetest.c. * video/i386/pc/vbe.c (grub_vbe_probe): If INFOBLOCK is not NULL, call grub_vbe_get_controller_info again, because the returned information is volatile. (grub_vbe_set_video_mode): Mostly rewritten. (grub_vbe_get_video_mode): Use grub_vbe_probe and use grub_vbe_status_t correctly. (grub_vbe_get_video_mode_info): Likewise. (grub_vbe_set_pixel_rgb): Use a switch statement rather than several if statements. * commands/i386/pc/vbe_list_modes.c: Renamed to ... * commands/i386/pc/vbeinfo.c: ... this. * commands/i386/pc/vbe_test.c: Renamed to ... * commands/i386/pc/vbetest.c: ... this. * commands/i386/pc/vbeinfo.c (grub_cmd_vbe_list_modes): Renamed to ... (grub_cmd_vbeinfo): ... this. Save video modes before iterating. Skip a video mode, if it is not available, not enough information is given or it is monochrome. Show the memory model. Leave the interpretation of MODEVAR to grub_strtoul completely. (GRUB_MOD_INIT): Rename vbe_list_modes to vbeinfo. (GRUB_MOD_FINI): Likewise. * commands/i386/pc/vbetest.c (grub_cmd_vbe_test): Renamed to ... (grub_cmd_vbetest): ... this. Don't print unnecessarily. Use grub_err_t instead of grub_uint32_t. Don't use SPTR. Remove a duplicated grub_env_get. Leave the interpretation of MODEVAR to grub_strtoul completely. (real2pm): Removed. (GRUB_MOD_INIT): Rename vbe_test to vbetest. (GRUB_MOD_FINI): Likewise. * normal/misc.c: Include grub/mm.h. * conf/i386-pc.rmk (pkgdata_MODULES): Replaced vbe_test.mod and vbe_list_modes with vbetest.mod and vbeinfo.mod. (vbe_list_modes_mod_SOURCES): Removed. (vbe_list_modes_mod_CFLAGS): Likewise. (vbe_test_mod_SOURCES): Likewise. (vbe_test_mod_CFLAGS): Likewise. (vbeinfo_mod_SOURCES): New variable. (vbeinfo_mod_CFLAGS): Likewise. (vbetest_mod_SOURCES): Likewise. (vbetest_mod_CFLAGS): Likewise. --- ChangeLog | 54 ++++ DISTLIST | 4 +- commands/i386/pc/vbe_list_modes.c | 147 ---------- commands/i386/pc/vbeinfo.c | 163 +++++++++++ commands/i386/pc/{vbe_test.c => vbetest.c} | 89 +++--- conf/i386-pc.mk | 118 ++++---- conf/i386-pc.rmk | 14 +- normal/misc.c | 1 + video/i386/pc/vbe.c | 303 ++++++++++----------- 9 files changed, 464 insertions(+), 429 deletions(-) delete mode 100644 commands/i386/pc/vbe_list_modes.c create mode 100644 commands/i386/pc/vbeinfo.c rename commands/i386/pc/{vbe_test.c => vbetest.c} (74%) diff --git a/ChangeLog b/ChangeLog index 0f953e970..36a01642b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,57 @@ +2005-08-19 Yoshinori K. Okuji + + * DISTLIST: Replace commands/i386/pc/vbe_list_modes.c and + commands/i386/pc/vbe_test.c with commands/i386/pc/vbeinfo.c and + commands/i386/pc/vbetest.c. + + * video/i386/pc/vbe.c (grub_vbe_probe): If INFOBLOCK is not NULL, + call grub_vbe_get_controller_info again, because the returned + information is volatile. + (grub_vbe_set_video_mode): Mostly rewritten. + (grub_vbe_get_video_mode): Use grub_vbe_probe and use + grub_vbe_status_t correctly. + (grub_vbe_get_video_mode_info): Likewise. + (grub_vbe_set_pixel_rgb): Use a switch statement rather than + several if statements. + + * commands/i386/pc/vbe_list_modes.c: Renamed to ... + * commands/i386/pc/vbeinfo.c: ... this. + + * commands/i386/pc/vbe_test.c: Renamed to ... + * commands/i386/pc/vbetest.c: ... this. + + * commands/i386/pc/vbeinfo.c (grub_cmd_vbe_list_modes): Renamed to + ... + (grub_cmd_vbeinfo): ... this. Save video modes before + iterating. Skip a video mode, if it is not available, not enough + information is given or it is monochrome. Show the memory + model. Leave the interpretation of MODEVAR to grub_strtoul + completely. + (GRUB_MOD_INIT): Rename vbe_list_modes to vbeinfo. + (GRUB_MOD_FINI): Likewise. + + * commands/i386/pc/vbetest.c (grub_cmd_vbe_test): Renamed to ... + (grub_cmd_vbetest): ... this. Don't print unnecessarily. Use + grub_err_t instead of grub_uint32_t. Don't use SPTR. Remove a + duplicated grub_env_get. Leave the interpretation of MODEVAR to + grub_strtoul completely. + (real2pm): Removed. + (GRUB_MOD_INIT): Rename vbe_test to vbetest. + (GRUB_MOD_FINI): Likewise. + + * normal/misc.c: Include grub/mm.h. + + * conf/i386-pc.rmk (pkgdata_MODULES): Replaced vbe_test.mod and + vbe_list_modes with vbetest.mod and vbeinfo.mod. + (vbe_list_modes_mod_SOURCES): Removed. + (vbe_list_modes_mod_CFLAGS): Likewise. + (vbe_test_mod_SOURCES): Likewise. + (vbe_test_mod_CFLAGS): Likewise. + (vbeinfo_mod_SOURCES): New variable. + (vbeinfo_mod_CFLAGS): Likewise. + (vbetest_mod_SOURCES): Likewise. + (vbetest_mod_CFLAGS): Likewise. + 2005-08-18 Yoshinori K. Okuji * normal/misc.c: New file. diff --git a/DISTLIST b/DISTLIST index c93189f14..92ce2c3ed 100644 --- a/DISTLIST +++ b/DISTLIST @@ -32,8 +32,8 @@ boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/crt0.S commands/i386/pc/halt.c commands/i386/pc/reboot.c -commands/i386/pc/vbe_list_modes.c -commands/i386/pc/vbe_test.c +commands/i386/pc/vbeinfo.c +commands/i386/pc/vbetest.c commands/ieee1275/halt.c commands/ieee1275/reboot.c commands/ieee1275/suspend.c diff --git a/commands/i386/pc/vbe_list_modes.c b/commands/i386/pc/vbe_list_modes.c deleted file mode 100644 index d2f51787b..000000000 --- a/commands/i386/pc/vbe_list_modes.c +++ /dev/null @@ -1,147 +0,0 @@ -/* vbe_list_modes.c - command to list compatible VBE video modes. */ -/* - * GRUB -- GRand Unified Bootloader - * Copyright (C) 2005 Free Software Foundation, Inc. - * - * GRUB 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 GRUB; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include - -static void * -real2pm(grub_vbe_farptr_t ptr) -{ - return (void *)((((unsigned long)ptr & 0xFFFF0000) >> 12UL) - + ((unsigned long)ptr & 0x0000FFFF)); -} - -static grub_err_t -grub_cmd_vbe_list_modes(struct grub_arg_list *state __attribute__ ((unused)), - int argc __attribute__ ((unused)), - char **args __attribute__ ((unused))) -{ - struct grub_vbe_info_block controller_info; - struct grub_vbe_mode_info_block mode_info_tmp; - grub_uint32_t use_mode = GRUB_VBE_DEFAULT_VIDEO_MODE; - grub_uint16_t *sptr; - grub_uint32_t rc; - char *modevar; - - grub_printf ("List of compatible video modes:\n"); - - rc = grub_vbe_probe (&controller_info); - - if (rc != GRUB_ERR_NONE) - { - grub_printf ("VESA BIOS Extension not detected!\n"); - return rc; - } - - sptr = real2pm (controller_info.video_mode_ptr); - - /* Walk thru all video modes listed. */ - for (;*sptr != 0xFFFF; sptr++) - { - int valid_mode = 1; - - rc = grub_vbe_get_video_mode_info (*sptr, &mode_info_tmp); - if (rc != GRUB_ERR_NONE) continue; - - if ((mode_info_tmp.mode_attributes & 0x080) == 0) - { - /* We support only linear frame buffer modes. */ - continue; - } - - if ((mode_info_tmp.mode_attributes & 0x010) == 0) - { - /* We allow only graphical modes. */ - continue; - } - - switch(mode_info_tmp.memory_model) - { - case 0x04: - case 0x06: - break; - - default: - valid_mode = 0; - break; - } - - if (valid_mode == 0) continue; - - grub_printf ("0x%03x: %d x %d x %d bpp\n", - *sptr, - mode_info_tmp.x_resolution, - mode_info_tmp.y_resolution, - mode_info_tmp.bits_per_pixel); - } - - /* Check existence of vbe_mode environment variable. */ - modevar = grub_env_get ("vbe_mode"); - - /* Check existence of vbe_mode environment variable. */ - modevar = grub_env_get ("vbe_mode"); - - if (modevar != 0) - { - unsigned long value = 0; - - if ((grub_strncmp (modevar, "0x", 2) == 0) || - (grub_strncmp (modevar, "0X", 2) == 0)) - { - /* Convert HEX mode number. */ - value = grub_strtoul (modevar + 2, 0, 16); - } - else - { - /* Convert DEC mode number. */ - value = grub_strtoul (modevar, 0, 10); - } - - if (value != 0) - { - use_mode = value; - } - } - - grub_printf ("Configured VBE mode (vbe_mode) = 0x%03x\n", use_mode); - - return 0; -} - -GRUB_MOD_INIT -{ - (void)mod; /* To stop warning. */ - grub_register_command ("vbe_list_modes", - grub_cmd_vbe_list_modes, - GRUB_COMMAND_FLAG_BOTH, - "vbe_list_modes", - "List compatible VESA BIOS extension video modes.", - 0); -} - -GRUB_MOD_FINI -{ - grub_unregister_command ("vbe_list_modes"); -} diff --git a/commands/i386/pc/vbeinfo.c b/commands/i386/pc/vbeinfo.c new file mode 100644 index 000000000..06b9b3200 --- /dev/null +++ b/commands/i386/pc/vbeinfo.c @@ -0,0 +1,163 @@ +/* vbeinfo.c - command to list compatible VBE video modes. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2005 Free Software Foundation, Inc. + * + * GRUB 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 GRUB; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static void * +real2pm (grub_vbe_farptr_t ptr) +{ + return (void *) ((((unsigned long) ptr & 0xFFFF0000) >> 12UL) + + ((unsigned long) ptr & 0x0000FFFF)); +} + +static grub_err_t +grub_cmd_vbeinfo (struct grub_arg_list *state __attribute__ ((unused)), + int argc __attribute__ ((unused)), + char **args __attribute__ ((unused))) +{ + struct grub_vbe_info_block controller_info; + struct grub_vbe_mode_info_block mode_info_tmp; + grub_uint32_t use_mode = GRUB_VBE_DEFAULT_VIDEO_MODE; + grub_uint16_t *video_mode_list; + grub_uint16_t *p; + grub_uint16_t *saved_video_mode_list; + grub_size_t video_mode_list_size; + grub_err_t err; + char *modevar; + + grub_printf ("List of compatible video modes:\n"); + + err = grub_vbe_probe (&controller_info); + if (err != GRUB_ERR_NONE) + return err; + + /* Because the information on video modes is stored in a temporary place, + it is better to copy it to somewhere safe. */ + p = video_mode_list = real2pm (controller_info.video_mode_ptr); + while (*p++ != 0xFFFF) + ; + + video_mode_list_size = (grub_addr_t) p - (grub_addr_t) video_mode_list; + saved_video_mode_list = grub_malloc (video_mode_list_size); + if (! saved_video_mode_list) + return grub_errno; + + grub_memcpy (saved_video_mode_list, video_mode_list, video_mode_list_size); + + /* Walk through all video modes listed. */ + for (p = saved_video_mode_list; *p != 0xFFFF; p++) + { + const char *memory_model = 0; + grub_uint32_t mode = (grub_uint32_t) *p; + + err = grub_vbe_get_video_mode_info (mode, &mode_info_tmp); + if (err != GRUB_ERR_NONE) + { + grub_errno = GRUB_ERR_NONE; + continue; + } + + if ((mode_info_tmp.mode_attributes & 0x001) == 0) + /* If not available, skip it. */ + continue; + + if ((mode_info_tmp.mode_attributes & 0x002) == 0) + /* Not enough information. */ + continue; + + if ((mode_info_tmp.mode_attributes & 0x008) == 0) + /* Monochrome is unusable. */ + continue; + + if ((mode_info_tmp.mode_attributes & 0x080) == 0) + /* We support only linear frame buffer modes. */ + continue; + + if ((mode_info_tmp.mode_attributes & 0x010) == 0) + /* We allow only graphical modes. */ + continue; + + switch (mode_info_tmp.memory_model) + { + case 0x04: + memory_model = "Packed Pixel"; + break; + case 0x06: + memory_model = "Direct Color"; + break; + + default: + break; + } + + if (! memory_model) + continue; + + grub_printf ("0x%03x: %d x %d x %d bpp (%s)\n", + mode, + mode_info_tmp.x_resolution, + mode_info_tmp.y_resolution, + mode_info_tmp.bits_per_pixel, + memory_model); + } + + grub_free (saved_video_mode_list); + + /* Check existence of vbe_mode environment variable. */ + modevar = grub_env_get ("vbe_mode"); + + if (modevar != 0) + { + unsigned long value; + + value = grub_strtoul (modevar, 0, 0); + if (grub_errno == GRUB_ERR_NONE) + use_mode = value; + else + grub_errno = GRUB_ERR_NONE; + } + + grub_printf ("Configured VBE mode (vbe_mode) = 0x%03x\n", use_mode); + + return 0; +} + +GRUB_MOD_INIT +{ + (void) mod; /* To stop warning. */ + grub_register_command ("vbeinfo", + grub_cmd_vbeinfo, + GRUB_COMMAND_FLAG_BOTH, + "vbeinfo", + "List compatible VESA BIOS extension video modes.", + 0); +} + +GRUB_MOD_FINI +{ + grub_unregister_command ("vbeinfo"); +} diff --git a/commands/i386/pc/vbe_test.c b/commands/i386/pc/vbetest.c similarity index 74% rename from commands/i386/pc/vbe_test.c rename to commands/i386/pc/vbetest.c index 9bbde8dfc..8e0a246b4 100644 --- a/commands/i386/pc/vbe_test.c +++ b/commands/i386/pc/vbetest.c @@ -1,4 +1,4 @@ -/* vbe_test.c - command to test VESA BIOS Extension 2.0+ support. */ +/* vbetest.c - command to test VESA BIOS Extension 2.0+ support. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2005 Free Software Foundation, Inc. @@ -26,21 +26,14 @@ #include #include #include - -static void * -real2pm(grub_vbe_farptr_t ptr) -{ - return (void *)((((unsigned long)ptr & 0xFFFF0000) >> 12UL) - + ((unsigned long)ptr & 0x0000FFFF)); -} +#include static grub_err_t -grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)), +grub_cmd_vbetest (struct grub_arg_list *state __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { - grub_uint32_t rc; - grub_uint16_t *sptr; + grub_err_t err; char *modevar; struct grub_vbe_mode_info_block mode_info; struct grub_vbe_info_block controller_info; @@ -54,12 +47,10 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)), grub_printf ("Probing for VESA BIOS Extension ... "); /* Check if VESA BIOS exists. */ - rc = grub_vbe_probe(&controller_info); - if (rc != GRUB_ERR_NONE) - { - grub_printf ("not found!\n"); - return rc; - } + err = grub_vbe_probe (&controller_info); + if (err != GRUB_ERR_NONE) + return err; + grub_printf ("found!\n"); /* Dump out controller information. */ @@ -77,43 +68,31 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)), grub_printf ("Total memory = %d\n", controller_info.total_memory); - sptr = real2pm(controller_info.video_mode_ptr); - - rc = grub_vbe_get_video_mode(&old_mode); - grub_printf ("Get video mode rc = %04x\n", rc); - - if (rc == GRUB_ERR_NONE) - { - grub_printf ("Old video mode = %04x\n", old_mode); - } + err = grub_vbe_get_video_mode (&old_mode); + grub_printf ("Get video mode err = %04x\n", err); + if (err == GRUB_ERR_NONE) + grub_printf ("Old video mode = %04x\n", old_mode); + else + grub_errno = GRUB_ERR_NONE; + /* Check existence of vbe_mode environment variable. */ modevar = grub_env_get ("vbe_mode"); - if (modevar != 0) { - unsigned long value = 0; - - if ((grub_strncmp (modevar, "0x", 2) == 0) || - (grub_strncmp (modevar, "0X", 2) == 0)) - { - /* Convert HEX mode number. */ - value = grub_strtoul (modevar + 2, 0, 16); - } + unsigned long value; + + value = grub_strtoul (modevar, 0, 0); + if (grub_errno == GRUB_ERR_NONE) + use_mode = value; else - { - /* Convert DEC mode number. */ - value = grub_strtoul (modevar, 0, 10); - } - - if (value != 0) - { - use_mode = value; - } + grub_errno = GRUB_ERR_NONE; } - rc = grub_vbe_get_video_mode_info (use_mode, &mode_info); - + err = grub_vbe_get_video_mode_info (use_mode, &mode_info); + if (err != GRUB_ERR_NONE) + return err; + /* Dump out details about the mode being tested. */ grub_printf ("mode: 0x%03x\n", use_mode); @@ -144,10 +123,12 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)), grub_getkey (); /* Setup GFX mode. */ - rc = grub_vbe_set_video_mode (use_mode, &mode_info); + err = grub_vbe_set_video_mode (use_mode, &mode_info); + if (err != GRUB_ERR_NONE) + return err; /* Determine framebuffer address and how many bytes are in scan line. */ - framebuffer = (grub_uint8_t *)mode_info.phys_base_addr; + framebuffer = (grub_uint8_t *) mode_info.phys_base_addr; ptr = framebuffer; if (controller_info.version >= 0x300) @@ -179,21 +160,21 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)), /* Restore old video mode. */ grub_vbe_set_video_mode (old_mode, 0); - return 0; + return grub_errno; } GRUB_MOD_INIT { - (void)mod; /* To stop warning. */ - grub_register_command ("vbe_test", - grub_cmd_vbe_test, + (void) mod; /* To stop warning. */ + grub_register_command ("vbetest", + grub_cmd_vbetest, GRUB_COMMAND_FLAG_BOTH, - "vbe_test", + "vbetest", "Test VESA BIOS Extension 2.0+ support", 0); } GRUB_MOD_FINI { - grub_unregister_command ("vbe_test"); + grub_unregister_command ("vbetest"); } diff --git a/conf/i386-pc.mk b/conf/i386-pc.mk index c013a6784..bdfbe540a 100644 --- a/conf/i386-pc.mk +++ b/conf/i386-pc.mk @@ -1150,7 +1150,7 @@ pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod \ terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod \ apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod \ help.mod default.mod timeout.mod configfile.mod vbe.mod \ - vesafb.mod vbe_test.mod vbe_list_modes.mod + vesafb.mod vbetest.mod vbeinfo.mod # For _chain.mod. _chain_mod_SOURCES = loader/i386/pc/chainloader.c @@ -3081,105 +3081,105 @@ fs-vesafb.lst: term/i386/pc/vesafb.c genfslist.sh vesafb_mod_CFLAGS = $(COMMON_CFLAGS) -# For vbe_list_modes.mod. -vbe_list_modes_mod_SOURCES = commands/i386/pc/vbe_list_modes.c -CLEANFILES += vbe_list_modes.mod mod-vbe_list_modes.o mod-vbe_list_modes.c pre-vbe_list_modes.o vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o def-vbe_list_modes.lst und-vbe_list_modes.lst -MOSTLYCLEANFILES += vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d -DEFSYMFILES += def-vbe_list_modes.lst -UNDSYMFILES += und-vbe_list_modes.lst +# For vbeinfo.mod. +vbeinfo_mod_SOURCES = commands/i386/pc/vbeinfo.c +CLEANFILES += vbeinfo.mod mod-vbeinfo.o mod-vbeinfo.c pre-vbeinfo.o vbeinfo_mod-commands_i386_pc_vbeinfo.o def-vbeinfo.lst und-vbeinfo.lst +MOSTLYCLEANFILES += vbeinfo_mod-commands_i386_pc_vbeinfo.d +DEFSYMFILES += def-vbeinfo.lst +UNDSYMFILES += und-vbeinfo.lst -vbe_list_modes.mod: pre-vbe_list_modes.o mod-vbe_list_modes.o +vbeinfo.mod: pre-vbeinfo.o mod-vbeinfo.o -rm -f $@ $(LD) -r -d -o $@ $^ $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ -pre-vbe_list_modes.o: vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o +pre-vbeinfo.o: vbeinfo_mod-commands_i386_pc_vbeinfo.o -rm -f $@ $(LD) -r -d -o $@ $^ -mod-vbe_list_modes.o: mod-vbe_list_modes.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -c -o $@ $< +mod-vbeinfo.o: mod-vbeinfo.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -c -o $@ $< -mod-vbe_list_modes.c: moddep.lst genmodsrc.sh - sh $(srcdir)/genmodsrc.sh 'vbe_list_modes' $< > $@ || (rm -f $@; exit 1) +mod-vbeinfo.c: moddep.lst genmodsrc.sh + sh $(srcdir)/genmodsrc.sh 'vbeinfo' $< > $@ || (rm -f $@; exit 1) -def-vbe_list_modes.lst: pre-vbe_list_modes.o - $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbe_list_modes/' > $@ +def-vbeinfo.lst: pre-vbeinfo.o + $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbeinfo/' > $@ -und-vbe_list_modes.lst: pre-vbe_list_modes.o - echo 'vbe_list_modes' > $@ +und-vbeinfo.lst: pre-vbeinfo.o + echo 'vbeinfo' > $@ $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ -vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o: commands/i386/pc/vbe_list_modes.c - $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -c -o $@ $< +vbeinfo_mod-commands_i386_pc_vbeinfo.o: commands/i386/pc/vbeinfo.c + $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -c -o $@ $< -vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d: commands/i386/pc/vbe_list_modes.c - set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -M $< | sed 's,vbe_list_modes\.o[ :]*,vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ +vbeinfo_mod-commands_i386_pc_vbeinfo.d: commands/i386/pc/vbeinfo.c + set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -M $< | sed 's,vbeinfo\.o[ :]*,vbeinfo_mod-commands_i386_pc_vbeinfo.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ --include vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d +-include vbeinfo_mod-commands_i386_pc_vbeinfo.d -CLEANFILES += cmd-vbe_list_modes.lst fs-vbe_list_modes.lst -COMMANDFILES += cmd-vbe_list_modes.lst -FSFILES += fs-vbe_list_modes.lst +CLEANFILES += cmd-vbeinfo.lst fs-vbeinfo.lst +COMMANDFILES += cmd-vbeinfo.lst +FSFILES += fs-vbeinfo.lst -cmd-vbe_list_modes.lst: commands/i386/pc/vbe_list_modes.c gencmdlist.sh - set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh vbe_list_modes > $@ || (rm -f $@; exit 1) +cmd-vbeinfo.lst: commands/i386/pc/vbeinfo.c gencmdlist.sh + set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh vbeinfo > $@ || (rm -f $@; exit 1) -fs-vbe_list_modes.lst: commands/i386/pc/vbe_list_modes.c genfslist.sh - set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh vbe_list_modes > $@ || (rm -f $@; exit 1) +fs-vbeinfo.lst: commands/i386/pc/vbeinfo.c genfslist.sh + set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh vbeinfo > $@ || (rm -f $@; exit 1) -vbe_list_modes_mod_CFLAGS = $(COMMON_CFLAGS) +vbeinfo_mod_CFLAGS = $(COMMON_CFLAGS) -# For vbe_test.mod. -vbe_test_mod_SOURCES = commands/i386/pc/vbe_test.c -CLEANFILES += vbe_test.mod mod-vbe_test.o mod-vbe_test.c pre-vbe_test.o vbe_test_mod-commands_i386_pc_vbe_test.o def-vbe_test.lst und-vbe_test.lst -MOSTLYCLEANFILES += vbe_test_mod-commands_i386_pc_vbe_test.d -DEFSYMFILES += def-vbe_test.lst -UNDSYMFILES += und-vbe_test.lst +# For vbetest.mod. +vbetest_mod_SOURCES = commands/i386/pc/vbetest.c +CLEANFILES += vbetest.mod mod-vbetest.o mod-vbetest.c pre-vbetest.o vbetest_mod-commands_i386_pc_vbetest.o def-vbetest.lst und-vbetest.lst +MOSTLYCLEANFILES += vbetest_mod-commands_i386_pc_vbetest.d +DEFSYMFILES += def-vbetest.lst +UNDSYMFILES += und-vbetest.lst -vbe_test.mod: pre-vbe_test.o mod-vbe_test.o +vbetest.mod: pre-vbetest.o mod-vbetest.o -rm -f $@ $(LD) -r -d -o $@ $^ $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ -pre-vbe_test.o: vbe_test_mod-commands_i386_pc_vbe_test.o +pre-vbetest.o: vbetest_mod-commands_i386_pc_vbetest.o -rm -f $@ $(LD) -r -d -o $@ $^ -mod-vbe_test.o: mod-vbe_test.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -c -o $@ $< +mod-vbetest.o: mod-vbetest.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -c -o $@ $< -mod-vbe_test.c: moddep.lst genmodsrc.sh - sh $(srcdir)/genmodsrc.sh 'vbe_test' $< > $@ || (rm -f $@; exit 1) +mod-vbetest.c: moddep.lst genmodsrc.sh + sh $(srcdir)/genmodsrc.sh 'vbetest' $< > $@ || (rm -f $@; exit 1) -def-vbe_test.lst: pre-vbe_test.o - $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbe_test/' > $@ +def-vbetest.lst: pre-vbetest.o + $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbetest/' > $@ -und-vbe_test.lst: pre-vbe_test.o - echo 'vbe_test' > $@ +und-vbetest.lst: pre-vbetest.o + echo 'vbetest' > $@ $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ -vbe_test_mod-commands_i386_pc_vbe_test.o: commands/i386/pc/vbe_test.c - $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -c -o $@ $< +vbetest_mod-commands_i386_pc_vbetest.o: commands/i386/pc/vbetest.c + $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -c -o $@ $< -vbe_test_mod-commands_i386_pc_vbe_test.d: commands/i386/pc/vbe_test.c - set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -M $< | sed 's,vbe_test\.o[ :]*,vbe_test_mod-commands_i386_pc_vbe_test.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ +vbetest_mod-commands_i386_pc_vbetest.d: commands/i386/pc/vbetest.c + set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -M $< | sed 's,vbetest\.o[ :]*,vbetest_mod-commands_i386_pc_vbetest.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ --include vbe_test_mod-commands_i386_pc_vbe_test.d +-include vbetest_mod-commands_i386_pc_vbetest.d -CLEANFILES += cmd-vbe_test.lst fs-vbe_test.lst -COMMANDFILES += cmd-vbe_test.lst -FSFILES += fs-vbe_test.lst +CLEANFILES += cmd-vbetest.lst fs-vbetest.lst +COMMANDFILES += cmd-vbetest.lst +FSFILES += fs-vbetest.lst -cmd-vbe_test.lst: commands/i386/pc/vbe_test.c gencmdlist.sh - set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh vbe_test > $@ || (rm -f $@; exit 1) +cmd-vbetest.lst: commands/i386/pc/vbetest.c gencmdlist.sh + set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh vbetest > $@ || (rm -f $@; exit 1) -fs-vbe_test.lst: commands/i386/pc/vbe_test.c genfslist.sh - set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh vbe_test > $@ || (rm -f $@; exit 1) +fs-vbetest.lst: commands/i386/pc/vbetest.c genfslist.sh + set -e; $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh vbetest > $@ || (rm -f $@; exit 1) -vbe_test_mod_CFLAGS = $(COMMON_CFLAGS) +vbetest_mod_CFLAGS = $(COMMON_CFLAGS) CLEANFILES += moddep.lst command.lst fs.lst pkgdata_DATA += moddep.lst command.lst fs.lst moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 3a18e1d6f..da1769d2d 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -112,7 +112,7 @@ pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod \ terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod \ apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod \ help.mod default.mod timeout.mod configfile.mod vbe.mod \ - vesafb.mod vbe_test.mod vbe_list_modes.mod + vesafb.mod vbetest.mod vbeinfo.mod # For _chain.mod. _chain_mod_SOURCES = loader/i386/pc/chainloader.c @@ -262,10 +262,10 @@ vbe_mod_CFLAGS = $(COMMON_CFLAGS) vesafb_mod_SOURCES = term/i386/pc/vesafb.c vesafb_mod_CFLAGS = $(COMMON_CFLAGS) -# For vbe_list_modes.mod. -vbe_list_modes_mod_SOURCES = commands/i386/pc/vbe_list_modes.c -vbe_list_modes_mod_CFLAGS = $(COMMON_CFLAGS) +# For vbeinfo.mod. +vbeinfo_mod_SOURCES = commands/i386/pc/vbeinfo.c +vbeinfo_mod_CFLAGS = $(COMMON_CFLAGS) -# For vbe_test.mod. -vbe_test_mod_SOURCES = commands/i386/pc/vbe_test.c -vbe_test_mod_CFLAGS = $(COMMON_CFLAGS) +# For vbetest.mod. +vbetest_mod_SOURCES = commands/i386/pc/vbetest.c +vbetest_mod_CFLAGS = $(COMMON_CFLAGS) diff --git a/normal/misc.c b/normal/misc.c index a89b8e45c..48e651673 100644 --- a/normal/misc.c +++ b/normal/misc.c @@ -23,6 +23,7 @@ #include #include #include +#include /* Print the information on the device NAME. */ grub_err_t diff --git a/video/i386/pc/vbe.c b/video/i386/pc/vbe.c index d40c3ff5d..04d39d315 100644 --- a/video/i386/pc/vbe.c +++ b/video/i386/pc/vbe.c @@ -71,70 +71,51 @@ grub_err_t grub_vbe_probe (struct grub_vbe_info_block *info_block) { struct grub_vbe_info_block *vbe_ib; - grub_uint32_t rc; - + grub_vbe_status_t status; + /* Clear caller's controller info block. */ - if (info_block != 0) - { - grub_memset (info_block, 0, sizeof(struct grub_vbe_info_block)); - } + if (info_block) + grub_memset (info_block, 0, sizeof (*info_block)); - /* Do not probe more than one time. */ - if (vbe_detected != -1) + /* Do not probe more than one time, if not necessary. */ + if (vbe_detected == -1 || info_block) { - if (vbe_detected == 1) + /* Clear old copy of controller info block. */ + grub_memset (&controller_info, 0, sizeof (controller_info)); + + /* Mark VESA BIOS extension as undetected. */ + vbe_detected = 0; + + /* Use low memory scratch area as temporary storage + for VESA BIOS call. */ + vbe_ib = (struct grub_vbe_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + + /* Prepare info block. */ + grub_memset (vbe_ib, 0, sizeof (*vbe_ib)); + + vbe_ib->signature[0] = 'V'; + vbe_ib->signature[1] = 'B'; + vbe_ib->signature[2] = 'E'; + vbe_ib->signature[3] = '2'; + + /* Try to get controller info block. */ + status = grub_vbe_get_controller_info (vbe_ib); + if (status == 0x004F) { - /* Make copy of controller info block to caller. */ - if (info_block != 0) - { - grub_memcpy (info_block, - &controller_info, - sizeof(struct grub_vbe_info_block)); - } - return GRUB_ERR_NONE; + /* Copy it for later usage. */ + grub_memcpy (&controller_info, vbe_ib, sizeof (controller_info)); + + /* Mark VESA BIOS extension as detected. */ + vbe_detected = 1; } - else - { - return GRUB_ERR_BAD_DEVICE; - } - } - - /* Clear old copy of controller info block. */ - grub_memset (&controller_info, 0, sizeof(struct grub_vbe_info_block)); - - /* Mark VESA BIOS extension as undetected. */ - vbe_detected = 0; - - /* Use low memory scratch area as temporary storage for VESA BIOS call. */ - vbe_ib = (struct grub_vbe_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; - - /* Prepare info block. */ - grub_memset (vbe_ib, 0, sizeof(struct grub_vbe_info_block)); - - vbe_ib->signature[0] = 'V'; - vbe_ib->signature[1] = 'B'; - vbe_ib->signature[2] = 'E'; - vbe_ib->signature[3] = '2'; - - /* Try to get controller info block. */ - rc = grub_vbe_get_controller_info (vbe_ib); - if (rc != 0x004F) - { - return GRUB_ERR_BAD_DEVICE; } - /* Copy it for later usage. */ - grub_memcpy (&controller_info, - vbe_ib, - sizeof(struct grub_vbe_info_block)); - - /* Copy it for caller. */ - grub_memcpy (info_block, - vbe_ib, - sizeof(struct grub_vbe_info_block)); + if (! vbe_detected) + return grub_error (GRUB_ERR_BAD_DEVICE, "VESA BIOS Extension not found"); - /* Mark VESA BIOS extension as detected. */ - vbe_detected = 1; + /* Make copy of controller info block to caller. */ + if (info_block) + grub_memcpy (info_block, &controller_info, sizeof (*info_block)); return GRUB_ERR_NONE; } @@ -143,20 +124,16 @@ grub_err_t grub_vbe_set_video_mode (grub_uint32_t mode, struct grub_vbe_mode_info_block *mode_info) { - grub_uint32_t rc; - - /* If grub_vesafb_probe has not been called or no VBE, abort. */ - if (vbe_detected == 0) - { - return GRUB_ERR_BAD_DEVICE; - } + grub_vbe_status_t status; + grub_uint32_t old_mode; + + /* Make sure that VBE is supported. */ + if (grub_vbe_probe (0) != GRUB_ERR_NONE) + return grub_errno; /* Try to get mode info. */ - rc = grub_vbe_get_video_mode_info (mode, &active_mode_info); - if (rc != GRUB_ERR_NONE) - { - return rc; - } + if (grub_vbe_get_video_mode_info (mode, &active_mode_info) != GRUB_ERR_NONE) + return grub_errno; /* For all VESA BIOS modes, force linear frame buffer. */ if (mode >= 0x100) @@ -165,27 +142,31 @@ grub_vbe_set_video_mode (grub_uint32_t mode, mode |= 1 << 14; /* Determine frame buffer pixel format. */ - switch(active_mode_info.memory_model) + switch (active_mode_info.memory_model) { case 0x04: index_color_mode = 1; break; - + case 0x06: index_color_mode = 0; break; - + default: - return GRUB_ERR_BAD_DEVICE; + return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, + "unsupported pixel format 0x%x", + active_mode_info.memory_model); } } + /* Get current mode. */ + if (grub_vbe_get_video_mode (&old_mode) != GRUB_ERR_NONE) + return grub_errno; + /* Try to set video mode. */ - rc = grub_vbe_set_mode (mode, 0); - if (rc != 0x004F) - { - return GRUB_ERR_BAD_DEVICE; - } + status = grub_vbe_set_mode (mode, 0); + if (status != 0x004F) + return grub_error (GRUB_ERR_BAD_DEVICE, "cannot set VBE mode %x", mode); /* Save information for later usage. */ active_mode = mode; @@ -193,40 +174,43 @@ grub_vbe_set_video_mode (grub_uint32_t mode, if (mode < 0x100) { /* If this is not a VESA mode, guess address. */ - framebuffer = (grub_uint8_t *)0xA0000; + framebuffer = (grub_uint8_t *) 0xA0000; index_color_mode = 1; } else { - framebuffer = (grub_uint8_t *)active_mode_info.phys_base_addr; + framebuffer = (grub_uint8_t *) active_mode_info.phys_base_addr; if (controller_info.version >= 0x300) - { - bytes_per_scan_line = active_mode_info.lin_bytes_per_scan_line; - } + bytes_per_scan_line = active_mode_info.lin_bytes_per_scan_line; else - { - bytes_per_scan_line = active_mode_info.bytes_per_scan_line; - } + bytes_per_scan_line = active_mode_info.bytes_per_scan_line; } /* If video mode is in indexed color, setup default VGA palette. */ - if (index_color_mode != 0) + if (index_color_mode) { - rc = grub_vbe_set_palette_data (16, 0, vga_colors); - if (rc != 0x004F) - { - return GRUB_ERR_BAD_DEVICE; - } + struct grub_vbe_palette_data *palette + = (struct grub_vbe_palette_data *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + + /* Make sure that the BIOS can reach the palette. */ + grub_memcpy (palette, vga_colors, sizeof (vga_colors)); + status = grub_vbe_set_palette_data (16, 0, palette); + + /* For now, ignore the status. Not sure if this is fatal. */ +#if 0 + if (status != 0x004F) + { + grub_vbe_set_mode (old_mode, 0); + return grub_error (GRUB_ERR_BAD_DEVICE, + "cannot set the default VGA palette"); + } +#endif } /* Copy mode info for caller. */ - if (mode_info != 0) - { - grub_memcpy (mode_info, - &active_mode_info, - sizeof(struct grub_vbe_mode_info_block)); - } + if (mode_info) + grub_memcpy (mode_info, &active_mode_info, sizeof (*mode_info)); return GRUB_ERR_NONE; } @@ -234,20 +218,16 @@ grub_vbe_set_video_mode (grub_uint32_t mode, grub_err_t grub_vbe_get_video_mode (grub_uint32_t *mode) { - grub_uint32_t rc; + grub_vbe_status_t status; - /* If grub_vesafb_probe has not been called or no VBE, abort. */ - if (vbe_detected == 0) - { - return GRUB_ERR_BAD_DEVICE; - } + /* Make sure that VBE is supported. */ + if (grub_vbe_probe (0) != GRUB_ERR_NONE) + return grub_errno; /* Try to query current mode from VESA BIOS. */ - rc = grub_vbe_get_mode (mode); - if (rc != 0x004F) - { - return GRUB_ERR_BAD_DEVICE; - } + status = grub_vbe_get_mode (mode); + if (status != 0x004F) + return grub_error (GRUB_ERR_BAD_DEVICE, "cannot get current VBE mode"); return GRUB_ERR_NONE; } @@ -256,37 +236,29 @@ grub_err_t grub_vbe_get_video_mode_info (grub_uint32_t mode, struct grub_vbe_mode_info_block *mode_info) { - struct grub_vbe_mode_info_block *mi_tmp = (struct grub_vbe_mode_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; - grub_uint32_t rc; + struct grub_vbe_mode_info_block *mi_tmp + = (struct grub_vbe_mode_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + grub_vbe_status_t status; - /* If grub_vesafb_probe has not been called or no VBE, abort. */ - if (vbe_detected == 0) - { - return GRUB_ERR_BAD_DEVICE; - } + /* Make sure that VBE is supported. */ + if (grub_vbe_probe (0) != GRUB_ERR_NONE) + return grub_errno; /* If mode is not VESA mode, skip mode info query. */ if (mode >= 0x100) { /* Try to get mode info from VESA BIOS. */ - rc = grub_vbe_get_mode_info (mode, mi_tmp); - if (rc != 0x004F) - { - return GRUB_ERR_BAD_DEVICE; - } + status = grub_vbe_get_mode_info (mode, mi_tmp); + if (status != 0x004F) + return grub_error (GRUB_ERR_BAD_DEVICE, + "cannot get information on the mode %x", mode); /* Make copy of mode info block. */ - grub_memcpy (mode_info, - mi_tmp, - sizeof(struct grub_vbe_mode_info_block)); + grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info)); } else - { - /* Just clear mode info block if it isn't a VESA mode. */ - grub_memset (mode_info, - 0, - sizeof(struct grub_vbe_mode_info_block)); - } + /* Just clear mode info block if it isn't a VESA mode. */ + grub_memset (mode_info, 0, sizeof (*mode_info)); return GRUB_ERR_NONE; } @@ -327,33 +299,44 @@ grub_vbe_set_pixel_rgb (grub_uint32_t x, value |= blue << active_mode_info.blue_field_position; } - if (active_mode_info.bits_per_pixel == 32) + switch (active_mode_info.bits_per_pixel) { - grub_uint32_t *ptr = (grub_uint32_t *)(framebuffer - + y * bytes_per_scan_line - + x * 4); - - *ptr = value; - } - else if (active_mode_info.bits_per_pixel == 24) - { - grub_uint8_t *ptr = (grub_uint8_t *)(framebuffer - + y * bytes_per_scan_line - + x * 3); - grub_uint8_t *ptr2 = (grub_uint8_t *)&value; - - ptr[0] = ptr2[0]; - ptr[1] = ptr2[1]; - ptr[2] = ptr2[2]; - } - else if ((active_mode_info.bits_per_pixel == 16) || - (active_mode_info.bits_per_pixel == 15)) - { - grub_uint16_t *ptr = (grub_uint16_t *)(framebuffer - + y * bytes_per_scan_line - + x * 2); - - *ptr = (grub_uint16_t)(value & 0xFFFF); + case 32: + { + grub_uint32_t *ptr = (grub_uint32_t *) (framebuffer + + y * bytes_per_scan_line + + x * 4); + + *ptr = value; + } + break; + + case 24: + { + grub_uint8_t *ptr = (grub_uint8_t *) (framebuffer + + y * bytes_per_scan_line + + x * 3); + grub_uint8_t *ptr2 = (grub_uint8_t *) &value; + + ptr[0] = ptr2[0]; + ptr[1] = ptr2[1]; + ptr[2] = ptr2[2]; + } + break; + + case 16: + case 15: + { + grub_uint16_t *ptr = (grub_uint16_t *) (framebuffer + + y * bytes_per_scan_line + + x * 2); + + *ptr = (grub_uint16_t) (value & 0xFFFF); + } + break; + + default: + break; } } @@ -370,16 +353,16 @@ grub_vbe_set_pixel_index (grub_uint32_t x, if (index_color_mode == 1) { - grub_uint8_t *ptr = (grub_uint8_t *)(framebuffer - + y * bytes_per_scan_line - + x); + grub_uint8_t *ptr = (grub_uint8_t *) (framebuffer + + y * bytes_per_scan_line + + x); *ptr = color; } else { color &= 0x0F; - + if (color < 16) { grub_vbe_set_pixel_rgb (x, @@ -396,5 +379,5 @@ grub_vbe_set_pixel_index (grub_uint32_t x, 0, 0); } - } + } } -- 2.39.5