+2009-06-04 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Allow a compilation without -mcmodel=large
+
+ * kern/efi/mm.c (grub_efi_allocate_pages): don't allocate >4GiB
+ when compiled without -mcmodel=large
+ (filter_memory_map): remove memory post 4 GiB when compiled
+ without -mcmodel=large
+ * configure.ac: fail gracefully and add -DMCMODEL_SMALL=1 to
+ TARGET_CFLAGS when -mcmodel=large isn't supported
+
2009-06-04 Vladimir Serbinenko <phcoder@gmail.com>
Remove nested functions in efiemu core
if test "$target_cpu"-"$platform" = x86_64-efi; then
# Use large model to support 4G memory
AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
- CFLAGS="-m64 -mcmodel=large"
+ SAVED_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -m64 -mcmodel=large"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_mcmodel=yes],
[grub_cv_cc_mcmodel=no])
])
- if test "x$grub_cv_cc_no_mcmodel" = xno; then
- AC_MSG_ERROR([-mcmodel=large not supported, upgrade your gcc])
+ if test "x$grub_cv_cc_mcmodel" = xno; then
+ CFLAGS="$SAVED_CFLAGS -m64 -DMCMODEL_SMALL=1"
+ TARGET_CFLAGS="$TARGET_CFLAGS -DMCMODEL_SMALL=1"
+ AC_MSG_WARN([-mcmodel=large not supported. You wan't be able to use the memory over 4GiB. Upgrade your gcc])
+ else
+ TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
fi
# EFI writes to stack below %rsp, we must not use the red zone
AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
- CFLAGS="-m64 -mno-red-zone"
+ CFLAGS="$CFLAGS -m64 -mno-red-zone"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_no_red_zone=yes],
[grub_cv_cc_no_red_zone=no])
AC_MSG_ERROR([-mno-red-zone not supported, upgrade your gcc])
fi
- TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large -mno-red-zone"
+ TARGET_CFLAGS="$TARGET_CFLAGS -mno-red-zone"
fi
#
/* Limit the memory access to less than 4GB for 32-bit platforms. */
if (address > 0xffffffff)
return 0;
+#endif
+#if GRUB_TARGET_SIZEOF_VOID_P < 8 || defined (MCMODEL_SMALL)
if (address == 0)
{
type = GRUB_EFI_ALLOCATE_MAX_ADDRESS;
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
{
if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY
-#if GRUB_TARGET_SIZEOF_VOID_P < 8
+#if GRUB_TARGET_SIZEOF_VOID_P < 8 || defined (MCMODEL_SMALL)
&& desc->physical_start <= 0xffffffff
#endif
&& desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000
desc->physical_start = 0x100000;
}
-#if GRUB_TARGET_SIZEOF_VOID_P < 8
+#if GRUB_TARGET_SIZEOF_VOID_P < 8 || defined (MCMODEL_SMALL)
if (BYTES_TO_PAGES (filtered_desc->physical_start)
+ filtered_desc->num_pages
> BYTES_TO_PAGES (0x100000000LL))