merge with mainline
This commit is contained in:
		
						commit
						163dd4f7e9
					
				
					 63 changed files with 3999 additions and 1439 deletions
				
			
		|  | @ -63,6 +63,8 @@ | |||
| #define	GRUB_PC_PARTITION_OPENBSD_TYPE_NTFS	18 | ||||
| #define	GRUB_PC_PARTITION_OPENBSD_TYPE_RAID	19 | ||||
| 
 | ||||
| #define GRUB_PC_PARTITION_BSD_LABEL_WHOLE_DISK_PARTITION 2 | ||||
| 
 | ||||
| /* The BSD partition entry.  */ | ||||
| struct grub_partition_bsd_entry | ||||
| { | ||||
|  |  | |||
|  | @ -1,8 +1,27 @@ | |||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2010  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 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB 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, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #ifndef GRUB_EMU_MISC_H | ||||
| #define GRUB_EMU_MISC_H 1 | ||||
| 
 | ||||
| #include <grub/symbol.h> | ||||
| #include <grub/types.h> | ||||
| #include <grub/util/libzfs.h> | ||||
| 
 | ||||
| #ifdef __CYGWIN__ | ||||
| # include <sys/fcntl.h> | ||||
|  | @ -26,12 +45,16 @@ extern const char *program_name; | |||
| void grub_init_all (void); | ||||
| void grub_fini_all (void); | ||||
| 
 | ||||
| char *grub_make_system_path_relative_to_its_root (const char *path); | ||||
| void grub_find_zpool_from_dir (const char *dir, | ||||
| 			       char **poolname, char **poolfs); | ||||
| 
 | ||||
| void * EXPORT_FUNC(xmalloc) (grub_size_t size); | ||||
| void * EXPORT_FUNC(xrealloc) (void *ptr, grub_size_t size); | ||||
| char * EXPORT_FUNC(xstrdup) (const char *str); | ||||
| char * EXPORT_FUNC(xasprintf) (const char *fmt, ...); | ||||
| char *grub_make_system_path_relative_to_its_root (const char *path) | ||||
|   __attribute__ ((warn_unused_result)); | ||||
| 
 | ||||
| void * EXPORT_FUNC(xmalloc) (grub_size_t size) __attribute__ ((warn_unused_result)); | ||||
| void * EXPORT_FUNC(xrealloc) (void *ptr, grub_size_t size) __attribute__ ((warn_unused_result)); | ||||
| char * EXPORT_FUNC(xstrdup) (const char *str) __attribute__ ((warn_unused_result)); | ||||
| char * EXPORT_FUNC(xasprintf) (const char *fmt, ...) __attribute__ ((warn_unused_result)); | ||||
| 
 | ||||
| void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...); | ||||
| void EXPORT_FUNC(grub_util_info) (const char *fmt, ...); | ||||
|  | @ -45,11 +68,12 @@ int EXPORT_FUNC(vasprintf) (char **buf, const char *fmt, va_list ap); | |||
| int EXPORT_FUNC(asprintf) (char **buf, const char *fmt, ...); | ||||
| #endif | ||||
| 
 | ||||
| char * EXPORT_FUNC(xasprintf) (const char *fmt, ...); | ||||
| extern char * canonicalize_file_name (const char *path); | ||||
| 
 | ||||
| #ifdef HAVE_DEVICE_MAPPER | ||||
| int grub_device_mapper_supported (void); | ||||
| #endif | ||||
| 
 | ||||
| libzfs_handle_t *grub_get_libzfs_handle (void); | ||||
| 
 | ||||
| #endif /* GRUB_EMU_MISC_H */ | ||||
|  |  | |||
|  | @ -231,10 +231,10 @@ grub_strtol (const char *str, char **end, int base) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| char *EXPORT_FUNC(grub_strdup) (const char *s); | ||||
| char *EXPORT_FUNC(grub_strndup) (const char *s, grub_size_t n); | ||||
| char *EXPORT_FUNC(grub_strdup) (const char *s) __attribute__ ((warn_unused_result)); | ||||
| char *EXPORT_FUNC(grub_strndup) (const char *s, grub_size_t n) __attribute__ ((warn_unused_result)); | ||||
| void *EXPORT_FUNC(grub_memset) (void *s, int c, grub_size_t n); | ||||
| grub_size_t EXPORT_FUNC(grub_strlen) (const char *s); | ||||
| grub_size_t EXPORT_FUNC(grub_strlen) (const char *s) __attribute__ ((warn_unused_result)); | ||||
| int EXPORT_FUNC(grub_printf) (const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); | ||||
| int EXPORT_FUNC(grub_printf_) (const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); | ||||
| 
 | ||||
|  | @ -261,8 +261,8 @@ int EXPORT_FUNC(grub_snprintf) (char *str, grub_size_t n, const char *fmt, ...) | |||
| int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt, | ||||
| 				 va_list args); | ||||
| char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...) | ||||
|      __attribute__ ((format (printf, 1, 2))); | ||||
| char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args); | ||||
|      __attribute__ ((format (printf, 1, 2))) __attribute__ ((warn_unused_result)); | ||||
| char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) __attribute__ ((warn_unused_result)); | ||||
| void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn)); | ||||
| void EXPORT_FUNC(grub_abort) (void) __attribute__ ((noreturn)); | ||||
| grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n, | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ struct grub_partition | |||
|   /* The partition number.  */ | ||||
|   int number; | ||||
| 
 | ||||
|   /* The start sector.  */ | ||||
|   /* The start sector (relative to parent).  */ | ||||
|   grub_disk_addr_t start; | ||||
| 
 | ||||
|   /* The length in sector units.  */ | ||||
|  | @ -60,7 +60,7 @@ struct grub_partition | |||
|   /* The index of this partition in the partition table.  */ | ||||
|   int index; | ||||
| 
 | ||||
|   /* Parent partition map.  */ | ||||
|   /* Parent partition (physically contains this partition).  */ | ||||
|   struct grub_partition *parent; | ||||
| 
 | ||||
|   /* The type partition map.  */ | ||||
|  |  | |||
|  | @ -80,6 +80,7 @@ | |||
| 
 | ||||
| #define  GRUB_PCI_STATUS_DEVSEL_TIMING_SHIFT 9 | ||||
| #define  GRUB_PCI_STATUS_DEVSEL_TIMING_MASK 0x0600 | ||||
| #define  GRUB_PCI_CLASS_SUBCLASS_VGA  0x0300 | ||||
| 
 | ||||
| #ifndef ASM_FILE | ||||
| typedef grub_uint32_t grub_pci_id_t; | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /* raid.h - On disk structures for RAID. */ | ||||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2006,2007,2008  Free Software Foundation, Inc. | ||||
|  *  Copyright (C) 2006,2007,2008,2010  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 | ||||
|  | @ -51,6 +51,8 @@ struct grub_raid_array | |||
|   char *name;              /* That will be "md<number>". */ | ||||
|   unsigned int nr_devs;    /* The number of devices we've found so far. */ | ||||
|   grub_disk_t device[GRUB_RAID_MAX_DEVICES];  /* Array of total_devs devices. */ | ||||
|   grub_disk_addr_t start_sector[GRUB_RAID_MAX_DEVICES]; | ||||
| 			   /* Start of each device, in 512 byte sectors. */ | ||||
|   struct grub_raid_array *next; | ||||
| }; | ||||
| 
 | ||||
|  | @ -58,7 +60,8 @@ struct grub_raid | |||
| { | ||||
|   const char *name; | ||||
| 
 | ||||
|   grub_err_t (*detect) (grub_disk_t disk, struct grub_raid_array *array); | ||||
|   grub_err_t (*detect) (grub_disk_t disk, struct grub_raid_array *array, | ||||
|                         grub_disk_addr_t *start_sector); | ||||
| 
 | ||||
|   struct grub_raid *next; | ||||
| }; | ||||
|  |  | |||
|  | @ -104,7 +104,7 @@ struct grub_usb_controller_dev | |||
|   grub_err_t (*portstatus) (grub_usb_controller_t dev, unsigned int port, | ||||
| 			    unsigned int enable); | ||||
| 
 | ||||
|   grub_usb_speed_t (*detect_dev) (grub_usb_controller_t dev, int port); | ||||
|   grub_usb_speed_t (*detect_dev) (grub_usb_controller_t dev, int port, int *changed); | ||||
| 
 | ||||
|   /* The next host controller.  */ | ||||
|   struct grub_usb_controller_dev *next; | ||||
|  | @ -125,6 +125,13 @@ struct grub_usb_interface | |||
|   struct grub_usb_desc_if *descif; | ||||
| 
 | ||||
|   struct grub_usb_desc_endp *descendp; | ||||
| 
 | ||||
|   /* A driver is handling this interface. Do we need to support multiple drivers
 | ||||
|      for single interface? | ||||
|    */ | ||||
|   int attached; | ||||
| 
 | ||||
|   void (*detach_hook) (struct grub_usb_device *dev, int config, int interface); | ||||
| }; | ||||
| 
 | ||||
| struct grub_usb_configuration | ||||
|  | @ -207,4 +214,21 @@ grub_usb_get_config_interface (struct grub_usb_desc_config *config) | |||
|   return interf; | ||||
| } | ||||
| 
 | ||||
| typedef int (*grub_usb_attach_hook_class) (grub_usb_device_t usbdev, | ||||
| 					   int configno, int interfno); | ||||
| 
 | ||||
| struct grub_usb_attach_desc | ||||
| { | ||||
|   struct grub_usb_attach_desc *next; | ||||
|   int class; | ||||
|   grub_usb_attach_hook_class hook; | ||||
| }; | ||||
| 
 | ||||
| void grub_usb_register_attach_hook_class (struct grub_usb_attach_desc *desc); | ||||
| void grub_usb_unregister_attach_hook_class (struct grub_usb_attach_desc *desc); | ||||
| 
 | ||||
| void grub_usb_poll_devices (void); | ||||
| 
 | ||||
| void grub_usb_device_attach (grub_usb_device_t dev); | ||||
| 
 | ||||
| #endif /* GRUB_USB_H */ | ||||
|  |  | |||
|  | @ -93,10 +93,12 @@ typedef struct grub_usb_transfer *grub_usb_transfer_t; | |||
| 
 | ||||
| #define GRUB_USB_HUB_FEATURE_PORT_RESET   0x04 | ||||
| #define GRUB_USB_HUB_FEATURE_PORT_POWER   0x08 | ||||
| #define GRUB_USB_HUB_FEATURE_C_CONNECTED  0x10 | ||||
| 
 | ||||
| #define GRUB_USB_HUB_STATUS_CONNECTED	 (1 << 0) | ||||
| #define GRUB_USB_HUB_STATUS_LOWSPEED	 (1 << 9) | ||||
| #define GRUB_USB_HUB_STATUS_HIGHSPEED	 (1 << 10) | ||||
| #define GRUB_USB_HUB_STATUS_C_CONNECTED  (1 << 16) | ||||
| #define GRUB_USB_HUB_STATUS_C_PORT_RESET (1 << 20) | ||||
| 
 | ||||
| struct grub_usb_packet_setup | ||||
|  |  | |||
							
								
								
									
										39
									
								
								include/grub/util/libnvpair.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								include/grub/util/libnvpair.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2010  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 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB 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, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #ifndef GRUB_LIBNVPAIR_UTIL_HEADER | ||||
| #define GRUB_LIBNVPAIR_UTIL_HEADER 1 | ||||
| 
 | ||||
| #include <config.h> | ||||
| 
 | ||||
| #ifdef HAVE_LIBNVPAIR_H | ||||
| #include <libnvpair.h> | ||||
| #else /* ! HAVE_LIBNVPAIR_H */ | ||||
| 
 | ||||
| #include <stdio.h>	/* FILE */ | ||||
| 
 | ||||
| typedef void nvlist_t; | ||||
| 
 | ||||
| int nvlist_lookup_string (nvlist_t *, const char *, char **); | ||||
| int nvlist_lookup_nvlist (nvlist_t *, const char *, nvlist_t **); | ||||
| int nvlist_lookup_nvlist_array (nvlist_t *, const char *, nvlist_t ***, unsigned int *); | ||||
| void nvlist_print (FILE *, nvlist_t *); | ||||
| 
 | ||||
| #endif /* ! HAVE_LIBNVPAIR_H */ | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										45
									
								
								include/grub/util/libzfs.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								include/grub/util/libzfs.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | |||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2010  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 3 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  GRUB 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, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #ifndef GRUB_LIBZFS_UTIL_HEADER | ||||
| #define GRUB_LIBZFS_UTIL_HEADER 1 | ||||
| 
 | ||||
| #include <config.h> | ||||
| 
 | ||||
| #ifdef HAVE_LIBZFS_H | ||||
| #include <libzfs.h> | ||||
| #else /* ! HAVE_LIBZFS_H */ | ||||
| 
 | ||||
| #include <grub/util/libnvpair.h> | ||||
| 
 | ||||
| typedef void libzfs_handle_t; | ||||
| typedef void zpool_handle_t; | ||||
| 
 | ||||
| extern libzfs_handle_t *libzfs_init (void); | ||||
| extern void libzfs_fini (libzfs_handle_t *); | ||||
| 
 | ||||
| extern zpool_handle_t *zpool_open (libzfs_handle_t *, const char *); | ||||
| extern void zpool_close (zpool_handle_t *); | ||||
| 
 | ||||
| extern int zpool_get_physpath (zpool_handle_t *, const char *); | ||||
| 
 | ||||
| extern nvlist_t *zpool_get_config (zpool_handle_t *, nvlist_t **); | ||||
| 
 | ||||
| #endif /* ! HAVE_LIBZFS_H */ | ||||
| 
 | ||||
| #endif | ||||
|  | @ -19,9 +19,13 @@ | |||
| #ifndef GRUB_VGA_HEADER | ||||
| #define GRUB_VGA_HEADER	1 | ||||
| 
 | ||||
| #include <grub/pci.h> | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_IO_ARX = 0x3c0, | ||||
|     GRUB_VGA_IO_ARX_READ = 0x3c1, | ||||
|     GRUB_VGA_IO_MISC_WRITE = 0x3c2, | ||||
|     GRUB_VGA_IO_SR_INDEX = 0x3c4, | ||||
|     GRUB_VGA_IO_SR_DATA = 0x3c5, | ||||
|     GRUB_VGA_IO_PIXEL_MASK = 0x3c6, | ||||
|  | @ -39,8 +43,15 @@ enum | |||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_CR_WIDTH = 0x01, | ||||
|     GRUB_VGA_CR_HTOTAL = 0x00, | ||||
|     GRUB_VGA_CR_HORIZ_END = 0x01, | ||||
|     GRUB_VGA_CR_HBLANK_START = 0x02,     | ||||
|     GRUB_VGA_CR_HBLANK_END = 0x03,     | ||||
|     GRUB_VGA_CR_HORIZ_SYNC_PULSE_START = 0x04, | ||||
|     GRUB_VGA_CR_HORIZ_SYNC_PULSE_END = 0x05, | ||||
|     GRUB_VGA_CR_VERT_TOTAL = 0x06, | ||||
|     GRUB_VGA_CR_OVERFLOW = 0x07, | ||||
|     GRUB_VGA_CR_BYTE_PANNING = 0x08, | ||||
|     GRUB_VGA_CR_CELL_HEIGHT = 0x09, | ||||
|     GRUB_VGA_CR_CURSOR_START = 0x0a, | ||||
|     GRUB_VGA_CR_CURSOR_END = 0x0b, | ||||
|  | @ -48,14 +59,71 @@ enum | |||
|     GRUB_VGA_CR_START_ADDR_LOW_REGISTER = 0x0d, | ||||
|     GRUB_VGA_CR_CURSOR_ADDR_HIGH = 0x0e, | ||||
|     GRUB_VGA_CR_CURSOR_ADDR_LOW = 0x0f, | ||||
|     GRUB_VGA_CR_VSYNC_START = 0x10, | ||||
|     GRUB_VGA_CR_VSYNC_END = 0x11, | ||||
|     GRUB_VGA_CR_HEIGHT = 0x12, | ||||
|     GRUB_VGA_CR_VDISPLAY_END = 0x12, | ||||
|     GRUB_VGA_CR_PITCH = 0x13, | ||||
|     GRUB_VGA_CR_UNDERLINE_LOCATION = 0x14, | ||||
|     GRUB_VGA_CR_VERTICAL_BLANK_START = 0x15, | ||||
|     GRUB_VGA_CR_VERTICAL_BLANK_END = 0x16, | ||||
|     GRUB_VGA_CR_MODE = 0x17, | ||||
|     GRUB_VGA_CR_LINE_COMPARE = 0x18, | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_CR_BYTE_PANNING_NORMAL = 0 | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_CR_UNDERLINE_LOCATION_DWORD_MODE = 0x40 | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_IO_MISC_COLOR = 0x01, | ||||
|     GRUB_VGA_IO_MISC_ENABLE_VRAM_ACCESS = 0x02, | ||||
|     GRUB_VGA_IO_MISC_EXTERNAL_CLOCK_0 = 0x08, | ||||
|     GRUB_VGA_IO_MISC_28MHZ = 0x04, | ||||
|     GRUB_VGA_IO_MISC_UPPER_64K = 0x20, | ||||
|     GRUB_VGA_IO_MISC_NEGATIVE_HORIZ_POLARITY = 0x40, | ||||
|     GRUB_VGA_IO_MISC_NEGATIVE_VERT_POLARITY = 0x80, | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_ARX_MODE = 0x10, | ||||
|     GRUB_VGA_ARX_OVERSCAN = 0x11, | ||||
|     GRUB_VGA_ARX_COLOR_PLANE_ENABLE = 0x12, | ||||
|     GRUB_VGA_ARX_HORIZONTAL_PANNING = 0x13, | ||||
|     GRUB_VGA_ARX_COLOR_SELECT = 0x14 | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_ARX_MODE_TEXT = 0x00, | ||||
|     GRUB_VGA_ARX_MODE_GRAPHICS = 0x01, | ||||
|     GRUB_VGA_ARX_MODE_ENABLE_256COLOR = 0x40 | ||||
|   }; | ||||
| 
 | ||||
| #define GRUB_VGA_CR_WIDTH_DIVISOR 8 | ||||
| 
 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_SHIFT 7 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_MASK 0x02 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_SHIFT 3 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_MASK 0x40 | ||||
| 
 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_SHIFT 8 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_MASK 0x01 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_SHIFT 4 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_MASK 0x20 | ||||
| 
 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VSYNC_START1_SHIFT 6 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VSYNC_START1_MASK 0x04 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VSYNC_START2_SHIFT 2 | ||||
| #define GRUB_VGA_CR_OVERFLOW_VSYNC_START2_MASK 0x80 | ||||
| 
 | ||||
| #define GRUB_VGA_CR_OVERFLOW_HEIGHT1_SHIFT 7 | ||||
| #define GRUB_VGA_CR_OVERFLOW_HEIGHT1_MASK 0x02 | ||||
| #define GRUB_VGA_CR_OVERFLOW_HEIGHT2_SHIFT 3 | ||||
|  | @ -65,7 +133,9 @@ enum | |||
| 
 | ||||
| #define GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_MASK 0x40 | ||||
| #define GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT 3 | ||||
| 
 | ||||
| #define GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_MASK 0x20 | ||||
| #define GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_SHIFT 4 | ||||
| #define GRUB_VGA_CR_CELL_HEIGHT_DOUBLE_SCAN 0x80 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_CR_CURSOR_START_DISABLE = (1 << 5) | ||||
|  | @ -77,17 +147,26 @@ enum | |||
|   { | ||||
|     GRUB_VGA_CR_MODE_NO_CGA = 0x01, | ||||
|     GRUB_VGA_CR_MODE_NO_HERCULES = 0x02, | ||||
|     GRUB_VGA_CR_MODE_ADDRESS_WRAP = 0x20, | ||||
|     GRUB_VGA_CR_MODE_BYTE_MODE = 0x40, | ||||
|     GRUB_VGA_CR_MODE_TIMING_ENABLE = 0x80 | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_SR_RESET = 0, | ||||
|     GRUB_VGA_SR_CLOCKING_MODE = 1, | ||||
|     GRUB_VGA_SR_MAP_MASK_REGISTER = 2, | ||||
|     GRUB_VGA_SR_CHAR_MAP_SELECT = 3, | ||||
|     GRUB_VGA_SR_MEMORY_MODE = 4, | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_SR_RESET_ASYNC = 1, | ||||
|     GRUB_VGA_SR_RESET_SYNC = 2 | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_SR_CLOCKING_MODE_8_DOT_CLOCK = 1 | ||||
|  | @ -96,19 +175,33 @@ enum | |||
| enum | ||||
|   { | ||||
|     GRUB_VGA_SR_MEMORY_MODE_NORMAL = 0, | ||||
|     GRUB_VGA_SR_MEMORY_MODE_CHAIN4 = 8 | ||||
|     GRUB_VGA_SR_MEMORY_MODE_EXTERNAL_VIDEO_MEMORY = 2, | ||||
|     GRUB_VGA_SR_MEMORY_MODE_SEQUENTIAL_ADDRESSING = 4, | ||||
|     GRUB_VGA_SR_MEMORY_MODE_CHAIN4 = 8, | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_GR_SET_RESET_PLANE = 0, | ||||
|     GRUB_VGA_GR_SET_RESET_PLANE_ENABLE = 1, | ||||
|     GRUB_VGA_GR_COLOR_COMPARE = 2, | ||||
|     GRUB_VGA_GR_DATA_ROTATE = 3, | ||||
|     GRUB_VGA_GR_READ_MAP_REGISTER = 4, | ||||
|     GRUB_VGA_GR_MODE = 5, | ||||
|     GRUB_VGA_GR_GR6 = 6, | ||||
|     GRUB_VGA_GR_COLOR_COMPARE_DISABLE = 7, | ||||
|     GRUB_VGA_GR_BITMASK = 8, | ||||
|     GRUB_VGA_GR_MAX | ||||
|   }; | ||||
| 
 | ||||
| #define GRUB_VGA_ALL_PLANES 0xf | ||||
| #define GRUB_VGA_NO_PLANES 0x0 | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_GR_DATA_ROTATE_NOP = 0 | ||||
|   }; | ||||
| 
 | ||||
| enum | ||||
|   { | ||||
|     GRUB_VGA_TEXT_TEXT_PLANE = 0, | ||||
|  | @ -119,6 +212,7 @@ enum | |||
| enum | ||||
|   { | ||||
|     GRUB_VGA_GR_GR6_GRAPHICS_MODE = 1, | ||||
|     GRUB_VGA_GR_GR6_MMAP_A0 = (1 << 2), | ||||
|     GRUB_VGA_GR_GR6_MMAP_CGA = (3 << 2) | ||||
|   }; | ||||
| 
 | ||||
|  | @ -126,70 +220,152 @@ enum | |||
|   { | ||||
|     GRUB_VGA_GR_MODE_READ_MODE1 = 0x08, | ||||
|     GRUB_VGA_GR_MODE_ODD_EVEN = 0x10, | ||||
|     GRUB_VGA_GR_MODE_ODD_EVEN_SHIFT = 0x20, | ||||
|     GRUB_VGA_GR_MODE_256_COLOR = 0x40 | ||||
|   }; | ||||
| 
 | ||||
| static inline void | ||||
| grub_vga_gr_write (grub_uint8_t val, grub_uint8_t addr) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_GR_INDEX); | ||||
|   grub_outb (val, GRUB_VGA_IO_GR_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_GR_INDEX); | ||||
|   grub_outb (val, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_GR_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline grub_uint8_t | ||||
| grub_vga_gr_read (grub_uint8_t addr) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_GR_INDEX); | ||||
|   return grub_inb (GRUB_VGA_IO_GR_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_GR_INDEX); | ||||
|   return grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_GR_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| grub_vga_cr_write (grub_uint8_t val, grub_uint8_t addr) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_CR_INDEX); | ||||
|   grub_outb (val, GRUB_VGA_IO_CR_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_CR_INDEX); | ||||
|   grub_outb (val, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_CR_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline grub_uint8_t | ||||
| grub_vga_cr_read (grub_uint8_t addr) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_CR_INDEX); | ||||
|   return grub_inb (GRUB_VGA_IO_CR_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_CR_INDEX); | ||||
|   return grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_CR_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| grub_vga_sr_write (grub_uint8_t val, grub_uint8_t addr) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_SR_INDEX); | ||||
|   grub_outb (val, GRUB_VGA_IO_SR_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_SR_INDEX); | ||||
|   grub_outb (val, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_SR_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline grub_uint8_t | ||||
| grub_vga_sr_read (grub_uint8_t addr) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_SR_INDEX); | ||||
|   return grub_inb (GRUB_VGA_IO_SR_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_SR_INDEX); | ||||
|   return grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_SR_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| grub_vga_palette_read (grub_uint8_t addr, grub_uint8_t *r, grub_uint8_t *g, | ||||
| 		       grub_uint8_t *b) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_PALLETTE_READ_INDEX); | ||||
|   *r = grub_inb (GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   *g = grub_inb (GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   *b = grub_inb (GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_READ_INDEX); | ||||
|   *r = grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   *g = grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   *b = grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| grub_vga_palette_write (grub_uint8_t addr, grub_uint8_t r, grub_uint8_t g, | ||||
| 			grub_uint8_t b) | ||||
| { | ||||
|   grub_outb (addr, GRUB_VGA_IO_PALLETTE_WRITE_INDEX); | ||||
|   grub_outb (r, GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   grub_outb (g, GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   grub_outb (b, GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_WRITE_INDEX); | ||||
|   grub_outb (r, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   grub_outb (g, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_DATA); | ||||
|   grub_outb (b, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_PALLETTE_DATA); | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| grub_vga_write_arx (grub_uint8_t val, grub_uint8_t addr) | ||||
| { | ||||
|   grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_INPUT_STATUS1_REGISTER); | ||||
|   grub_outb (addr, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_ARX); | ||||
|   grub_inb (GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_ARX_READ); | ||||
|   grub_outb (val, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_ARX); | ||||
| } | ||||
| 
 | ||||
| struct grub_video_hw_config | ||||
| { | ||||
|   unsigned vertical_total; | ||||
|   unsigned vertical_blank_start; | ||||
|   unsigned vertical_blank_end; | ||||
|   unsigned vertical_sync_start; | ||||
|   unsigned vertical_sync_end; | ||||
|   unsigned line_compare; | ||||
|   unsigned vdisplay_end; | ||||
|   unsigned pitch; | ||||
|   unsigned horizontal_total; | ||||
|   unsigned horizontal_blank_start; | ||||
|   unsigned horizontal_blank_end; | ||||
|   unsigned horizontal_sync_pulse_start; | ||||
|   unsigned horizontal_sync_pulse_end; | ||||
|   unsigned horizontal_end; | ||||
| }; | ||||
|    | ||||
| static inline void | ||||
| grub_vga_set_geometry (struct grub_video_hw_config *config, | ||||
| 		       void (*cr_write) (grub_uint8_t val, grub_uint8_t addr)) | ||||
| { | ||||
|   unsigned vertical_total = config->vertical_total - 2; | ||||
|   unsigned vertical_blank_start = config->vertical_blank_start - 1; | ||||
|   unsigned vdisplay_end = config->vdisplay_end - 1; | ||||
|   grub_uint8_t overflow, cell_height_reg; | ||||
| 
 | ||||
|   /* Disable CR0-7 write protection.  */ | ||||
|   cr_write (0, GRUB_VGA_CR_VSYNC_END); | ||||
| 
 | ||||
|   overflow = ((vertical_total >> GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_SHIFT) | ||||
| 	      & GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_MASK) | ||||
|     | ((vertical_total >> GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_MASK) | ||||
|     | ((config->vertical_sync_start >> GRUB_VGA_CR_OVERFLOW_VSYNC_START2_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_VSYNC_START2_MASK) | ||||
|     | ((config->vertical_sync_start >> GRUB_VGA_CR_OVERFLOW_VSYNC_START1_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_VSYNC_START1_MASK) | ||||
|     | ((vdisplay_end >> GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_MASK) | ||||
|     | ((vdisplay_end >> GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_MASK) | ||||
|     | ((config->vertical_sync_start >> GRUB_VGA_CR_OVERFLOW_VSYNC_START1_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_VSYNC_START1_MASK) | ||||
|     | ((config->line_compare >> GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_SHIFT) | ||||
|        & GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_MASK); | ||||
| 
 | ||||
|   cell_height_reg = ((vertical_blank_start | ||||
| 		      >> GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_SHIFT) | ||||
| 		     & GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_MASK) | ||||
|     | ((config->line_compare >> GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT) | ||||
|        & GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_MASK); | ||||
| 
 | ||||
|   cr_write (config->horizontal_total - 1, GRUB_VGA_CR_HTOTAL); | ||||
|   cr_write (config->horizontal_end - 1, GRUB_VGA_CR_HORIZ_END); | ||||
|   cr_write (config->horizontal_blank_start - 1, GRUB_VGA_CR_HBLANK_START); | ||||
|   cr_write (config->horizontal_blank_end, GRUB_VGA_CR_HBLANK_END); | ||||
|   cr_write (config->horizontal_sync_pulse_start, | ||||
| 	    GRUB_VGA_CR_HORIZ_SYNC_PULSE_START); | ||||
|   cr_write (config->horizontal_sync_pulse_end, | ||||
| 	    GRUB_VGA_CR_HORIZ_SYNC_PULSE_END); | ||||
|   cr_write (vertical_total & 0xff, GRUB_VGA_CR_VERT_TOTAL); | ||||
|   cr_write (overflow, GRUB_VGA_CR_OVERFLOW); | ||||
|   cr_write (cell_height_reg, GRUB_VGA_CR_CELL_HEIGHT); | ||||
|   cr_write (config->vertical_sync_start & 0xff, GRUB_VGA_CR_VSYNC_START); | ||||
|   cr_write (config->vertical_sync_end & 0x0f, GRUB_VGA_CR_VSYNC_END); | ||||
|   cr_write (vdisplay_end & 0xff, GRUB_VGA_CR_VDISPLAY_END); | ||||
|   cr_write (config->pitch & 0xff, GRUB_VGA_CR_PITCH); | ||||
|   cr_write (vertical_blank_start & 0xff, GRUB_VGA_CR_VERTICAL_BLANK_START); | ||||
|   cr_write (config->vertical_blank_end & 0xff, GRUB_VGA_CR_VERTICAL_BLANK_END); | ||||
|   cr_write (config->line_compare & 0xff, GRUB_VGA_CR_LINE_COMPARE); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue