~ubuntu-branches/debian/stretch/grub2/stretch

« back to all changes in this revision

Viewing changes to kern/i386/qemu/mmap.c

Tags: upstream-1.98+20100705
ImportĀ upstreamĀ versionĀ 1.98+20100705

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#define QEMU_CMOS_MEMSIZE_HIGH          0x35
28
28
#define QEMU_CMOS_MEMSIZE_LOW           0x34
29
29
 
 
30
#define QEMU_CMOS_MEMSIZE2_HIGH         0x31
 
31
#define QEMU_CMOS_MEMSIZE2_LOW          0x30
 
32
 
30
33
#define min(a,b)        ((a) > (b) ? (b) : (a))
31
34
 
32
35
extern char _start[];
33
36
extern char _end[];
34
37
 
35
 
grub_size_t grub_lower_mem, grub_upper_mem;
36
 
grub_uint64_t mem_size;
 
38
static grub_uint64_t mem_size, above_4g;
37
39
 
38
40
void
39
41
grub_machine_mmap_init ()
40
42
{
41
 
  mem_size = grub_cmos_read (QEMU_CMOS_MEMSIZE_HIGH) << 24 | grub_cmos_read (QEMU_CMOS_MEMSIZE_LOW) << 16;
 
43
  mem_size = ((grub_uint64_t) grub_cmos_read (QEMU_CMOS_MEMSIZE_HIGH)) << 24
 
44
    | ((grub_uint64_t) grub_cmos_read (QEMU_CMOS_MEMSIZE_LOW)) << 16;
 
45
  if (mem_size > 0)
 
46
    {
 
47
      /* Don't ask... */
 
48
      mem_size += (16 * 1024 * 1024);
 
49
    }
 
50
  else
 
51
    {
 
52
      mem_size
 
53
        = ((((grub_uint64_t) grub_cmos_read (QEMU_CMOS_MEMSIZE2_HIGH)) << 18)
 
54
           | ((grub_uint64_t) (grub_cmos_read (QEMU_CMOS_MEMSIZE2_LOW)) << 10))
 
55
        + 1024 * 1024;
 
56
    }
42
57
 
43
 
  /* Don't ask... */
44
 
  mem_size += (16 * 1024 * 1024);
 
58
  above_4g = (((grub_uint64_t) grub_cmos_read (0x5b)) << 16)
 
59
    | (((grub_uint64_t) grub_cmos_read (0x5c)) << 24)
 
60
    | (((grub_uint64_t) grub_cmos_read (0x5d)) << 32);
45
61
}
46
62
 
47
63
grub_err_t
57
73
            GRUB_MACHINE_MEMORY_RESERVED))
58
74
    return 1;
59
75
 
 
76
  /* Everything else is free.  */
 
77
  if (hook (0x100000,
 
78
            min (mem_size, (grub_uint32_t) -GRUB_BOOT_MACHINE_SIZE) - 0x100000,
 
79
            GRUB_MACHINE_MEMORY_AVAILABLE))
 
80
    return 1;
 
81
 
60
82
  /* Protect boot.img, which contains the gdt.  It is mapped at the top of memory
61
83
     (it is also mapped below 0x100000, but we already reserved that area).  */
62
84
  if (hook ((grub_uint32_t) -GRUB_BOOT_MACHINE_SIZE,
64
86
            GRUB_MACHINE_MEMORY_RESERVED))
65
87
    return 1;
66
88
 
67
 
  /* Everything else is free.  */
68
 
  if (hook (0x100000,
69
 
            min (mem_size, (grub_uint32_t) -GRUB_BOOT_MACHINE_SIZE) - 0x100000,
70
 
            GRUB_MACHINE_MEMORY_AVAILABLE))
 
89
  if (above_4g != 0 && hook (0x100000000ULL, above_4g,
 
90
                             GRUB_MACHINE_MEMORY_AVAILABLE))
71
91
    return 1;
72
92
 
73
93
  return 0;