*
  */
 int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map,
-                               char *pnr_map)
+                               int *pnr_map)
 {
        struct change_member {
                struct e820entry *pbios; /* pointer to original bios entry */
                return -1;
 
        old_nr = *pnr_map;
+       BUG_ON(old_nr > max_nr_map);
 
        /* bail out if we find any unreasonable addresses in bios map */
        for (i = 0; i < old_nr; i++)
 
 void __init update_e820(void)
 {
-       u8 nr_map;
+       int nr_map;
 
        nr_map = e820.nr_map;
        if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr_map))
 
 char *__init machine_specific_memory_setup(void)
 {
        char *who = "BIOS-e820";
+       int new_nr;
        /*
         * Try to copy the BIOS-supplied E820-map.
         *
         * Otherwise fake a memory map; one section from 0k->640k,
         * the next section from 1mb->appropriate_mem_k
         */
+       new_nr = boot_params.e820_entries;
        sanitize_e820_map(boot_params.e820_map,
                        ARRAY_SIZE(boot_params.e820_map),
-                       &boot_params.e820_entries);
+                       &new_nr);
+       boot_params.e820_entries = new_nr;
        if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0)
                early_panic("Cannot find a valid memory map");
        printk(KERN_INFO "BIOS-provided physical RAM map:\n");
 void __init finish_e820_parsing(void)
 {
        if (userdef) {
-               char nr = e820.nr_map;
+               int nr = e820.nr_map;
 
                if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr) < 0)
                        early_panic("Invalid user supplied memory map");
 
 char * __init machine_specific_memory_setup(void)
 {
        char *who;
+       int new_nr;
 
 
        who = "BIOS-e820";
         * Otherwise fake a memory map; one section from 0k->640k,
         * the next section from 1mb->appropriate_mem_k
         */
+       new_nr = boot_params.e820_entries;
        sanitize_e820_map(boot_params.e820_map,
                        ARRAY_SIZE(boot_params.e820_map),
-                       &boot_params.e820_entries);
+                       &new_nr);
+       boot_params.e820_entries = new_nr;
        if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
            < 0) {
                unsigned long mem_size;
 
 char *__init machine_specific_memory_setup(void)
 {
        char *who;
+       int new_nr;
 
        who = "NOT VOYAGER";
 
         * Otherwise fake a memory map; one section from 0k->640k,
         * the next section from 1mb->appropriate_mem_k
         */
+       new_nr = boot_params.e820_entries;
        sanitize_e820_map(boot_params.e820_map,
                        ARRAY_SIZE(boot_params.e820_map),
-                       &boot_params.e820_entries);
+                       &new_nr);
+       boot_params.e820_entries = new_nr;
        if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries)
            < 0) {
                unsigned long mem_size;
 
 extern void add_memory_region(u64 start, u64 size, int type);
 extern void e820_print_map(char *who);
 extern int
-sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, char *pnr_map);
+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 update_memory_range(u64 start, u64 size, unsigned old_type,
                               unsigned new_type);