Cross Reference: mmap.c
xref
: /
osnet-11
/
usr
/
src
/
grub
/
grub2
/
grub-core
/
kern
/
i386
/
qemu
/
mmap.c
Home
History
Annotate
Line#
Navigate
Download
Search
only in
./
2
N/A
/*
2
N/A
* GRUB -- GRand Unified Bootloader
2
N/A
* Copyright (C) 2009 Free Software Foundation, Inc.
2
N/A
*
2
N/A
* GRUB is free software: you can redistribute it
and
/
or
modify
2
N/A
* it under the terms of the GNU General Public License as published by
2
N/A
* the Free Software Foundation, either version 3 of the License, or
2
N/A
* (at your option) any later version.
2
N/A
*
2
N/A
* GRUB is distributed in the hope that it will be useful,
2
N/A
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2
N/A
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2
N/A
* GNU General Public License for more details.
2
N/A
*
2
N/A
* You should have received a copy of the GNU General Public License
2
N/A
* along with GRUB. If not, see <
http://www.gnu.org/licenses/
>.
2
N/A
*/
2
N/A
2
N/A
#
include
<
grub
/
i386
/
memory.h
>
2
N/A
#
include
<
grub
/
machine
/
memory.h
>
2
N/A
#
include
<
grub
/
machine
/
boot.h
>
2
N/A
#
include
<
grub
/
types.h
>
2
N/A
#
include
<
grub
/
err.h
>
2
N/A
#
include
<
grub
/
misc.h
>
2
N/A
#
include
<
grub
/
cmos.h
>
2
N/A
#
include
<
grub
/
offsets.h
>
2
N/A
2
N/A
#
define
QEMU_CMOS_MEMSIZE_HIGH
0x35
2
N/A
#
define
QEMU_CMOS_MEMSIZE_LOW
0x34
2
N/A
2
N/A
#
define
QEMU_CMOS_MEMSIZE2_HIGH
0x31
2
N/A
#
define
QEMU_CMOS_MEMSIZE2_LOW
0x30
2
N/A
2
N/A
#
define
min
(a,b) ((a) > (b) ? (b) : (a))
2
N/A
2
N/A
extern
char
_start
[];
2
N/A
extern
char
_end
[];
2
N/A
2
N/A
static
grub_uint64_t
mem_size
,
above_4g
;
2
N/A
2
N/A
void
2
N/A
grub_machine_mmap_init
()
2
N/A
{
2
N/A
grub_uint8_t
high
,
low
, b, c, d;
2
N/A
grub_cmos_read
(
QEMU_CMOS_MEMSIZE_HIGH
, &
high
);
2
N/A
grub_cmos_read
(
QEMU_CMOS_MEMSIZE_LOW
, &
low
);
2
N/A
mem_size
= ((
grub_uint64_t
)
high
) <<
24
2
N/A
| ((
grub_uint64_t
)
low
) <<
16
;
2
N/A
if
(
mem_size
> 0)
2
N/A
{
2
N/A
/* Don't ask... */
2
N/A
mem_size
+= (
16
*
1024
*
1024
);
2
N/A
}
2
N/A
else
2
N/A
{
2
N/A
grub_cmos_read
(
QEMU_CMOS_MEMSIZE2_HIGH
, &
high
);
2
N/A
grub_cmos_read
(
QEMU_CMOS_MEMSIZE2_LOW
, &
low
);
2
N/A
mem_size
2
N/A
= ((((
grub_uint64_t
)
high
) <<
18
) | (((
grub_uint64_t
)
low
) <<
10
))
2
N/A
+
1024
*
1024
;
2
N/A
}
2
N/A
2
N/A
grub_cmos_read
(
0x5b
, &b);
2
N/A
grub_cmos_read
(
0x5c
, &c);
2
N/A
grub_cmos_read
(
0x5d
, &d);
2
N/A
above_4g
= (((
grub_uint64_t
) b) <<
16
)
2
N/A
| (((
grub_uint64_t
) c) <<
24
)
2
N/A
| (((
grub_uint64_t
) d) <<
32
);
2
N/A
}
2
N/A
2
N/A
grub_err_t
2
N/A
grub_machine_mmap_iterate
(
grub_memory_hook_t
hook
)
2
N/A
{
2
N/A
if
(
hook
(
0x0
,
2
N/A
(
grub_addr_t
)
_start
,
2
N/A
GRUB_MEMORY_AVAILABLE
))
2
N/A
return
1
;
2
N/A
2
N/A
if
(
hook
((
grub_addr_t
)
_end
,
2
N/A
0xa0000
- (
grub_addr_t
)
_end
,
2
N/A
GRUB_MEMORY_AVAILABLE
))
2
N/A
return
1
;
2
N/A
2
N/A
if
(
hook
(
GRUB_MEMORY_MACHINE_UPPER
,
2
N/A
0x100000
-
GRUB_MEMORY_MACHINE_UPPER
,
2
N/A
GRUB_MEMORY_RESERVED
))
2
N/A
return
1
;
2
N/A
2
N/A
/* Everything else is free. */
2
N/A
if
(
hook
(
0x100000
,
2
N/A
min
(
mem_size
, (
grub_uint32_t
) -
GRUB_BOOT_MACHINE_SIZE
) -
0x100000
,
2
N/A
GRUB_MEMORY_AVAILABLE
))
2
N/A
return
1
;
2
N/A
2
N/A
/* Protect boot.img, which contains the gdt. It is mapped at the top of memory
2
N/A
(it is also mapped below 0x100000, but we already reserved that area). */
2
N/A
if
(
hook
((
grub_uint32_t
) -
GRUB_BOOT_MACHINE_SIZE
,
2
N/A
GRUB_BOOT_MACHINE_SIZE
,
2
N/A
GRUB_MEMORY_RESERVED
))
2
N/A
return
1
;
2
N/A
2
N/A
if
(
above_4g
!= 0 &&
hook
(
0x100000000ULL
,
above_4g
,
2
N/A
GRUB_MEMORY_AVAILABLE
))
2
N/A
return
1
;
2
N/A
2
N/A
return
0;
2
N/A
}