All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vesa Jääskeläinen" <chaac@nic.fi>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: [PATCH] Kernel support for VESA Bios Extension
Date: Thu, 14 Jul 2005 21:36:59 +0300	[thread overview]
Message-ID: <42D6B0CB.9070208@nic.fi> (raw)

[-- Attachment #1: Type: text/plain, Size: 762 bytes --]

Hi,

Here is attached a patch that adds VBE support to kernel and include 
file to make it easier to use it. There is diff for both i386-pc.rmk and 
  i386-pc.mk. Latter could be removed and let build process to generate 
it again, but I think that .mk file is present in CVS so I left both there.

I will make separate patch for the frame buffer console after this is 
first committed. (And I need to make some cleanups there first)

I would like to hear comments about the patch. I tried to implement most 
commonly needed functions, so you can't do everything with this. As I 
didn't need to use every function in my frame buffer console test, some 
things might not work. But I tried to make my best to proof read every 
function.

Thanks,
Vesa Jääskeläinen

[-- Attachment #2: grub2_i386_vbe.diff --]
[-- Type: text/plain, Size: 20047 bytes --]

diff -ruN grub2/ChangeLog grub2.vbe/ChangeLog
--- grub2/ChangeLog	2005-07-13 01:36:43.000000000 +0300
+++ grub2.vbe/ChangeLog	2005-07-16 15:07:01.132381816 +0300
@@ -1,3 +1,21 @@
+2005-07-14  Vesa Jaaskelainen  <chaac@nic.fi>
+
+	* conf/i386-pc.rmk (kernel_img_HEADERS): Added machine/vbe.h.
+	* kern/i386/pc/startup.S: Updated Global Descriptor table's
+	descriptions.
+	(grub_vbe_get_controller_info): New function.
+	(grub_vbe_get_mode_info): Likewise.
+	(grub_vbe_set_mode): Likewise.
+	(grub_vbe_get_mode): Likewise.
+	(grub_vbe_set_memory_window): Likewise.
+	(grub_vbe_get_memory_window): Likewise.
+	(grub_vbe_set_scanline_length): Likewise.
+	(grub_vbe_get_scanline_length): Likewise.
+	(grub_vbe_set_display_start): Likewise.
+	(grub_vbe_get_display_start): Likewise.
+	(grub_vbe_set_palette_data): Likewise.
+	* include/grub/i386/pc/vbe.h: New file.
+
 2005-07-12  Hollis Blanchard  <hollis@penguinppc.org>
 
 	* disk/powerpc/ieee1275/ofdisk.c (grub_ofdisk_open): dprintf the
diff -ruN grub2/conf/i386-pc.mk grub2.vbe/conf/i386-pc.mk
--- grub2/conf/i386-pc.mk	2005-07-10 10:57:49.000000000 +0300
+++ grub2.vbe/conf/i386-pc.mk	2005-07-15 18:10:46.000000000 +0300
@@ -253,7 +253,8 @@
 	file.h fs.h kernel.h loader.h misc.h mm.h net.h rescue.h symbol.h \
 	term.h types.h machine/biosdisk.h machine/boot.h \
 	machine/console.h machine/init.h machine/memory.h \
-	machine/loader.h partition.h pc_partition.h machine/time.h machine/vga.h
+	machine/loader.h partition.h pc_partition.h machine/time.h machine/vga.h \
+	machine/vbe.h
 kernel_img_CFLAGS = $(COMMON_CFLAGS)
 kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
 kernel_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8200
diff -ruN grub2/conf/i386-pc.rmk grub2.vbe/conf/i386-pc.rmk
--- grub2/conf/i386-pc.rmk	2005-07-10 10:57:49.000000000 +0300
+++ grub2.vbe/conf/i386-pc.rmk	2005-07-15 18:10:05.000000000 +0300
@@ -33,7 +33,8 @@
 	file.h fs.h kernel.h loader.h misc.h mm.h net.h rescue.h symbol.h \
 	term.h types.h machine/biosdisk.h machine/boot.h \
 	machine/console.h machine/init.h machine/memory.h \
-	machine/loader.h partition.h pc_partition.h machine/time.h machine/vga.h
+	machine/loader.h partition.h pc_partition.h machine/time.h machine/vga.h \
+	machine/vbe.h
 kernel_img_CFLAGS = $(COMMON_CFLAGS)
 kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
 kernel_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8200
Files grub2/core.img and grub2.vbe/core.img differ
diff -ruN grub2/device.map grub2.vbe/device.map
--- grub2/device.map	1970-01-01 02:00:00.000000000 +0200
+++ grub2.vbe/device.map	2005-07-16 15:03:23.520463856 +0300
@@ -0,0 +1 @@
+(fd0)	/dev/fd0
diff -ruN grub2/include/grub/i386/pc/vbe.h grub2.vbe/include/grub/i386/pc/vbe.h
--- grub2/include/grub/i386/pc/vbe.h	1970-01-01 02:00:00.000000000 +0200
+++ grub2.vbe/include/grub/i386/pc/vbe.h	2005-07-15 18:29:01.000000000 +0300
@@ -0,0 +1,161 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; 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 this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef GRUB_VBE_MACHINE_HEADER
+#define GRUB_VBE_MACHINE_HEADER	1
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+
+typedef grub_uint32_t 	grub_vbe_farptr_t;
+typedef grub_uint32_t	grub_vbe_physptr_t;
+typedef grub_uint32_t	grub_vbe_status_t;
+
+struct grub_vbe_info_block_t {
+  grub_uint8_t 		signature[4];		// 'VESA'
+  grub_uint16_t		version;     		// VBE version BCD, for used standard: 0x0300 (3.0)
+
+  grub_vbe_farptr_t 	oem_string_ptr;   	// Pointer to OEM string
+  grub_uint32_t 	capabilities;   	//
+  grub_vbe_farptr_t 	video_mode_ptr;   	// Pointer to VideoModeList
+  grub_uint16_t		total_memory;    	// Number of 64k memory blocks
+
+  grub_uint16_t		oem_software_rev;	// VBE implementation software version
+  grub_vbe_farptr_t    	oem_vendor_name_ptr;	// Pointer to Vendor Name String
+  grub_vbe_farptr_t    	oem_product_name_ptr;	// Pointer to Product Name String
+  grub_vbe_farptr_t    	oem_product_rev_ptr;	// Pointer to Product Revision String
+
+  grub_uint8_t 		reserved[222];
+
+  grub_uint8_t 		oem_data[256];		// OEM Strings should reside here
+} __attribute__ ((packed));
+
+struct grub_vbe_mode_info_block_t {
+  // Mandory information for all VBE revisions
+  grub_uint16_t		mode_attributes;	// Mode attributes
+  grub_uint8_t		win_a_attributes;	// Window A attributes
+  grub_uint8_t		win_b_attributes;	// Window B attributes
+  grub_uint16_t		win_granularity;	// Window granularity
+  grub_uint16_t		win_size;		// Window size
+  grub_uint16_t		win_a_segment;		// Window A start segment
+  grub_uint16_t		win_b_segment;		// Window B start segment
+  grub_vbe_farptr_t	win_func_ptr;		// Real mode pointer to window function
+  grub_uint16_t		bytes_per_scan_line;	// Bytes per scan line
+
+  // Mandory information for VBE 1.2 and above
+  grub_uint16_t		x_resolution;
+  grub_uint16_t		y_resolution;
+  grub_uint8_t		x_char_size;
+  grub_uint8_t		y_char_size;
+  grub_uint8_t		number_of_planes;
+  grub_uint8_t		bits_per_pixel;
+  grub_uint8_t		number_of_banks;
+  grub_uint8_t		memory_model;
+  grub_uint8_t		bank_size;
+  grub_uint8_t		number_of_image_pages;
+  grub_uint8_t		reserved;
+
+  // Direct Color fields (required for direct/6 and YUV/7 memory models)
+  grub_uint8_t		red_mask_size;
+  grub_uint8_t		red_field_position;
+  grub_uint8_t		green_mask_size;
+  grub_uint8_t		green_field_position;
+  grub_uint8_t		blue_mask_size;
+  grub_uint8_t		blue_field_position;
+  grub_uint8_t		rsvd_mask_size;
+  grub_uint8_t		rsvd_field_position;
+  grub_uint8_t		direct_color_mode_info;
+
+  // Mandory information for VBE 2.0 and above
+  grub_vbe_physptr_t	phys_base_addr;		// Physical address for flat memory frame buffer
+  grub_uint32_t		reserved2;
+  grub_uint16_t		reserved3;
+
+  // Mandory information for VBE 3.0 and above
+  grub_uint16_t		lin_bytes_per_scan_line;
+  grub_uint8_t		bnk_number_of_image_pages;
+  grub_uint8_t		lin_number_of_image_pages;
+  grub_uint8_t		lin_red_mask_size;
+  grub_uint8_t		lin_red_field_position;
+  grub_uint8_t		lin_green_mask_size;
+  grub_uint8_t		lin_green_field_position;
+  grub_uint8_t		lin_blue_mask_size;
+  grub_uint8_t		lin_blue_field_position;
+  grub_uint8_t		lin_rsvd_mask_size;
+  grub_uint8_t		lin_rsvd_field_position;
+  grub_uint32_t		max_pixel_clock;
+
+  // Fill
+  grub_uint8_t		reserved4[189+1]; // Spec says 189 but it's total size should be 256
+} __attribute__ ((packed));
+
+struct grub_vbe_crtc_info_block_t {
+  grub_uint16_t		horizontal_total;
+  grub_uint16_t		horizontal_sync_start;
+  grub_uint16_t		horizontal_sync_end;
+  grub_uint16_t		vertical_total;
+  grub_uint16_t		vertical_sync_start;
+  grub_uint16_t		vertical_sync_end;
+  grub_uint8_t		flags;
+  grub_uint32_t		pixel_clock;
+  grub_uint16_t		refresh_rate;
+  grub_uint8_t		reserved[40];
+} __attribute__ ((packed));
+
+struct grub_vbe_palette_data_t {
+  grub_uint8_t		blue;
+  grub_uint8_t		green;
+  grub_uint8_t		red;
+  grub_uint8_t		aligment;
+} __attribute__ ((packed));
+
+/* Call VESA BIOS 0x4f00 to get VBE Controller Information, return VBE status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_controller_info) (struct grub_vbe_info_block_t *controller_info);
+
+/* Call VESA BIOS 0x4f01 to get VBE Mode Information, return VBE status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_mode_info) (grub_uint32_t mode, struct grub_vbe_mode_info_block_t *mode_info);
+
+/* Call VESA BIOS 0x4f02 to set video mode, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_mode) (grub_uint32_t mode, struct grub_vbe_crtc_info_block_t *crtc_info);
+
+/* Call VESA BIOS 0x4f03 to return current VBE Mode, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_mode) (grub_uint32_t *mode);
+
+/* Call VESA BIOS 0x4f05 to set memory window, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_memory_window) (grub_uint32_t window, grub_uint32_t position);
+
+/* Call VESA BIOS 0x4f05 to return memory window, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_memory_window) (grub_uint32_t window, grub_uint32_t *position);
+
+/* Call VESA BIOS 0x4f06 to set scanline length (in bytes), return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_scanline_length) (grub_uint32_t length);
+
+/* Call VESA BIOS 0x4f06 to return scanline length (in bytes), return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_scanline_length) (grub_uint32_t *length);
+
+/* Call VESA BIOS 0x4f07 to set display start, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_display_start) (grub_uint32_t x, grub_uint32_t y);
+
+/* Call VESA BIOS 0x4f07 to get display start, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_display_start) (grub_uint32_t *x, grub_uint32_t *y);
+
+/* Call VESA BIOS 0x4f09 to set palette data, return status */
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_palette_data) (grub_uint32_t color_count, grub_uint32_t start_index, struct grub_vbe_palette_data_t *palette_data);
+
+#endif /* ! GRUB_VBE_MACHINE_HEADER */
diff -ruN grub2/kern/i386/pc/startup.S grub2.vbe/kern/i386/pc/startup.S
--- grub2/kern/i386/pc/startup.S	2004-04-04 16:46:02.000000000 +0300
+++ grub2.vbe/kern/i386/pc/startup.S	2005-07-16 15:03:13.895927008 +0300
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2003,2005 Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -219,11 +219,11 @@
  * 31          24         19   16                 7           0
  * ------------------------------------------------------------
  * |             | |B| |A|       | |   |1|0|E|W|A|            |
- * | BASE 31..24 |G|/|0|V| LIMIT |P|DPL|  TYPE   | BASE 23:16 |
+ * | BASE 31..24 |G|/|L|V| LIMIT |P|DPL|  TYPE   | BASE 23:16 |  4
  * |             | |D| |L| 19..16| |   |1|1|C|R|A|            |
  * ------------------------------------------------------------
  * |                             |                            |
- * |        BASE 15..0           |       LIMIT 15..0          |
+ * |        BASE 15..0           |       LIMIT 15..0          |  0
  * |                             |                            |
  * ------------------------------------------------------------
  *
@@ -236,19 +236,31 @@
 	.word	0, 0
 	.byte	0, 0, 0, 0
 
-	/* code segment */
+	/* -- code segment --
+	 * base = 0x00000000, limit = 0xFFFFF (4 KiB Granularity), present
+	 * type = 32bit code execute/read, DPL = 0
+	 */
 	.word	0xFFFF, 0
 	.byte	0, 0x9A, 0xCF, 0
 
-	/* data segment */
+	/* -- data segment --
+	 * base = 0x00000000, limit 0xFFFFF (4 KiB Granularity), present
+	 * type = 32 bit data read/write, DPL = 0 
+	 */
 	.word	0xFFFF, 0
 	.byte	0, 0x92, 0xCF, 0
 
-	/* 16 bit real mode CS */
+	/* -- 16 bit real mode CS --
+	 * base = 0x00000000, limit 0x0FFFF (1 B Granularity), present
+	 * type = 16 bit code execute/read only/conforming, DPL = 0
+	 */
 	.word	0xFFFF, 0
 	.byte	0, 0x9E, 0, 0
 
-	/* 16 bit real mode DS */
+	/* -- 16 bit real mode DS --
+	 * base = 0x00000000, limit 0x0FFFF (1 B Granularity), present
+	 * type = 16 bit data read/write, DPL = 0
+	 */
 	.word	0xFFFF, 0
 	.byte	0, 0x92, 0, 0
 
@@ -1594,3 +1606,406 @@
 	popl	%ebx
 	popl	%ebp
 	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_get_controller_info (struct grub_vbe_info_block_t *controller_info)
+ *
+ * Register allocations for parameters:
+ * %eax		*controller_info
+ */
+FUNCTION(grub_vbe_get_controller_info)
+	pushl	%ebp
+	pushl	%edi
+
+	movw	%ax, %di		/* store *controller_info to edx:di */
+	xorw	%ax, %ax
+	shrl	$4, %eax
+	mov	%eax, %edx		/* prot_to_real destroys %eax */
+	
+	call	prot_to_real
+	.code16
+
+	pushw	%es
+
+	movw	%dx, %es		/* *controller_info is now on es:di */
+	movw	$0x4f00, %ax
+	int	$0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	popw	%es
+
+	DATA32 call	real_to_prot
+	.code32
+
+	movl	%edx, %eax
+	andl	$0x0FFFF, %eax		/* return value in %eax */
+	
+	popl	%edi
+	popl	%ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_get_mode_info (grub_uint32_t mode, struct grub_vbe_mode_info_block_t *mode_info)
+ *
+ * Register allocations for parameters:
+ * %eax		mode
+ * %edx		*mode_info
+ */
+FUNCTION(grub_vbe_get_mode_info)
+	pushl   %ebp
+	pushl   %edi
+
+	movl	%eax, %ecx		/* store mode number to %ecx */
+
+	movw    %dx, %di		/* store *mode_info to edx:di*/
+	xorw    %dx, %dx
+	shrl    $4, %edx
+
+	call    prot_to_real
+	.code16
+
+	pushw   %es
+
+	movw    %dx, %es		/* *mode_info is now on es:di */
+	movw    $0x4f01, %ax
+	int     $0x10
+
+	movw    %ax, %dx        	/* real_to_prot destroys %eax */
+
+	popw    %es
+
+	DATA32 call     real_to_prot
+	.code32
+
+	movl    %edx, %eax
+	andl    $0x0FFFF, %eax  	/* return value in %eax */
+
+	popl    %edi
+	popl    %ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_set_mode (grub_uint32_t mode, struct grub_vbe_crtc_info_block_t *crtc_info)
+ *
+ * Register allocations for parameters:
+ * %eax		mode
+ * %edx		*crtc_info
+ */
+FUNCTION(grub_vbe_set_mode)
+	pushl	%ebp
+	pushl	%ebx
+
+	movl	%eax, %ebx		/* store mode in ebx */
+
+	movw    %dx, %di		/* store *crtc_info to edx:di*/
+	xorw    %dx, %dx
+	shrl    $4, %edx
+
+	call    prot_to_real
+	.code16
+
+	pushw   %es
+
+	movw    %dx, %es		/* *crtc_info is now on es:di */
+
+	movw	$0x4f02, %ax
+	int	$0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	popw	%es
+
+	DATA32 call	real_to_prot
+	.code32
+	
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl	%ebx
+	popl	%ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_get_mode (grub_uint32_t *mode)
+ *
+ * Register allocations for parameters:
+ * %eax		*mode
+ */
+FUNCTION(grub_vbe_get_mode)
+	pushl   %ebp
+	pushl   %ebx
+	pushl	%eax			/* push *mode to stack */
+
+	call    prot_to_real
+	.code16
+
+	movw    $0x4f03, %ax
+	int     $0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	DATA32 call     real_to_prot
+	.code32
+
+	popl	%edi			/* pops *mode from stack to %edi */
+	andl	$0xFFFF, %ebx
+	movl	%ebx, (%edi)
+
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl    %ebx
+	popl    %ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_set_memory_window (grub_uint32_t window, grub_uint32_t position);
+ *
+ * Register allocations for parameters:
+ * %eax		window
+ * %edx		position
+ */
+FUNCTION(grub_vbe_set_memory_window)
+	pushl	%ebp
+	pushl	%ebx
+
+	movl	%eax, %ebx
+
+	call	prot_to_real
+	.code16
+
+	movw	$0x4f05, %ax
+	andw	$0x00ff, %bx		/* BL = window, BH = 0, Set memory window */
+	int	$0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	DATA32 call	real_to_prot
+	.code32
+	
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl	%ebx
+	popl	%ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_get_memory_window (grub_uint32_t window, grub_uint32_t *position);
+ *
+ * Register allocations for parameters:
+ * %eax		window
+ * %edx		*position
+ */
+FUNCTION(grub_vbe_get_memory_window)
+	pushl   %ebp
+	pushl   %ebx
+	pushl	%edx			/* push *position to stack */
+
+	movl	%eax, %ebx		/* store window in ebx */
+
+	call    prot_to_real
+	.code16
+
+	movw    $0x4f05, %ax
+	andw	$0x00ff, %bx		/* BL = window */
+	orw	$0x0100, %bx		/* BH = 1, Get memory window */
+	int     $0x10
+
+	movw	%ax, %bx		/* real_to_prot destroys %eax */
+
+	DATA32 call     real_to_prot
+	.code32
+
+	popl	%edi			/* pops *position from stack to %edi */
+	andl	$0xFFFF, %edx
+	movl	%edx, (%edi)		/* return position to caller */
+
+	movw	%bx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl    %ebx
+	popl    %ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_set_scanline_length (grub_uint32_t length)
+ *
+ * Register allocations for parameters:
+ * %eax		length
+ */
+FUNCTION(grub_vbe_set_scanline_length)
+	pushl	%ebp
+	pushl	%ebx
+
+	movl	%eax, %ecx		/* store length in ecx */
+
+	call	prot_to_real
+	.code16
+
+	movw	$0x4f06, %ax
+	movw	$0x0002, %bx		/* BL = 2, Set Scan Line in Bytes */
+	int	$0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	DATA32 call	real_to_prot
+	.code32
+	
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl	%ebx
+	popl	%ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_get_scanline_length (grub_uint32_t *length)
+ *
+ * Register allocations for parameters:
+ * %eax		*length
+ */
+FUNCTION(grub_vbe_get_scanline_length)
+	pushl   %ebp
+	pushl   %ebx
+	pushl	%edx			/* push *length to stack */
+
+	call    prot_to_real
+	.code16
+
+	movw    $0x4f06, %ax
+	movw	$0x0001, %bx		/* BL = 1, Get Scan Line Length (in bytes) */
+	int     $0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	DATA32 call     real_to_prot
+	.code32
+
+	popl	%edi			/* pops *length from stack to %edi */
+	andl	$0xFFFF, %ebx
+	movl	%ebx, (%edi)		/* return length to caller */
+
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl    %ebx
+	popl    %ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_set_display_start (grub_uint32_t x, grub_uint32_t y)
+ *
+ * Register allocations for parameters:
+ * %eax		x
+ * %edx		y
+ */
+FUNCTION(grub_vbe_set_display_start)
+	pushl	%ebp
+	pushl	%ebx
+
+	movl	%eax, %ecx		/* store x in ecx */
+
+	call	prot_to_real
+	.code16
+
+	movw	$0x4f07, %ax
+	movw	$0x0080, %bx		/* BL = 80h, Set Display Start during Vertical Retrace */
+	int	$0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	DATA32 call	real_to_prot
+	.code32
+	
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl	%ebx
+	popl	%ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_get_display_start (grub_uint32_t *x, grub_uint32_t *y)
+ *
+ * Register allocations for parameters:
+ * %eax		*x
+ * %edx		*y
+ */
+FUNCTION(grub_vbe_get_display_start)
+	pushl   %ebp
+	pushl   %ebx
+	pushl	%eax			/* push *x to stack */
+	pushl	%edx			/* push *y to stack */
+
+	call    prot_to_real
+	.code16
+
+	movw    $0x4f07, %ax
+	movw	$0x0001, %bx		/* BL = 1, Get Display Start */
+	int     $0x10
+
+	movw	%ax, %bx		/* real_to_prot destroys %eax */
+
+	DATA32 call     real_to_prot
+	.code32
+
+	popl	%edi			/* pops *y from stack to %edi */
+	andl	$0xFFFF, %edx
+	movl	%edx, (%edi)		/* return y-position to caller */
+
+	popl	%edi			/* pops *x from stack to %edi */
+	andl	$0xFFFF, %ecx
+	movl	%ecx, (%edi)		/* return x-position to caller */
+
+	movw	%bx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl    %ebx
+	popl    %ebp
+	ret
+
+/*
+ * grub_vbe_status_t grub_vbe_set_palette_data (grub_uint32_t color_count, grub_uint32_t start_index, struct grub_vbe_palette_data_t *palette_data)
+ *
+ * Register allocations for parameters:
+ * %eax		color_count
+ * %edx		start_index
+ * %ecx		*palette_data
+ */
+FUNCTION(grub_vbe_set_palette_data)
+	pushl	%ebp
+	pushl	%ebx
+
+	movl	%eax, %ebx		/* store color_count in ebx */
+
+	movw    %cx, %di		/* store *palette_data to ecx:di */
+	xorw    %cx, %cx
+	shrl    $4, %ecx
+
+	call    prot_to_real
+	.code16
+
+	pushw   %es
+
+	movw    %cx, %es		/* *palette_data is now on es:di */
+	movw	%bx, %cx		/* color_count is now on cx */
+
+	movw	$0x4f09, %ax
+	xorw	%bx, %bx		/* BL = 0, Set Palette Data */
+	int	$0x10
+
+	movw	%ax, %dx		/* real_to_prot destroys %eax */
+
+	popw	%es
+
+	DATA32 call	real_to_prot
+	.code32
+	
+	movw	%dx, %ax
+	andl	$0xFFFF, %eax		/* return value in %eax */
+
+	popl	%ebx
+	popl	%ebp
+	ret

             reply	other threads:[~2005-07-14 18:39 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-07-14 18:36 Vesa Jääskeläinen [this message]
2005-07-14 19:02 ` [PATCH] Kernel support for VESA Bios Extension Marco Gerards
2005-07-14 20:36   ` Vesa Jääskeläinen
2005-07-14 21:45     ` Marco Gerards
2005-07-15 10:53       ` Yoshinori K. Okuji
2005-07-15 16:47       ` Vesa Jääskeläinen
2005-07-15 18:55         ` Yoshinori K. Okuji
2005-07-16 18:43           ` Marco Gerards

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42D6B0CB.9070208@nic.fi \
    --to=chaac@nic.fi \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.