tsc: Use alternative delay sources whenever appropriate.
PIT isn't available on some of new hardware including Hyper-V. So use pmtimer for calibration. Moreover pmtimer calibration is faster, so use it on coreboor where booting time is important. Based on patch by Michael Chang.
This commit is contained in:
		
							parent
							
								
									3d2c8048da
								
							
						
					
					
						commit
						d43a5ee651
					
				
					 13 changed files with 451 additions and 121 deletions
				
			
		|  | @ -61,18 +61,6 @@ static const struct grub_arg_option options[] = { | |||
|   {0, 0, 0, 0, 0, 0} | ||||
| }; | ||||
| 
 | ||||
| /* Simple checksum by summing all bytes. Used by ACPI and SMBIOS. */ | ||||
| grub_uint8_t | ||||
| grub_byte_checksum (void *base, grub_size_t size) | ||||
| { | ||||
|   grub_uint8_t *ptr; | ||||
|   grub_uint8_t ret = 0; | ||||
|   for (ptr = (grub_uint8_t *) base; ptr < ((grub_uint8_t *) base) + size; | ||||
|        ptr++) | ||||
|     ret += *ptr; | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| /* rev1 is 1 if ACPIv1 is to be generated, 0 otherwise.
 | ||||
|    rev2 contains the revision of ACPIv2+ to generate or 0 if none. */ | ||||
| static int rev1, rev2; | ||||
|  |  | |||
|  | @ -1,59 +0,0 @@ | |||
| /* acpi.c - get acpi tables. */ | ||||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2009  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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/acpi.h> | ||||
| #include <grub/misc.h> | ||||
| #include <grub/efi/efi.h> | ||||
| #include <grub/efi/api.h> | ||||
| 
 | ||||
| struct grub_acpi_rsdp_v10 * | ||||
| grub_machine_acpi_get_rsdpv1 (void) | ||||
| { | ||||
|   unsigned i; | ||||
|   static grub_efi_packed_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID; | ||||
| 
 | ||||
|   for (i = 0; i < grub_efi_system_table->num_table_entries; i++) | ||||
|     { | ||||
|       grub_efi_packed_guid_t *guid = | ||||
| 	&grub_efi_system_table->configuration_table[i].vendor_guid; | ||||
| 
 | ||||
|       if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_packed_guid_t))) | ||||
| 	return (struct grub_acpi_rsdp_v10 *) | ||||
| 	  grub_efi_system_table->configuration_table[i].vendor_table; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| struct grub_acpi_rsdp_v20 * | ||||
| grub_machine_acpi_get_rsdpv2 (void) | ||||
| { | ||||
|   unsigned i; | ||||
|   static grub_efi_packed_guid_t acpi20_guid = GRUB_EFI_ACPI_20_TABLE_GUID; | ||||
| 
 | ||||
|   for (i = 0; i < grub_efi_system_table->num_table_entries; i++) | ||||
|     { | ||||
|       grub_efi_packed_guid_t *guid = | ||||
| 	&grub_efi_system_table->configuration_table[i].vendor_guid; | ||||
| 
 | ||||
|       if (! grub_memcmp (guid, &acpi20_guid, sizeof (grub_efi_packed_guid_t))) | ||||
| 	return (struct grub_acpi_rsdp_v20 *) | ||||
| 	  grub_efi_system_table->configuration_table[i].vendor_table; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | @ -1,83 +0,0 @@ | |||
| /* acpi.c - get acpi tables. */ | ||||
| /*
 | ||||
|  *  GRUB  --  GRand Unified Bootloader | ||||
|  *  Copyright (C) 2009  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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include <grub/acpi.h> | ||||
| #include <grub/misc.h> | ||||
| 
 | ||||
| struct grub_acpi_rsdp_v10 * | ||||
| grub_machine_acpi_get_rsdpv1 (void) | ||||
| { | ||||
|   int ebda_len; | ||||
|   grub_uint8_t *ebda, *ptr; | ||||
| 
 | ||||
|   grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); | ||||
|   ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4); | ||||
|   ebda_len = * (grub_uint16_t *) ebda; | ||||
|   if (! ebda_len) /* FIXME do we really need this check? */ | ||||
|     goto scan_bios; | ||||
|   for (ptr = ebda; ptr < ebda + 0x400; ptr += 16) | ||||
|     if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 | ||||
| 	&& grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 | ||||
| 	&& ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0) | ||||
|       return (struct grub_acpi_rsdp_v10 *) ptr; | ||||
| 
 | ||||
| scan_bios: | ||||
|   grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n"); | ||||
|   for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000; | ||||
|        ptr += 16) | ||||
|     if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 | ||||
| 	&& grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 | ||||
| 	&& ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0) | ||||
|       return (struct grub_acpi_rsdp_v10 *) ptr; | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| struct grub_acpi_rsdp_v20 * | ||||
| grub_machine_acpi_get_rsdpv2 (void) | ||||
| { | ||||
|   int ebda_len; | ||||
|   grub_uint8_t *ebda, *ptr; | ||||
| 
 | ||||
|   grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); | ||||
|   ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4); | ||||
|   ebda_len = * (grub_uint16_t *) ebda; | ||||
|   if (! ebda_len) /* FIXME do we really need this check? */ | ||||
|     goto scan_bios; | ||||
|   for (ptr = ebda; ptr < ebda + 0x400; ptr += 16) | ||||
|     if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 | ||||
| 	&& grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 | ||||
| 	&& ((struct grub_acpi_rsdp_v10 *) ptr)->revision != 0 | ||||
| 	&& ((struct grub_acpi_rsdp_v20 *) ptr)->length < 1024 | ||||
| 	&& grub_byte_checksum (ptr, ((struct grub_acpi_rsdp_v20 *) ptr)->length) | ||||
| 	== 0) | ||||
|       return (struct grub_acpi_rsdp_v20 *) ptr; | ||||
| 
 | ||||
| scan_bios: | ||||
|   grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n"); | ||||
|   for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000; | ||||
|        ptr += 16) | ||||
|     if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 | ||||
| 	&& grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 | ||||
| 	&& ((struct grub_acpi_rsdp_v10 *) ptr)->revision != 0 | ||||
| 	&& ((struct grub_acpi_rsdp_v20 *) ptr)->length < 1024 | ||||
| 	&& grub_byte_checksum (ptr, ((struct grub_acpi_rsdp_v20 *) ptr)->length) | ||||
| 	== 0) | ||||
|       return (struct grub_acpi_rsdp_v20 *) ptr; | ||||
|   return 0; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue