diff options
Diffstat (limited to 'arch/x86/kernel/tboot.c')
-rw-r--r-- | arch/x86/kernel/tboot.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c index 86c9f91b48a..c2f1b26141e 100644 --- a/arch/x86/kernel/tboot.c +++ b/arch/x86/kernel/tboot.c | |||
@@ -46,6 +46,7 @@ | |||
46 | 46 | ||
47 | /* Global pointer to shared data; NULL means no measured launch. */ | 47 | /* Global pointer to shared data; NULL means no measured launch. */ |
48 | struct tboot *tboot __read_mostly; | 48 | struct tboot *tboot __read_mostly; |
49 | EXPORT_SYMBOL(tboot); | ||
49 | 50 | ||
50 | /* timeout for APs (in secs) to enter wait-for-SIPI state during shutdown */ | 51 | /* timeout for APs (in secs) to enter wait-for-SIPI state during shutdown */ |
51 | #define AP_WAIT_TIMEOUT 1 | 52 | #define AP_WAIT_TIMEOUT 1 |
@@ -175,6 +176,9 @@ static void add_mac_region(phys_addr_t start, unsigned long size) | |||
175 | struct tboot_mac_region *mr; | 176 | struct tboot_mac_region *mr; |
176 | phys_addr_t end = start + size; | 177 | phys_addr_t end = start + size; |
177 | 178 | ||
179 | if (tboot->num_mac_regions >= MAX_TB_MAC_REGIONS) | ||
180 | panic("tboot: Too many MAC regions\n"); | ||
181 | |||
178 | if (start && size) { | 182 | if (start && size) { |
179 | mr = &tboot->mac_regions[tboot->num_mac_regions++]; | 183 | mr = &tboot->mac_regions[tboot->num_mac_regions++]; |
180 | mr->start = round_down(start, PAGE_SIZE); | 184 | mr->start = round_down(start, PAGE_SIZE); |
@@ -184,18 +188,17 @@ static void add_mac_region(phys_addr_t start, unsigned long size) | |||
184 | 188 | ||
185 | static int tboot_setup_sleep(void) | 189 | static int tboot_setup_sleep(void) |
186 | { | 190 | { |
191 | int i; | ||
192 | |||
187 | tboot->num_mac_regions = 0; | 193 | tboot->num_mac_regions = 0; |
188 | 194 | ||
189 | /* S3 resume code */ | 195 | for (i = 0; i < e820.nr_map; i++) { |
190 | add_mac_region(acpi_wakeup_address, WAKEUP_SIZE); | 196 | if ((e820.map[i].type != E820_RAM) |
197 | && (e820.map[i].type != E820_RESERVED_KERN)) | ||
198 | continue; | ||
191 | 199 | ||
192 | #ifdef CONFIG_X86_TRAMPOLINE | 200 | add_mac_region(e820.map[i].addr, e820.map[i].size); |
193 | /* AP trampoline code */ | 201 | } |
194 | add_mac_region(virt_to_phys(trampoline_base), TRAMPOLINE_SIZE); | ||
195 | #endif | ||
196 | |||
197 | /* kernel code + data + bss */ | ||
198 | add_mac_region(virt_to_phys(_text), _end - _text); | ||
199 | 202 | ||
200 | tboot->acpi_sinfo.kernel_s3_resume_vector = acpi_wakeup_address; | 203 | tboot->acpi_sinfo.kernel_s3_resume_vector = acpi_wakeup_address; |
201 | 204 | ||