From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NVR6w-0005HK-8z for mharc-grub-devel@gnu.org; Thu, 14 Jan 2010 09:55:46 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NVR6t-0005Ff-6x for grub-devel@gnu.org; Thu, 14 Jan 2010 09:55:43 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NVR6o-0005DQ-2a for grub-devel@gnu.org; Thu, 14 Jan 2010 09:55:42 -0500 Received: from [199.232.76.173] (port=59688 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NVR6n-0005DF-Oy for grub-devel@gnu.org; Thu, 14 Jan 2010 09:55:37 -0500 Received: from fg-out-1718.google.com ([72.14.220.159]:35959) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NVR6m-0005ER-Nj for grub-devel@gnu.org; Thu, 14 Jan 2010 09:55:37 -0500 Received: by fg-out-1718.google.com with SMTP id e21so67667fga.12 for ; Thu, 14 Jan 2010 06:55:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:x-enigmail-version:content-type; bh=JDFYNEAsj6fISvlcO8w7WfHTPpWWNQi8SiMEWnPaJ0I=; b=Pm1iyTuZctVH1/oFlJ0URJygFCTTfxCrTj0CxeRhe4lXR6CCw45soED2s+8V1qpw8+ 79F3gXKgpb29XPUUGFE6CF0jUnPjkVqdUZtTdLa6W0JrX0YPt5DDB4VWGIUrP4c/vrup pfgwGonSAZdXjcO1OwOO6N2M0TOluRAMqnR2o= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :x-enigmail-version:content-type; b=vrYD2N46IELyZix8V4ol5844/NtKz00xCnxN2PpYjGfND/6Ms0qKX9lAQdxHBjUjwG O/QoK+Q6/BBO15GLEicQvh0k+5DkieU+1APl/LMDqbvxbVSXazfFVtPp6zESzT9MOGA6 GpB168HCgEcS7VyEakp1rYMImykNy2LZqNaFQ= Received: by 10.87.73.15 with SMTP id a15mr1230202fgl.5.1263480935044; Thu, 14 Jan 2010 06:55:35 -0800 (PST) Received: from debian.bg45.phnet (125-115.203-62.cust.bluewin.ch [62.203.115.125]) by mx.google.com with ESMTPS id e3sm7812944fga.11.2010.01.14.06.55.31 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 14 Jan 2010 06:55:33 -0800 (PST) Message-ID: <4B4F305D.3080200@gmail.com> Date: Thu, 14 Jan 2010 15:55:25 +0100 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20091109) MIME-Version: 1.0 To: The development of GRUB 2 X-Enigmail-Version: 0.95.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="------------enig55D71AB07118AF697571FD33" X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [PATCH] Multiboot video support X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jan 2010 14:55:43 -0000 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig55D71AB07118AF697571FD33 Content-Type: multipart/mixed; boundary="------------030300020805030204070309" This is a multi-part message in MIME format. --------------030300020805030204070309 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable --=20 Regards Vladimir '=CF=86-coder/phcoder' Serbinenko --------------030300020805030204070309 Content-Type: text/x-diff; name="mbivid.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename="mbivid.diff" =3D=3D=3D added file 'ChangeLog.mbivid' --- ChangeLog.mbivid 1970-01-01 00:00:00 +0000 +++ ChangeLog.mbivid 2010-01-14 14:44:14 +0000 @@ -0,0 +1,24 @@ +2010-01-14 Vladimir Serbinenko + + Video multiboot support. + + * include/grub/multiboot.h (grub_multiboot_set_accepts_video): + New prototype. + * include/grub/video.h (grub_video_driver_id): New type. + (grub_video_adapter): New member 'id'. All users updated. + (grub_video_get_driver_id): New proto. + * include/multiboot.h: Resynced with multiboot specification. + * include/multiboot2.h: Likewise. + * loader/i386/multiboot.c (UNSUPPORTED_FLAGS): Support video flags. + (grub_multiboot): Parse MULTIBOOT_VIDEO_MODE fields. + * loader/i386/multiboot_mbi.c (DEFAULT_VIDEO_MODE): New constant. + (HAS_VGA_TEXT): Likewise. + (HAS_VBE): Likewise. + (accepts_video): New variable. + (grub_multiboot_set_accepts_video): New function. + (grub_multiboot_get_mbi_size): Account for video structures. + (set_video_mode): New function. + (fill_vbe_info) [HAS_VBE]: Likewise. + (retrieve_video_parameters): Likewise. + (grub_multiboot_make_mbi): Fill video fields. + * video/video.c (grub_video_get_driver_id): New function. =3D=3D=3D modified file 'include/grub/multiboot.h' --- include/grub/multiboot.h 2010-01-10 17:58:18 +0000 +++ include/grub/multiboot.h 2010-01-14 14:26:47 +0000 @@ -35,6 +35,8 @@ void grub_multiboot (int argc, char *argv[]); void grub_module (int argc, char *argv[]); =20 +void grub_multiboot_set_accepts_video (int val); + grub_size_t grub_multiboot_get_mbi_size (void); grub_err_t grub_multiboot_make_mbi (void *orig, grub_uint32_t dest, grub_off_t buf_off, grub_size_t bufsize); =3D=3D=3D modified file 'include/grub/video.h' --- include/grub/video.h 2009-08-14 12:41:58 +0000 +++ include/grub/video.h 2010-01-14 14:22:33 +0000 @@ -159,10 +159,19 @@ grub_uint8_t a; /* Reserved bits value (0-255). */ }; =20 +typedef enum grub_video_driver_id + { + GRUB_VIDEO_DRIVER_NONE, + GRUB_VIDEO_DRIVER_VBE, + GRUB_VIDEO_DRIVER_EFI_UGA, + GRUB_VIDEO_DRIVER_EFI_GOP + } grub_video_driver_id_t; + struct grub_video_adapter { /* The video adapter name. */ const char *name; + grub_video_driver_id_t id; =20 /* Initialize the video adapter. */ grub_err_t (*init) (void); @@ -310,4 +319,7 @@ int NESTED_FUNC_ATTR (*hook) (grub_video_adapter_t p, struct grub_video_mode_info *mode_info)); =20 +grub_video_driver_id_t +grub_video_get_driver_id (void); + #endif /* ! GRUB_VIDEO_HEADER */ =3D=3D=3D modified file 'include/multiboot.h' --- include/multiboot.h 2010-01-07 19:55:16 +0000 +++ include/multiboot.h 2010-01-14 14:22:27 +0000 @@ -85,10 +85,12 @@ #define MULTIBOOT_INFO_APM_TABLE 0x00000400 =20 /* Is there video information? */ -#define MULTIBOOT_INFO_VIDEO_INFO 0x00000800 +#define MULTIBOOT_INFO_VBE_INFO 0x00000800 +#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000 =20 #ifndef ASM_FILE =20 +typedef unsigned char multiboot_uint8_t; typedef unsigned short multiboot_uint16_t; typedef unsigned int multiboot_uint32_t; typedef unsigned long long multiboot_uint64_t; @@ -187,9 +189,43 @@ multiboot_uint16_t vbe_interface_seg; multiboot_uint16_t vbe_interface_off; multiboot_uint16_t vbe_interface_len; + + multiboot_uint64_t framebuffer_addr; + multiboot_uint32_t framebuffer_pitch; + multiboot_uint32_t framebuffer_width; + multiboot_uint32_t framebuffer_height; + multiboot_uint8_t framebuffer_bpp; + multiboot_uint8_t framebuffer_type; + union + { + struct + { + multiboot_uint32_t framebuffer_palette_addr; + multiboot_uint16_t framebuffer_palette_num_colors; + }; + struct + { + multiboot_uint8_t framebuffer_red_field_position; + multiboot_uint8_t framebuffer_red_mask_size; + multiboot_uint8_t framebuffer_green_field_position; + multiboot_uint8_t framebuffer_green_mask_size; + multiboot_uint8_t framebuffer_blue_field_position; + multiboot_uint8_t framebuffer_blue_mask_size; + }; + }; }; typedef struct multiboot_info multiboot_info_t; =20 +struct multiboot_color +{ + multiboot_uint8_t red; + multiboot_uint8_t green; + multiboot_uint8_t blue; +}; + +#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 +#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 + struct multiboot_mmap_entry { multiboot_uint32_t size; =3D=3D=3D modified file 'include/multiboot2.h' --- include/multiboot2.h 2010-01-07 21:05:25 +0000 +++ include/multiboot2.h 2010-01-14 14:22:27 +0000 @@ -85,10 +85,12 @@ #define MULTIBOOT_INFO_APM_TABLE 0x00000400 =20 /* Is there video information? */ -#define MULTIBOOT_INFO_VIDEO_INFO 0x00000800 +#define MULTIBOOT_INFO_VBE_INFO 0x00000800 +#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000 =20 #ifndef ASM_FILE =20 +typedef unsigned char multiboot_uint8_t; typedef unsigned short multiboot_uint16_t; typedef unsigned int multiboot_uint32_t; typedef unsigned long long multiboot_uint64_t; @@ -187,9 +189,43 @@ multiboot_uint16_t vbe_interface_seg; multiboot_uint16_t vbe_interface_off; multiboot_uint16_t vbe_interface_len; + + multiboot_uint64_t framebuffer_addr; + multiboot_uint32_t framebuffer_pitch; + multiboot_uint32_t framebuffer_width; + multiboot_uint32_t framebuffer_height; + multiboot_uint8_t framebuffer_bpp; + multiboot_uint8_t framebuffer_type; + union + { + struct + { + multiboot_uint32_t framebuffer_palette_addr; + multiboot_uint16_t framebuffer_palette_num_colors; + }; + struct + { + multiboot_uint8_t framebuffer_red_field_position; + multiboot_uint8_t framebuffer_red_mask_size; + multiboot_uint8_t framebuffer_green_field_position; + multiboot_uint8_t framebuffer_green_mask_size; + multiboot_uint8_t framebuffer_blue_field_position; + multiboot_uint8_t framebuffer_blue_mask_size; + }; + }; }; typedef struct multiboot_info multiboot_info_t; =20 +struct multiboot_color +{ + multiboot_uint8_t red; + multiboot_uint8_t green; + multiboot_uint8_t blue; +}; + +#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 +#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 + struct multiboot_mmap_entry { multiboot_uint32_t size; =3D=3D=3D modified file 'loader/i386/multiboot.c' --- loader/i386/multiboot.c 2010-01-12 18:47:02 +0000 +++ loader/i386/multiboot.c 2010-01-14 14:22:27 +0000 @@ -20,7 +20,6 @@ /* * FIXME: The following features from the Multiboot specification still= * need to be implemented: - * - VBE support * - symbol table * - drives table * - ROM configuration table @@ -28,13 +27,11 @@ */ =20 /* The bits in the required part of flags field we don't support. */ -#define UNSUPPORTED_FLAGS 0x0000fffc +#define UNSUPPORTED_FLAGS 0x0000fff8 =20 #include #include #include -#include -#include #include #include #include @@ -232,6 +229,34 @@ else if (grub_multiboot_load_elf (file, buffer) !=3D GRUB_ERR_NONE) goto fail; =20 + if (header->flags & MULTIBOOT_VIDEO_MODE) + { + switch (header->mode_type) + { + case 1: + grub_env_set ("gfxpayload", "text"); + break; + + case 0: + { + char buf[sizeof ("XXXXXXXXXXxXXXXXXXXXXxXXXXXXXXXX,XXXXXXXXXXxXXXXX= XXXXX,auto")]; + if (header->depth && header->width && header->height) + grub_sprintf (buf, "%dx%dx%d,%dx%d,auto", header->width, + header->height, header->depth, header->width, + header->height); + else if (header->width && header->height) + grub_sprintf (buf, "%dx%d,auto", header->width, header->height); + else + grub_sprintf (buf, "auto"); + + grub_env_set ("gfxpayload", buf); + break; + } + } + } + + grub_multiboot_set_accepts_video (!!(header->flags & MULTIBOOT_VIDEO_M= ODE)); + grub_multiboot_set_bootdev (); =20 grub_loader_set (grub_multiboot_boot, grub_multiboot_unload, 0); =3D=3D=3D modified file 'loader/i386/multiboot_mbi.c' --- loader/i386/multiboot_mbi.c 2010-01-10 17:58:18 +0000 +++ loader/i386/multiboot_mbi.c 2010-01-14 14:29:26 +0000 @@ -29,6 +29,18 @@ #include #include #include +#include + +#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || = defined (GRUB_MACHINE_QEMU) +#include +#define DEFAULT_VIDEO_MODE "text" +#define HAS_VGA_TEXT 1 +#define HAS_VBE 1 +#else +#define DEFAULT_VIDEO_MODE "auto" +#define HAS_VGA_TEXT 0 +#define HAS_VBE 0 +#endif =20 struct module { @@ -46,6 +58,13 @@ static char *cmdline =3D NULL; static grub_uint32_t bootdev; static int bootdev_set; +static int accepts_video; + +void +grub_multiboot_set_accepts_video (int val) +{ + accepts_video =3D val; +} =20 /* Return the length of the Multiboot mmap that will be needed to alloca= te our platform's map. */ @@ -73,7 +92,12 @@ { return sizeof (struct multiboot_info) + ALIGN_UP (cmdline_size, 4) + modcnt * sizeof (struct multiboot_mod_list) + total_modcmd - + ALIGN_UP (sizeof(PACKAGE_STRING), 4) + grub_get_multiboot_mmap_len= (); + + ALIGN_UP (sizeof(PACKAGE_STRING), 4) + grub_get_multiboot_mmap_len= () +#if HAS_VBE + + sizeof (struct grub_vbe_info_block) + + sizeof (struct grub_vbe_mode_info_block) +#endif + + 256 * sizeof (struct multiboot_color); } =20 /* Fill previously allocated Multiboot mmap. */ @@ -106,6 +130,160 @@ grub_mmap_iterate (hook); } =20 +static grub_err_t +set_video_mode (void) +{ + grub_err_t err; + const char *modevar; + + if (accepts_video || !HAS_VGA_TEXT) + { + modevar =3D grub_env_get ("gfxpayload"); + if (! modevar || *modevar =3D=3D 0) + err =3D grub_video_set_mode (DEFAULT_VIDEO_MODE, 0); + else + { + char *tmp; + tmp =3D grub_malloc (grub_strlen (modevar) + + sizeof (DEFAULT_VIDEO_MODE) + 1); + if (! tmp) + return grub_errno; + grub_sprintf (tmp, "%s;" DEFAULT_VIDEO_MODE, modevar); + err =3D grub_video_set_mode (tmp, 0); + grub_free (tmp); + } + } + else + err =3D grub_video_set_mode ("text", 0); + + return err; +} + +#if HAS_VBE +static grub_err_t +fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig, + grub_uint32_t ptrdest) +{ + grub_vbe_status_t status; + grub_uint32_t vbe_mode; + void *scratch =3D (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; + =20 + status =3D grub_vbe_bios_get_controller_info (scratch); + if (status !=3D GRUB_VBE_STATUS_OK) + return grub_error (GRUB_ERR_IO, "Can't get controller info."); + =20 + mbi->vbe_control_info =3D ptrdest; + grub_memcpy (ptrorig, scratch, sizeof (struct grub_vbe_info_block)); + ptrorig +=3D sizeof (struct grub_vbe_info_block); + ptrdest +=3D sizeof (struct grub_vbe_info_block); + =20 + status =3D grub_vbe_bios_get_mode (scratch); + vbe_mode =3D *(grub_uint32_t *) scratch; + if (status !=3D GRUB_VBE_STATUS_OK) + return grub_error (GRUB_ERR_IO, "Can't get VBE mode."); + mbi->vbe_mode =3D vbe_mode; + + status =3D grub_vbe_bios_get_mode_info (vbe_mode, scratch); + if (status !=3D GRUB_VBE_STATUS_OK) + return grub_error (GRUB_ERR_IO, "Can't get mode info."); + mbi->vbe_mode_info =3D ptrdest; + grub_memcpy (ptrorig, scratch, sizeof (struct grub_vbe_mode_info_block= )); + ptrorig +=3D sizeof (struct grub_vbe_mode_info_block); + ptrdest +=3D sizeof (struct grub_vbe_mode_info_block); + =20 + /* FIXME: retrieve those. */ + mbi->vbe_interface_seg =3D 0; + mbi->vbe_interface_off =3D 0; + mbi->vbe_interface_len =3D 0; + =20 + mbi->flags |=3D MULTIBOOT_INFO_VBE_INFO; + + return GRUB_ERR_NONE; +} +#endif + +static grub_err_t +retrieve_video_parameters (struct multiboot_info *mbi, + grub_uint8_t *ptrorig, grub_uint32_t ptrdest) +{ + grub_err_t err; + struct grub_video_mode_info mode_info; + void *framebuffer; +#if HAS_VBE + int vbe_active; +#endif + struct grub_video_palette_data palette[256]; + + err =3D set_video_mode (); + if (err) + return err; + + grub_video_get_palette (0, ARRAY_SIZE (palette), palette); + +#if HAS_VBE + { + grub_video_driver_id_t driv_id; + driv_id =3D grub_video_get_driver_id (); + =20 + vbe_active =3D ((driv_id =3D=3D GRUB_VIDEO_DRIVER_VBE) + || ((driv_id =3D=3D GRUB_VIDEO_DRIVER_NONE) && HAS_VGA_TEXT)); + } +#endif + + err =3D grub_video_get_info_and_fini (&mode_info, &framebuffer); + if (err) + return err; + + mbi->framebuffer_addr =3D (grub_addr_t) framebuffer; + mbi->framebuffer_pitch =3D mode_info.pitch; + + mbi->framebuffer_width =3D mode_info.width; + mbi->framebuffer_height =3D mode_info.height; + + mbi->framebuffer_bpp =3D mode_info.bpp; + =20 + if (mode_info.mode_type & GRUB_VIDEO_MODE_TYPE_INDEX_COLOR) + { + struct multiboot_color *mb_palette; + unsigned i; + mbi->framebuffer_type =3D MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED; + mbi->framebuffer_palette_addr =3D ptrdest; + mbi->framebuffer_palette_num_colors =3D mode_info.number_of_colors= ; + if (mbi->framebuffer_palette_num_colors > ARRAY_SIZE (palette)) + mbi->framebuffer_palette_num_colors =3D ARRAY_SIZE (palette); + mb_palette =3D (struct multiboot_color *) ptrorig; + for (i =3D 0; i < mbi->framebuffer_palette_num_colors; i++) + { + mb_palette[i].red =3D palette[i].r; + mb_palette[i].green =3D palette[i].g; + mb_palette[i].blue =3D palette[i].b; + } + ptrorig +=3D mbi->framebuffer_palette_num_colors + * sizeof (struct multiboot_color); + ptrdest +=3D mbi->framebuffer_palette_num_colors + * sizeof (struct multiboot_color); + } + else + { + mbi->framebuffer_type =3D MULTIBOOT_FRAMEBUFFER_TYPE_RGB; + mbi->framebuffer_red_field_position =3D mode_info.green_field_pos;= + mbi->framebuffer_red_mask_size =3D mode_info.green_mask_size; + mbi->framebuffer_green_field_position =3D mode_info.green_field_po= s; + mbi->framebuffer_green_mask_size =3D mode_info.green_mask_size; + mbi->framebuffer_blue_field_position =3D mode_info.blue_field_pos;= + mbi->framebuffer_blue_mask_size =3D mode_info.blue_mask_size; + } + + mbi->flags |=3D MULTIBOOT_INFO_FRAMEBUFFER_INFO; + +#if HAS_VBE + if (vbe_active) + fill_vbe_info (mbi, ptrorig, ptrdest); +#endif + + return GRUB_ERR_NONE; +} + grub_err_t grub_multiboot_make_mbi (void *orig, grub_uint32_t dest, grub_off_t buf_= off, grub_size_t bufsize) @@ -117,6 +295,7 @@ unsigned i; struct module *cur; grub_size_t mmap_size; + grub_err_t err; =20 if (bufsize < grub_multiboot_get_mbi_size ()) return grub_error (GRUB_ERR_OUT_OF_MEMORY, "mbi buffer is too small"= ); @@ -182,6 +361,19 @@ mbi->flags |=3D MULTIBOOT_INFO_BOOTDEV; } =20 + err =3D retrieve_video_parameters (mbi, ptrorig, ptrdest); + if (err) + { + grub_print_error (); + grub_errno =3D GRUB_ERR_NONE; + } +#if HAS_VBE + ptrorig +=3D sizeof (struct grub_vbe_info_block); + ptrdest +=3D sizeof (struct grub_vbe_info_block); + ptrorig +=3D sizeof (struct grub_vbe_mode_info_block); + ptrdest +=3D sizeof (struct grub_vbe_mode_info_block); +#endif + return GRUB_ERR_NONE; } =20 =3D=3D=3D modified file 'video/efi_gop.c' --- video/efi_gop.c 2009-12-24 22:53:05 +0000 +++ video/efi_gop.c 2010-01-14 14:22:33 +0000 @@ -353,6 +353,7 @@ static struct grub_video_adapter grub_video_gop_adapter =3D { .name =3D "EFI GOP driver", + .id =3D GRUB_VIDEO_DRIVER_EFI_GOP, =20 .init =3D grub_video_gop_init, .fini =3D grub_video_gop_fini, =3D=3D=3D modified file 'video/efi_uga.c' --- video/efi_uga.c 2009-12-24 22:53:05 +0000 +++ video/efi_uga.c 2010-01-14 14:22:33 +0000 @@ -300,6 +300,7 @@ static struct grub_video_adapter grub_video_uga_adapter =3D { .name =3D "EFI UGA driver", + .id =3D GRUB_VIDEO_DRIVER_EFI_UGA, =20 .init =3D grub_video_uga_init, .fini =3D grub_video_uga_fini, =3D=3D=3D modified file 'video/i386/pc/vbe.c' --- video/i386/pc/vbe.c 2009-12-24 22:53:05 +0000 +++ video/i386/pc/vbe.c 2010-01-14 14:22:33 +0000 @@ -557,6 +557,7 @@ static struct grub_video_adapter grub_video_vbe_adapter =3D { .name =3D "VESA BIOS Extension Video Driver", + .id =3D GRUB_VIDEO_DRIVER_VBE, =20 .init =3D grub_video_vbe_init, .fini =3D grub_video_vbe_fini, =3D=3D=3D modified file 'video/video.c' --- video/video.c 2009-12-24 22:53:05 +0000 +++ video/video.c 2010-01-14 14:22:33 +0000 @@ -93,6 +93,14 @@ return grub_video_adapter_active->get_info (mode_info); } =20 +grub_video_driver_id_t +grub_video_get_driver_id (void) +{ + if (! grub_video_adapter_active) + return GRUB_VIDEO_DRIVER_NONE; + return grub_video_adapter_active->id; +} + /* Get information about active video mode. */ grub_err_t grub_video_get_info_and_fini (struct grub_video_mode_info *mode_info, --------------030300020805030204070309-- --------------enig55D71AB07118AF697571FD33 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iF4EAREKAAYFAktPMGMACgkQNak7dOguQgm74QD/RFBRwx9aSUJ5Noebe+rejI/4 gEXm98cFACXYglqs47YBAJr9S5j/N44R/bnzBBU4OhngA/g9JdEGYKLjb/+oDogC =HlQt -----END PGP SIGNATURE----- --------------enig55D71AB07118AF697571FD33--