From: Joseph C. <jos...@in...> - 2011-02-14 22:45:54
|
changeset 6ed02bd1dd7d in /var/www/tboot.hg details: tboot.hg?cmd=changeset;node=6ed02bd1dd7d description: Removed no_usb command line parameter and SMI disabling It was found that on some BIOSes and platforms, when legacy USB SMIs were disabled, that the system would reset or that it would generate DMA errors in an internal register. Given this, it is best to remove this capability from the code and revert to the previous behavior of simply reserving any memory above the upper reserved regions and tuncating for VT-d. This change essentially reverts c/s 217. Signed-off-by: Joseph Cihula <jos...@in...> diffstat: README | 9 --- tboot/common/acpi.c | 13 ---- tboot/common/cmdline.c | 11 --- tboot/common/e820.c | 122 ++++++++++++++-------------------------- tboot/common/tboot.c | 4 - tboot/include/cmdline.h | 1 - tboot/include/printk.h | 1 - 7 files changed, 44 insertions(+), 117 deletions(-) diffs (247 lines): diff -r 2532ddd46f57 -r 6ed02bd1dd7d README --- a/README Tue Nov 02 12:32:20 2010 -0700 +++ b/README Mon Feb 14 13:52:00 2011 -0800 @@ -123,15 +123,6 @@ The default values for these are: serial=115200,8n1,0x3f8. -o Disabling legacy USB SMIs: - By default, tboot will disable legacy USB SMIs, which allows it to avoid - wasting memory due to DMA protection. By disabling SMIs, tboot can DMA - protect all memory, even the BIOS reserved regions (since even though there - may be USB buffers in them, no SMIs will be generated). However, this has - effect of disabling a USB keyboard until the VMM/kernel starts a USB stack. - This behavior can be disabled by setting the command line option "no_usb" - to false (e.g. "no_usb=false"). - o tboot will attempt to seal the module measurements using the TPM so that if it is put into S3 it can restore the correct PCR values on resume. In order for this to work, the TPM must be owned and the SRK auth must be set to all diff -r 2532ddd46f57 -r 6ed02bd1dd7d tboot/common/acpi.c --- a/tboot/common/acpi.c Tue Nov 02 12:32:20 2010 -0700 +++ b/tboot/common/acpi.c Mon Feb 14 13:52:00 2011 -0800 @@ -51,8 +51,6 @@ #define acpi_printk(...) /* */ #endif -bool g_no_usb = true; - static struct acpi_rsdp *rsdp; static struct acpi_table_header *g_dmar_table; static __data bool g_hide_dmar; @@ -439,17 +437,6 @@ acpi_printk("wakeup_vector_value = %llxx\n", resume_vector); } -void disable_smis(void) -{ - if ( g_no_usb ) { - printk("disabling legacy USB SMIs\n"); - uint32_t pmbase = pcireg_cfgread(0, 31, 0, 0x40, 4) & ~1; - uint32_t smi_en = inl(pmbase + 0x30); - smi_en &= ~0x20008; - outl(pmbase + 0x30, smi_en); - } -} - /* * Local variables: * mode: C diff -r 2532ddd46f57 -r 6ed02bd1dd7d tboot/common/cmdline.c --- a/tboot/common/cmdline.c Tue Nov 02 12:32:20 2010 -0700 +++ b/tboot/common/cmdline.c Mon Feb 14 13:52:00 2011 -0800 @@ -71,7 +71,6 @@ { "serial", "115200,8n1,0x3f8" }, /* serial=<baud>[/<clock_hz>][,<DPS>[,<io-base>[,<irq>[,<serial-bdf>[,<bridge-bdf>]]]]] */ { "vga_delay", "0" }, /* # secs */ - { "no_usb", "true" }, /* true|false */ { NULL, NULL } }; static char g_tboot_param_values[ARRAY_SIZE(g_tboot_cmdline_options)][MAX_VALUE_LEN]; @@ -431,16 +430,6 @@ g_vga_delay = strtoul(vga_delay, NULL, 0); } -void get_tboot_no_usb(void) -{ - const char *no_usb = get_option_val(g_tboot_cmdline_options, - g_tboot_param_values, "no_usb"); - if ( no_usb == NULL ) - return; - - g_no_usb = ( strcmp(no_usb, "true") == 0 ); -} - /* * linux kernel command line parsing diff -r 2532ddd46f57 -r 6ed02bd1dd7d tboot/common/e820.c --- a/tboot/common/e820.c Tue Nov 02 12:32:20 2010 -0700 +++ b/tboot/common/e820.c Mon Feb 14 13:52:00 2011 -0800 @@ -558,86 +558,52 @@ min_hi_ram == NULL || max_hi_ram == NULL ) return false; - /* true means we will disable USB SMIs, and thus can protect all RAM */ - get_tboot_no_usb(); - if ( g_no_usb ) { - uint64_t above_base, above_size; + *min_lo_ram = *min_hi_ram = ~0ULL; + *max_lo_ram = *max_hi_ram = 0; + bool found_reserved_region = false; - /* don't use TOLUD since that covers stolen regions; bottom of - DPR is the memory usable by OS and that needs DMA protection */ - txt_dpr_t dpr; - dpr._raw = read_pub_config_reg(TXTCR_DPR); - uint64_t dpr_bottom = ((uint64_t)dpr.top << 20) - (dpr.size * 1024*1024); - /* round up to 2MB so that we don't have to truncate memory for VT-d - (this will still be within DPR, so no problems) */ - dpr_bottom = (dpr_bottom + 0x200000ULL - 1) & ~0x1fffffULL; - /* we need to ensure that there are no RAM regions above max lo */ - get_highest_sized_ram(1, 0x100000000ULL, &above_base, &above_size); - if ( above_base + above_size > dpr_bottom ) { - printk("e820 has RAM region above DPR (0x%Lx): 0x%Lx - 0x%Lx\n", - dpr_bottom, above_base, above_base+above_size); - return false; + for ( unsigned int i = 0; i < g_nr_map; i++ ) { + memory_map_t *entry = &g_copy_e820_map[i]; + uint64_t base = e820_base_64(entry); + uint64_t limit = base + e820_length_64(entry); + + if ( entry->type == E820_RAM ) { + /* if range straddles 4GB boundary, that is an error */ + if ( base < 0x100000000ULL && limit > 0x100000000ULL ) { + printk("e820 memory range straddles 4GB boundary\n"); + return false; + } + + /* + * some BIOSes put legacy USB buffers in reserved regions <4GB, + * which if DMA protected cause SMM to hang, so make sure that + * we don't overlap any of these even if that wastes RAM + */ + if ( !found_reserved_region ) { + if ( base < 0x100000000ULL && base < *min_lo_ram ) + *min_lo_ram = base; + if ( limit <= 0x100000000ULL && limit > *max_lo_ram ) + *max_lo_ram = limit; + } + else { /* need to reserve low RAM above reserved regions */ + if ( base < 0x100000000ULL ) { + printk("discarding RAM above reserved regions: 0x%Lx - 0x%Lx\n", base, limit); + if ( !e820_reserve_ram(base, limit - base) ) + return false; + } + } + + if ( base >= 0x100000000ULL && base < *min_hi_ram ) + *min_hi_ram = base; + if ( limit > 0x100000000ULL && limit > *max_hi_ram ) + *max_hi_ram = limit; } - *min_lo_ram = 0; - *max_lo_ram = dpr_bottom; - - /* get hi memory from e820 map */ - get_highest_sized_ram(1, ~0ULL, &above_base, &above_size); - if ( above_base + above_size > 0x100000000ULL ) { - *min_hi_ram = 0x100000000ULL; - *max_hi_ram = above_base + above_size; - } - else - *min_hi_ram = *max_hi_ram = 0; - } - else { - *min_lo_ram = *min_hi_ram = ~0ULL; - *max_lo_ram = *max_hi_ram = 0; - bool found_reserved_region = false; - - for ( unsigned int i = 0; i < g_nr_map; i++ ) { - memory_map_t *entry = &g_copy_e820_map[i]; - uint64_t base = e820_base_64(entry); - uint64_t limit = base + e820_length_64(entry); - - if ( entry->type == E820_RAM ) { - /* if range straddles 4GB boundary, that is an error */ - if ( base < 0x100000000ULL && limit > 0x100000000ULL ) { - printk("e820 memory range straddles 4GB boundary\n"); - return false; - } - - /* - * some BIOSes put legacy USB buffers in reserved regions <4GB, - * which if DMA protected cause SMM to hang, so make sure that - * we don't overlap any of these even if that wastes RAM - */ - if ( !found_reserved_region ) { - if ( base < 0x100000000ULL && base < *min_lo_ram ) - *min_lo_ram = base; - if ( limit <= 0x100000000ULL && limit > *max_lo_ram ) - *max_lo_ram = limit; - } - else { /* need to reserve low RAM above reserved regions */ - if ( base < 0x100000000ULL ) { - printk("discarding RAM above reserved regions: 0x%Lx - 0x%Lx\n", base, limit); - if ( !e820_reserve_ram(base, limit - base) ) - return false; - } - } - - if ( base >= 0x100000000ULL && base < *min_hi_ram ) - *min_hi_ram = base; - if ( limit > 0x100000000ULL && limit > *max_hi_ram ) - *max_hi_ram = limit; - } - else { - /* parts of low memory may be reserved for cseg, ISA hole, - etc. but these seem OK to DMA protect, so ignore reserved - regions <0x100000 */ - if ( *min_lo_ram != ~0ULL && limit > 0x100000ULL ) - found_reserved_region = true; - } + else { + /* parts of low memory may be reserved for cseg, ISA hole, + etc. but these seem OK to DMA protect, so ignore reserved + regions <0x100000 */ + if ( *min_lo_ram != ~0ULL && limit > 0x100000ULL ) + found_reserved_region = true; } } diff -r 2532ddd46f57 -r 6ed02bd1dd7d tboot/common/tboot.c --- a/tboot/common/tboot.c Tue Nov 02 12:32:20 2010 -0700 +++ b/tboot/common/tboot.c Mon Feb 14 13:52:00 2011 -0800 @@ -333,10 +333,6 @@ if ( !prepare_cpu() ) apply_policy(TB_ERR_FATAL); - /* disable legacy USB #SMIs */ - get_tboot_no_usb(); - disable_smis(); - /* do s3 launch directly, if is a s3 resume */ if ( s3_flag ) { txt_s3_launch_environment(); diff -r 2532ddd46f57 -r 6ed02bd1dd7d tboot/include/cmdline.h --- a/tboot/include/cmdline.h Tue Nov 02 12:32:20 2010 -0700 +++ b/tboot/include/cmdline.h Mon Feb 14 13:52:00 2011 -0800 @@ -47,7 +47,6 @@ extern void get_tboot_baud(void); extern void get_tboot_fmt(void); extern void get_tboot_vga_delay(void); -extern void get_tboot_no_usb(void); /* for parse cmdline of linux kernel, say vga and mem */ extern void linux_parse_cmdline(char *cmdline); diff -r 2532ddd46f57 -r 6ed02bd1dd7d tboot/include/printk.h --- a/tboot/include/printk.h Tue Nov 02 12:32:20 2010 -0700 +++ b/tboot/include/printk.h Mon Feb 14 13:52:00 2011 -0800 @@ -53,7 +53,6 @@ extern uint8_t g_log_targets; extern uint8_t g_vga_delay; extern serial_port_t g_com_port; -extern bool g_no_usb; #define serial_init() comc_init() #define serial_write(s, n) comc_puts(s, n) |