Loading arch/x86/kernel/e820.c +35 −0 Original line number Diff line number Diff line Loading @@ -429,6 +429,41 @@ u64 __init e820_update_range(u64 start, u64 size, unsigned old_type, return real_updated_size; } /* make e820 not cover the range */ u64 __init e820_remove_range(u64 start, u64 size, unsigned old_type, int checktype) { int i; u64 real_removed_size = 0; for (i = 0; i < e820.nr_map; i++) { struct e820entry *ei = &e820.map[i]; u64 final_start, final_end; if (checktype && ei->type != old_type) continue; /* totally covered? */ if (ei->addr >= start && (ei->addr + ei->size) <= (start + size)) { real_removed_size += ei->size; memset(ei, 0, sizeof(struct e820entry)); continue; } /* partially covered */ final_start = max(start, ei->addr); final_end = min(start + size, ei->addr + ei->size); if (final_start >= final_end) continue; real_removed_size += final_end - final_start; ei->size -= final_end - final_start; if (ei->addr < final_start) continue; ei->addr = final_end; } return real_removed_size; } void __init update_e820(void) { int nr_map; Loading include/asm-x86/e820.h +2 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, int *pnr_map); extern int copy_e820_map(struct e820entry *biosmap, int nr_map); extern u64 e820_update_range(u64 start, u64 size, unsigned old_type, unsigned new_type); extern u64 e820_remove_range(u64 start, u64 size, unsigned old_type, int checktype); extern void update_e820(void); extern void e820_setup_gap(void); struct setup_data; Loading Loading
arch/x86/kernel/e820.c +35 −0 Original line number Diff line number Diff line Loading @@ -429,6 +429,41 @@ u64 __init e820_update_range(u64 start, u64 size, unsigned old_type, return real_updated_size; } /* make e820 not cover the range */ u64 __init e820_remove_range(u64 start, u64 size, unsigned old_type, int checktype) { int i; u64 real_removed_size = 0; for (i = 0; i < e820.nr_map; i++) { struct e820entry *ei = &e820.map[i]; u64 final_start, final_end; if (checktype && ei->type != old_type) continue; /* totally covered? */ if (ei->addr >= start && (ei->addr + ei->size) <= (start + size)) { real_removed_size += ei->size; memset(ei, 0, sizeof(struct e820entry)); continue; } /* partially covered */ final_start = max(start, ei->addr); final_end = min(start + size, ei->addr + ei->size); if (final_start >= final_end) continue; real_removed_size += final_end - final_start; ei->size -= final_end - final_start; if (ei->addr < final_start) continue; ei->addr = final_end; } return real_removed_size; } void __init update_e820(void) { int nr_map; Loading
include/asm-x86/e820.h +2 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, int *pnr_map); extern int copy_e820_map(struct e820entry *biosmap, int nr_map); extern u64 e820_update_range(u64 start, u64 size, unsigned old_type, unsigned new_type); extern u64 e820_remove_range(u64 start, u64 size, unsigned old_type, int checktype); extern void update_e820(void); extern void e820_setup_gap(void); struct setup_data; Loading