Skip to content

Commit

Permalink
Merge branch 'WIP.x86/boot' into x86/boot, to pick up ready branch
Browse files Browse the repository at this point in the history
The E820 rework in WIP.x86/boot has gone through a couple of weeks
of exposure in -tip, merge it in a wider fashion.

Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
Ingo Molnar committed Apr 11, 2017
2 parents 5af2184 + 687d77a commit 4729277
Show file tree
Hide file tree
Showing 66 changed files with 1,045 additions and 880 deletions.
6 changes: 3 additions & 3 deletions Documentation/x86/zero-page.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ Offset Proto Name Meaning
1C0/020 ALL efi_info EFI 32 information (struct efi_info)
1E0/004 ALL alk_mem_k Alternative mem check, in KB
1E4/004 ALL scratch Scratch field for the kernel setup code
1E8/001 ALL e820_entries Number of entries in e820_map (below)
1E8/001 ALL e820_entries Number of entries in e820_table (below)
1E9/001 ALL eddbuf_entries Number of entries in eddbuf (below)
1EA/001 ALL edd_mbr_sig_buf_entries Number of entries in edd_mbr_sig_buffer
(below)
1EB/001 ALL kbd_status Numlock is enabled
1EC/001 ALL secure_boot Secure boot is enabled in the firmware
1EF/001 ALL sentinel Used to detect broken bootloaders
290/040 ALL edd_mbr_sig_buffer EDD MBR signatures
2D0/A00 ALL e820_map E820 memory map table
(array of struct e820entry)
2D0/A00 ALL e820_table E820 memory map table
(array of struct e820_entry)
D00/1EC ALL eddbuf EDD data (array of struct edd_info)
44 changes: 23 additions & 21 deletions arch/x86/boot/compressed/eboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

#include <linux/efi.h>
#include <linux/pci.h>

#include <asm/efi.h>
#include <asm/e820/types.h>
#include <asm/setup.h>
#include <asm/desc.h>

Expand Down Expand Up @@ -729,7 +731,7 @@ static void add_e820ext(struct boot_params *params,
unsigned long size;

e820ext->type = SETUP_E820_EXT;
e820ext->len = nr_entries * sizeof(struct e820entry);
e820ext->len = nr_entries * sizeof(struct boot_e820_entry);
e820ext->next = 0;

data = (struct setup_data *)(unsigned long)params->hdr.setup_data;
Expand All @@ -746,9 +748,9 @@ static void add_e820ext(struct boot_params *params,
static efi_status_t setup_e820(struct boot_params *params,
struct setup_data *e820ext, u32 e820ext_size)
{
struct e820entry *e820_map = &params->e820_map[0];
struct boot_e820_entry *entry = params->e820_table;
struct efi_info *efi = &params->efi_info;
struct e820entry *prev = NULL;
struct boot_e820_entry *prev = NULL;
u32 nr_entries;
u32 nr_desc;
int i;
Expand All @@ -773,31 +775,31 @@ static efi_status_t setup_e820(struct boot_params *params,
case EFI_MEMORY_MAPPED_IO:
case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
case EFI_PAL_CODE:
e820_type = E820_RESERVED;
e820_type = E820_TYPE_RESERVED;
break;

case EFI_UNUSABLE_MEMORY:
e820_type = E820_UNUSABLE;
e820_type = E820_TYPE_UNUSABLE;
break;

case EFI_ACPI_RECLAIM_MEMORY:
e820_type = E820_ACPI;
e820_type = E820_TYPE_ACPI;
break;

case EFI_LOADER_CODE:
case EFI_LOADER_DATA:
case EFI_BOOT_SERVICES_CODE:
case EFI_BOOT_SERVICES_DATA:
case EFI_CONVENTIONAL_MEMORY:
e820_type = E820_RAM;
e820_type = E820_TYPE_RAM;
break;

case EFI_ACPI_MEMORY_NVS:
e820_type = E820_NVS;
e820_type = E820_TYPE_NVS;
break;

case EFI_PERSISTENT_MEMORY:
e820_type = E820_PMEM;
e820_type = E820_TYPE_PMEM;
break;

default:
Expand All @@ -811,26 +813,26 @@ static efi_status_t setup_e820(struct boot_params *params,
continue;
}

if (nr_entries == ARRAY_SIZE(params->e820_map)) {
u32 need = (nr_desc - i) * sizeof(struct e820entry) +
if (nr_entries == ARRAY_SIZE(params->e820_table)) {
u32 need = (nr_desc - i) * sizeof(struct e820_entry) +
sizeof(struct setup_data);

if (!e820ext || e820ext_size < need)
return EFI_BUFFER_TOO_SMALL;

/* boot_params map full, switch to e820 extended */
e820_map = (struct e820entry *)e820ext->data;
entry = (struct boot_e820_entry *)e820ext->data;
}

e820_map->addr = d->phys_addr;
e820_map->size = d->num_pages << PAGE_SHIFT;
e820_map->type = e820_type;
prev = e820_map++;
entry->addr = d->phys_addr;
entry->size = d->num_pages << PAGE_SHIFT;
entry->type = e820_type;
prev = entry++;
nr_entries++;
}

if (nr_entries > ARRAY_SIZE(params->e820_map)) {
u32 nr_e820ext = nr_entries - ARRAY_SIZE(params->e820_map);
if (nr_entries > ARRAY_SIZE(params->e820_table)) {
u32 nr_e820ext = nr_entries - ARRAY_SIZE(params->e820_table);

add_e820ext(params, e820ext, nr_e820ext);
nr_entries -= nr_e820ext;
Expand All @@ -848,7 +850,7 @@ static efi_status_t alloc_e820ext(u32 nr_desc, struct setup_data **e820ext,
unsigned long size;

size = sizeof(struct setup_data) +
sizeof(struct e820entry) * nr_desc;
sizeof(struct e820_entry) * nr_desc;

if (*e820ext) {
efi_call_early(free_pool, *e820ext);
Expand Down Expand Up @@ -884,9 +886,9 @@ static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg,

if (first) {
nr_desc = *map->buff_size / *map->desc_size;
if (nr_desc > ARRAY_SIZE(p->boot_params->e820_map)) {
if (nr_desc > ARRAY_SIZE(p->boot_params->e820_table)) {
u32 nr_e820ext = nr_desc -
ARRAY_SIZE(p->boot_params->e820_map);
ARRAY_SIZE(p->boot_params->e820_table);

status = alloc_e820ext(nr_e820ext, &p->e820ext,
&p->e820ext_size);
Expand Down
6 changes: 3 additions & 3 deletions arch/x86/boot/compressed/kaslr.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ static unsigned long slots_fetch_random(void)
return 0;
}

static void process_e820_entry(struct e820entry *entry,
static void process_e820_entry(struct boot_e820_entry *entry,
unsigned long minimum,
unsigned long image_size)
{
Expand All @@ -435,7 +435,7 @@ static void process_e820_entry(struct e820entry *entry,
unsigned long start_orig;

/* Skip non-RAM entries. */
if (entry->type != E820_RAM)
if (entry->type != E820_TYPE_RAM)
return;

/* On 32-bit, ignore entries entirely above our maximum. */
Expand Down Expand Up @@ -518,7 +518,7 @@ static unsigned long find_random_phys_addr(unsigned long minimum,

/* Verify potential e820 positions, appending to slots list. */
for (i = 0; i < boot_params->e820_entries; i++) {
process_e820_entry(&boot_params->e820_map[i], minimum,
process_e820_entry(&boot_params->e820_table[i], minimum,
image_size);
if (slot_area_index == MAX_SLOT_AREA) {
debug_putstr("Aborted e820 scan (slot_areas full)!\n");
Expand Down
1 change: 0 additions & 1 deletion arch/x86/boot/header.S
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
#include <asm/segment.h>
#include <generated/utsrelease.h>
#include <asm/boot.h>
#include <asm/e820.h>
#include <asm/page_types.h>
#include <asm/setup.h>
#include <asm/bootparam.h>
Expand Down
6 changes: 3 additions & 3 deletions arch/x86/boot/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ static int detect_memory_e820(void)
{
int count = 0;
struct biosregs ireg, oreg;
struct e820entry *desc = boot_params.e820_map;
static struct e820entry buf; /* static so it is zeroed */
struct boot_e820_entry *desc = boot_params.e820_table;
static struct boot_e820_entry buf; /* static so it is zeroed */

initregs(&ireg);
ireg.ax = 0xe820;
Expand Down Expand Up @@ -66,7 +66,7 @@ static int detect_memory_e820(void)

*desc++ = buf;
count++;
} while (ireg.ebx && count < ARRAY_SIZE(boot_params.e820_map));
} while (ireg.ebx && count < ARRAY_SIZE(boot_params.e820_table));

return boot_params.e820_entries = count;
}
Expand Down
2 changes: 2 additions & 0 deletions arch/x86/include/asm/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ extern u8 acpi_sci_flags;
extern int acpi_sci_override_gsi;
void acpi_pic_sci_set_trigger(unsigned int, u16);

struct device;

extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi,
int trigger, int polarity);
extern void (*__acpi_unregister_gsi)(u32 gsi);
Expand Down
73 changes: 0 additions & 73 deletions arch/x86/include/asm/e820.h

This file was deleted.

50 changes: 50 additions & 0 deletions arch/x86/include/asm/e820/api.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#ifndef _ASM_E820_API_H
#define _ASM_E820_API_H

#include <asm/e820/types.h>

extern struct e820_table *e820_table;
extern struct e820_table *e820_table_firmware;

extern unsigned long pci_mem_start;

extern bool e820__mapped_any(u64 start, u64 end, enum e820_type type);
extern bool e820__mapped_all(u64 start, u64 end, enum e820_type type);

extern void e820__range_add (u64 start, u64 size, enum e820_type type);
extern u64 e820__range_update(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type);
extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool check_type);

extern void e820__print_table(char *who);
extern int e820__update_table(struct e820_table *table);
extern void e820__update_table_print(void);

extern unsigned long e820__end_of_ram_pfn(void);
extern unsigned long e820__end_of_low_ram_pfn(void);

extern u64 e820__memblock_alloc_reserved(u64 size, u64 align);
extern void e820__memblock_setup(void);

extern void e820__reserve_setup_data(void);
extern void e820__finish_early_params(void);
extern void e820__reserve_resources(void);
extern void e820__reserve_resources_late(void);

extern void e820__memory_setup(void);
extern void e820__memory_setup_extended(u64 phys_addr, u32 data_len);
extern char *e820__memory_setup_default(void);
extern void e820__setup_pci_gap(void);

extern void e820__reallocate_tables(void);
extern void e820__register_nosave_regions(unsigned long limit_pfn);

/*
* Returns true iff the specified range [start,end) is completely contained inside
* the ISA region.
*/
static inline bool is_ISA_range(u64 start, u64 end)
{
return start >= ISA_START_ADDRESS && end <= ISA_END_ADDRESS;
}

#endif /* _ASM_E820_API_H */
Loading

0 comments on commit 4729277

Please sign in to comment.