2005-08-19 Yoshinori K. Okuji <okuji@enbug.org>

* 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.
This commit is contained in:
okuji 2005-08-19 00:32:01 +00:00
parent a7db563eb6
commit 1f0a95e481
9 changed files with 461 additions and 426 deletions

View file

@ -1,3 +1,57 @@
2005-08-19 Yoshinori K. Okuji <okuji@enbug.org>
* 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 <okuji@enbug.org> 2005-08-18 Yoshinori K. Okuji <okuji@enbug.org>
* normal/misc.c: New file. * normal/misc.c: New file.

View file

@ -32,8 +32,8 @@ boot/powerpc/ieee1275/cmain.c
boot/powerpc/ieee1275/crt0.S boot/powerpc/ieee1275/crt0.S
commands/i386/pc/halt.c commands/i386/pc/halt.c
commands/i386/pc/reboot.c commands/i386/pc/reboot.c
commands/i386/pc/vbe_list_modes.c commands/i386/pc/vbeinfo.c
commands/i386/pc/vbe_test.c commands/i386/pc/vbetest.c
commands/ieee1275/halt.c commands/ieee1275/halt.c
commands/ieee1275/reboot.c commands/ieee1275/reboot.c
commands/ieee1275/suspend.c commands/ieee1275/suspend.c

View file

@ -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 <grub/normal.h>
#include <grub/dl.h>
#include <grub/arg.h>
#include <grub/env.h>
#include <grub/misc.h>
#include <grub/machine/init.h>
#include <grub/machine/vbe.h>
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");
}

163
commands/i386/pc/vbeinfo.c Normal file
View file

@ -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 <grub/normal.h>
#include <grub/dl.h>
#include <grub/arg.h>
#include <grub/env.h>
#include <grub/misc.h>
#include <grub/machine/init.h>
#include <grub/machine/vbe.h>
#include <grub/mm.h>
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");
}

View file

@ -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 * GRUB -- GRand Unified Bootloader
* Copyright (C) 2005 Free Software Foundation, Inc. * Copyright (C) 2005 Free Software Foundation, Inc.
@ -26,21 +26,14 @@
#include <grub/term.h> #include <grub/term.h>
#include <grub/machine/init.h> #include <grub/machine/init.h>
#include <grub/machine/vbe.h> #include <grub/machine/vbe.h>
#include <grub/err.h>
static void *
real2pm(grub_vbe_farptr_t ptr)
{
return (void *)((((unsigned long)ptr & 0xFFFF0000) >> 12UL)
+ ((unsigned long)ptr & 0x0000FFFF));
}
static grub_err_t 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)), int argc __attribute__ ((unused)),
char **args __attribute__ ((unused))) char **args __attribute__ ((unused)))
{ {
grub_uint32_t rc; grub_err_t err;
grub_uint16_t *sptr;
char *modevar; char *modevar;
struct grub_vbe_mode_info_block mode_info; struct grub_vbe_mode_info_block mode_info;
struct grub_vbe_info_block controller_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 ... "); grub_printf ("Probing for VESA BIOS Extension ... ");
/* Check if VESA BIOS exists. */ /* Check if VESA BIOS exists. */
rc = grub_vbe_probe(&controller_info); err = grub_vbe_probe (&controller_info);
if (rc != GRUB_ERR_NONE) if (err != GRUB_ERR_NONE)
{ return err;
grub_printf ("not found!\n");
return rc;
}
grub_printf ("found!\n"); grub_printf ("found!\n");
/* Dump out controller information. */ /* 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", grub_printf ("Total memory = %d\n",
controller_info.total_memory); controller_info.total_memory);
sptr = real2pm(controller_info.video_mode_ptr); err = grub_vbe_get_video_mode (&old_mode);
grub_printf ("Get video mode err = %04x\n", err);
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);
}
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. */ /* Check existence of vbe_mode environment variable. */
modevar = grub_env_get ("vbe_mode"); modevar = grub_env_get ("vbe_mode");
if (modevar != 0) if (modevar != 0)
{ {
unsigned long value = 0; unsigned long value;
if ((grub_strncmp (modevar, "0x", 2) == 0) || value = grub_strtoul (modevar, 0, 0);
(grub_strncmp (modevar, "0X", 2) == 0)) if (grub_errno == GRUB_ERR_NONE)
{ use_mode = value;
/* Convert HEX mode number. */
value = grub_strtoul (modevar + 2, 0, 16);
}
else else
{ grub_errno = GRUB_ERR_NONE;
/* Convert DEC mode number. */
value = grub_strtoul (modevar, 0, 10);
}
if (value != 0)
{
use_mode = value;
}
} }
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. */ /* Dump out details about the mode being tested. */
grub_printf ("mode: 0x%03x\n", grub_printf ("mode: 0x%03x\n",
use_mode); use_mode);
@ -144,10 +123,12 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
grub_getkey (); grub_getkey ();
/* Setup GFX mode. */ /* 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. */ /* 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; ptr = framebuffer;
if (controller_info.version >= 0x300) if (controller_info.version >= 0x300)
@ -179,21 +160,21 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
/* Restore old video mode. */ /* Restore old video mode. */
grub_vbe_set_video_mode (old_mode, 0); grub_vbe_set_video_mode (old_mode, 0);
return 0; return grub_errno;
} }
GRUB_MOD_INIT GRUB_MOD_INIT
{ {
(void)mod; /* To stop warning. */ (void) mod; /* To stop warning. */
grub_register_command ("vbe_test", grub_register_command ("vbetest",
grub_cmd_vbe_test, grub_cmd_vbetest,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"vbe_test", "vbetest",
"Test VESA BIOS Extension 2.0+ support", "Test VESA BIOS Extension 2.0+ support",
0); 0);
} }
GRUB_MOD_FINI GRUB_MOD_FINI
{ {
grub_unregister_command ("vbe_test"); grub_unregister_command ("vbetest");
} }

View file

@ -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 \ terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod \
apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod \ apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod \
help.mod default.mod timeout.mod configfile.mod vbe.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. # For _chain.mod.
_chain_mod_SOURCES = loader/i386/pc/chainloader.c _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) vesafb_mod_CFLAGS = $(COMMON_CFLAGS)
# For vbe_list_modes.mod. # For vbeinfo.mod.
vbe_list_modes_mod_SOURCES = commands/i386/pc/vbe_list_modes.c vbeinfo_mod_SOURCES = commands/i386/pc/vbeinfo.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 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 += vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d MOSTLYCLEANFILES += vbeinfo_mod-commands_i386_pc_vbeinfo.d
DEFSYMFILES += def-vbe_list_modes.lst DEFSYMFILES += def-vbeinfo.lst
UNDSYMFILES += und-vbe_list_modes.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 $@ -rm -f $@
$(LD) -r -d -o $@ $^ $(LD) -r -d -o $@ $^
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ $(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 $@ -rm -f $@
$(LD) -r -d -o $@ $^ $(LD) -r -d -o $@ $^
mod-vbe_list_modes.o: mod-vbe_list_modes.c mod-vbeinfo.o: mod-vbeinfo.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -c -o $@ $< $(CC) $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -c -o $@ $<
mod-vbe_list_modes.c: moddep.lst genmodsrc.sh mod-vbeinfo.c: moddep.lst genmodsrc.sh
sh $(srcdir)/genmodsrc.sh 'vbe_list_modes' $< > $@ || (rm -f $@; exit 1) sh $(srcdir)/genmodsrc.sh 'vbeinfo' $< > $@ || (rm -f $@; exit 1)
def-vbe_list_modes.lst: pre-vbe_list_modes.o def-vbeinfo.lst: pre-vbeinfo.o
$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbe_list_modes/' > $@ $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbeinfo/' > $@
und-vbe_list_modes.lst: pre-vbe_list_modes.o und-vbeinfo.lst: pre-vbeinfo.o
echo 'vbe_list_modes' > $@ echo 'vbeinfo' > $@
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@ $(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 vbeinfo_mod-commands_i386_pc_vbeinfo.o: commands/i386/pc/vbeinfo.c
$(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -c -o $@ $< $(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 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) $(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 $@ 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 CLEANFILES += cmd-vbeinfo.lst fs-vbeinfo.lst
COMMANDFILES += cmd-vbe_list_modes.lst COMMANDFILES += cmd-vbeinfo.lst
FSFILES += fs-vbe_list_modes.lst FSFILES += fs-vbeinfo.lst
cmd-vbe_list_modes.lst: commands/i386/pc/vbe_list_modes.c gencmdlist.sh cmd-vbeinfo.lst: commands/i386/pc/vbeinfo.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) 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 fs-vbeinfo.lst: commands/i386/pc/vbeinfo.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) 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. # For vbetest.mod.
vbe_test_mod_SOURCES = commands/i386/pc/vbe_test.c vbetest_mod_SOURCES = commands/i386/pc/vbetest.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 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 += vbe_test_mod-commands_i386_pc_vbe_test.d MOSTLYCLEANFILES += vbetest_mod-commands_i386_pc_vbetest.d
DEFSYMFILES += def-vbe_test.lst DEFSYMFILES += def-vbetest.lst
UNDSYMFILES += und-vbe_test.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 $@ -rm -f $@
$(LD) -r -d -o $@ $^ $(LD) -r -d -o $@ $^
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@ $(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 $@ -rm -f $@
$(LD) -r -d -o $@ $^ $(LD) -r -d -o $@ $^
mod-vbe_test.o: mod-vbe_test.c mod-vbetest.o: mod-vbetest.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -c -o $@ $< $(CC) $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -c -o $@ $<
mod-vbe_test.c: moddep.lst genmodsrc.sh mod-vbetest.c: moddep.lst genmodsrc.sh
sh $(srcdir)/genmodsrc.sh 'vbe_test' $< > $@ || (rm -f $@; exit 1) sh $(srcdir)/genmodsrc.sh 'vbetest' $< > $@ || (rm -f $@; exit 1)
def-vbe_test.lst: pre-vbe_test.o def-vbetest.lst: pre-vbetest.o
$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbe_test/' > $@ $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbetest/' > $@
und-vbe_test.lst: pre-vbe_test.o und-vbetest.lst: pre-vbetest.o
echo 'vbe_test' > $@ echo 'vbetest' > $@
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@ $(NM) -u -P -p $< | cut -f1 -d' ' >> $@
vbe_test_mod-commands_i386_pc_vbe_test.o: commands/i386/pc/vbe_test.c vbetest_mod-commands_i386_pc_vbetest.o: commands/i386/pc/vbetest.c
$(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -c -o $@ $< $(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 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) $(vbe_test_mod_CFLAGS) -M $< | sed 's,vbe_test\.o[ :]*,vbe_test_mod-commands_i386_pc_vbe_test.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ 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 CLEANFILES += cmd-vbetest.lst fs-vbetest.lst
COMMANDFILES += cmd-vbe_test.lst COMMANDFILES += cmd-vbetest.lst
FSFILES += fs-vbe_test.lst FSFILES += fs-vbetest.lst
cmd-vbe_test.lst: commands/i386/pc/vbe_test.c gencmdlist.sh cmd-vbetest.lst: commands/i386/pc/vbetest.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) 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 fs-vbetest.lst: commands/i386/pc/vbetest.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) 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 CLEANFILES += moddep.lst command.lst fs.lst
pkgdata_DATA += moddep.lst command.lst fs.lst pkgdata_DATA += moddep.lst command.lst fs.lst
moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep

View file

@ -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 \ terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod \
apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod \ apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod \
help.mod default.mod timeout.mod configfile.mod vbe.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. # For _chain.mod.
_chain_mod_SOURCES = loader/i386/pc/chainloader.c _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_SOURCES = term/i386/pc/vesafb.c
vesafb_mod_CFLAGS = $(COMMON_CFLAGS) vesafb_mod_CFLAGS = $(COMMON_CFLAGS)
# For vbe_list_modes.mod. # For vbeinfo.mod.
vbe_list_modes_mod_SOURCES = commands/i386/pc/vbe_list_modes.c vbeinfo_mod_SOURCES = commands/i386/pc/vbeinfo.c
vbe_list_modes_mod_CFLAGS = $(COMMON_CFLAGS) vbeinfo_mod_CFLAGS = $(COMMON_CFLAGS)
# For vbe_test.mod. # For vbetest.mod.
vbe_test_mod_SOURCES = commands/i386/pc/vbe_test.c vbetest_mod_SOURCES = commands/i386/pc/vbetest.c
vbe_test_mod_CFLAGS = $(COMMON_CFLAGS) vbetest_mod_CFLAGS = $(COMMON_CFLAGS)

View file

@ -23,6 +23,7 @@
#include <grub/fs.h> #include <grub/fs.h>
#include <grub/err.h> #include <grub/err.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/mm.h>
/* Print the information on the device NAME. */ /* Print the information on the device NAME. */
grub_err_t grub_err_t

View file

@ -71,70 +71,51 @@ grub_err_t
grub_vbe_probe (struct grub_vbe_info_block *info_block) grub_vbe_probe (struct grub_vbe_info_block *info_block)
{ {
struct grub_vbe_info_block *vbe_ib; struct grub_vbe_info_block *vbe_ib;
grub_uint32_t rc; grub_vbe_status_t status;
/* Clear caller's controller info block. */ /* Clear caller's controller info block. */
if (info_block != 0) if (info_block)
{ grub_memset (info_block, 0, sizeof (*info_block));
grub_memset (info_block, 0, sizeof(struct grub_vbe_info_block));
}
/* Do not probe more than one time. */ /* Do not probe more than one time, if not necessary. */
if (vbe_detected != -1) 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. */ /* Copy it for later usage. */
if (info_block != 0) grub_memcpy (&controller_info, vbe_ib, sizeof (controller_info));
{
grub_memcpy (info_block, /* Mark VESA BIOS extension as detected. */
&controller_info, vbe_detected = 1;
sizeof(struct grub_vbe_info_block));
}
return GRUB_ERR_NONE;
}
else
{
return GRUB_ERR_BAD_DEVICE;
} }
} }
/* Clear old copy of controller info block. */ if (! vbe_detected)
grub_memset (&controller_info, 0, sizeof(struct grub_vbe_info_block)); return grub_error (GRUB_ERR_BAD_DEVICE, "VESA BIOS Extension not found");
/* Mark VESA BIOS extension as undetected. */ /* Make copy of controller info block to caller. */
vbe_detected = 0; if (info_block)
grub_memcpy (info_block, &controller_info, sizeof (*info_block));
/* 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));
/* Mark VESA BIOS extension as detected. */
vbe_detected = 1;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
@ -143,20 +124,16 @@ grub_err_t
grub_vbe_set_video_mode (grub_uint32_t mode, grub_vbe_set_video_mode (grub_uint32_t mode,
struct grub_vbe_mode_info_block *mode_info) struct grub_vbe_mode_info_block *mode_info)
{ {
grub_uint32_t rc; grub_vbe_status_t status;
grub_uint32_t old_mode;
/* If grub_vesafb_probe has not been called or no VBE, abort. */
if (vbe_detected == 0) /* Make sure that VBE is supported. */
{ if (grub_vbe_probe (0) != GRUB_ERR_NONE)
return GRUB_ERR_BAD_DEVICE; return grub_errno;
}
/* Try to get mode info. */ /* Try to get mode info. */
rc = grub_vbe_get_video_mode_info (mode, &active_mode_info); if (grub_vbe_get_video_mode_info (mode, &active_mode_info) != GRUB_ERR_NONE)
if (rc != GRUB_ERR_NONE) return grub_errno;
{
return rc;
}
/* For all VESA BIOS modes, force linear frame buffer. */ /* For all VESA BIOS modes, force linear frame buffer. */
if (mode >= 0x100) if (mode >= 0x100)
@ -165,27 +142,31 @@ grub_vbe_set_video_mode (grub_uint32_t mode,
mode |= 1 << 14; mode |= 1 << 14;
/* Determine frame buffer pixel format. */ /* Determine frame buffer pixel format. */
switch(active_mode_info.memory_model) switch (active_mode_info.memory_model)
{ {
case 0x04: case 0x04:
index_color_mode = 1; index_color_mode = 1;
break; break;
case 0x06: case 0x06:
index_color_mode = 0; index_color_mode = 0;
break; break;
default: 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. */ /* Try to set video mode. */
rc = grub_vbe_set_mode (mode, 0); status = grub_vbe_set_mode (mode, 0);
if (rc != 0x004F) if (status != 0x004F)
{ return grub_error (GRUB_ERR_BAD_DEVICE, "cannot set VBE mode %x", mode);
return GRUB_ERR_BAD_DEVICE;
}
/* Save information for later usage. */ /* Save information for later usage. */
active_mode = mode; active_mode = mode;
@ -193,40 +174,43 @@ grub_vbe_set_video_mode (grub_uint32_t mode,
if (mode < 0x100) if (mode < 0x100)
{ {
/* If this is not a VESA mode, guess address. */ /* If this is not a VESA mode, guess address. */
framebuffer = (grub_uint8_t *)0xA0000; framebuffer = (grub_uint8_t *) 0xA0000;
index_color_mode = 1; index_color_mode = 1;
} }
else 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) 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 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 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); struct grub_vbe_palette_data *palette
if (rc != 0x004F) = (struct grub_vbe_palette_data *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
{
return GRUB_ERR_BAD_DEVICE; /* 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. */ /* Copy mode info for caller. */
if (mode_info != 0) if (mode_info)
{ grub_memcpy (mode_info, &active_mode_info, sizeof (*mode_info));
grub_memcpy (mode_info,
&active_mode_info,
sizeof(struct grub_vbe_mode_info_block));
}
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
@ -234,20 +218,16 @@ grub_vbe_set_video_mode (grub_uint32_t mode,
grub_err_t grub_err_t
grub_vbe_get_video_mode (grub_uint32_t *mode) 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. */ /* Make sure that VBE is supported. */
if (vbe_detected == 0) if (grub_vbe_probe (0) != GRUB_ERR_NONE)
{ return grub_errno;
return GRUB_ERR_BAD_DEVICE;
}
/* Try to query current mode from VESA BIOS. */ /* Try to query current mode from VESA BIOS. */
rc = grub_vbe_get_mode (mode); status = grub_vbe_get_mode (mode);
if (rc != 0x004F) if (status != 0x004F)
{ return grub_error (GRUB_ERR_BAD_DEVICE, "cannot get current VBE mode");
return GRUB_ERR_BAD_DEVICE;
}
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
@ -256,37 +236,29 @@ grub_err_t
grub_vbe_get_video_mode_info (grub_uint32_t mode, grub_vbe_get_video_mode_info (grub_uint32_t mode,
struct grub_vbe_mode_info_block *mode_info) 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; struct grub_vbe_mode_info_block *mi_tmp
grub_uint32_t rc; = (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. */ /* Make sure that VBE is supported. */
if (vbe_detected == 0) if (grub_vbe_probe (0) != GRUB_ERR_NONE)
{ return grub_errno;
return GRUB_ERR_BAD_DEVICE;
}
/* If mode is not VESA mode, skip mode info query. */ /* If mode is not VESA mode, skip mode info query. */
if (mode >= 0x100) if (mode >= 0x100)
{ {
/* Try to get mode info from VESA BIOS. */ /* Try to get mode info from VESA BIOS. */
rc = grub_vbe_get_mode_info (mode, mi_tmp); status = grub_vbe_get_mode_info (mode, mi_tmp);
if (rc != 0x004F) if (status != 0x004F)
{ return grub_error (GRUB_ERR_BAD_DEVICE,
return GRUB_ERR_BAD_DEVICE; "cannot get information on the mode %x", mode);
}
/* Make copy of mode info block. */ /* Make copy of mode info block. */
grub_memcpy (mode_info, grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info));
mi_tmp,
sizeof(struct grub_vbe_mode_info_block));
} }
else else
{ /* Just clear mode info block if it isn't a VESA mode. */
/* Just clear mode info block if it isn't a VESA mode. */ grub_memset (mode_info, 0, sizeof (*mode_info));
grub_memset (mode_info,
0,
sizeof(struct grub_vbe_mode_info_block));
}
return GRUB_ERR_NONE; 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; 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 case 32:
+ y * bytes_per_scan_line {
+ x * 4); 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;
*ptr = value; case 16:
} case 15:
else if (active_mode_info.bits_per_pixel == 24) {
{ grub_uint16_t *ptr = (grub_uint16_t *) (framebuffer
grub_uint8_t *ptr = (grub_uint8_t *)(framebuffer + y * bytes_per_scan_line
+ y * bytes_per_scan_line + x * 2);
+ x * 3);
grub_uint8_t *ptr2 = (grub_uint8_t *)&value; *ptr = (grub_uint16_t) (value & 0xFFFF);
}
break;
ptr[0] = ptr2[0]; default:
ptr[1] = ptr2[1]; break;
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);
} }
} }
@ -370,16 +353,16 @@ grub_vbe_set_pixel_index (grub_uint32_t x,
if (index_color_mode == 1) if (index_color_mode == 1)
{ {
grub_uint8_t *ptr = (grub_uint8_t *)(framebuffer grub_uint8_t *ptr = (grub_uint8_t *) (framebuffer
+ y * bytes_per_scan_line + y * bytes_per_scan_line
+ x); + x);
*ptr = color; *ptr = color;
} }
else else
{ {
color &= 0x0F; color &= 0x0F;
if (color < 16) if (color < 16)
{ {
grub_vbe_set_pixel_rgb (x, grub_vbe_set_pixel_rgb (x,
@ -396,5 +379,5 @@ grub_vbe_set_pixel_index (grub_uint32_t x,
0, 0,
0); 0);
} }
} }
} }