Merge upstream changes as of April 29th
This commit is contained in:
commit
c7c750ecc2
267 changed files with 6019 additions and 1963 deletions
|
@ -58,25 +58,22 @@ FUNCTION(__aeabi_lmul)
|
|||
ldmfd sp!, {r4, fp}
|
||||
bx lr
|
||||
|
||||
.macro division parent
|
||||
.macro division32 parent
|
||||
|
||||
stmfd sp!, {lr}
|
||||
sub sp, sp, #12
|
||||
mov r2, r1
|
||||
add r1, sp, #4
|
||||
str r1, [sp, #0]
|
||||
mov r1, #0
|
||||
mov r3, #0
|
||||
sub sp, sp, #8 @ Allocate naturally aligned 64-bit space
|
||||
stmfd sp!, {r3,lr} @ Dummy r3 to maintain stack alignment
|
||||
add r2, sp, #8 @ Set r2 to address of 64-bit space
|
||||
bl \parent
|
||||
ldr r1, [sp, #4]
|
||||
add sp, sp, #12
|
||||
ldmfd sp!, {lr}
|
||||
ldr r1, [sp, #8] @ Extract remainder
|
||||
ldmfd sp!, {r3,lr} @ Pop into an unused arg/scratch register
|
||||
add sp, sp, #8
|
||||
bx lr
|
||||
.endm
|
||||
|
||||
FUNCTION(__aeabi_uidivmod)
|
||||
division grub_divmod64
|
||||
|
||||
division32 grub_divmod32
|
||||
FUNCTION(__aeabi_idivmod)
|
||||
division32 grub_divmod32s
|
||||
|
||||
/*
|
||||
* Null divide-by-zero handler
|
|
@ -78,9 +78,9 @@ grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
|||
const Elf_Rel *rel, *max;
|
||||
|
||||
for (rel = (const Elf_Rel *) ((grub_addr_t) e + s->sh_offset),
|
||||
max = rel + s->sh_size / s->sh_entsize;
|
||||
rel < max;
|
||||
rel++)
|
||||
max = (const Elf_Rel *) ((grub_addr_t) rel + s->sh_size);
|
||||
rel + 1 <= max;
|
||||
rel = (const Elf_Rel *) ((grub_addr_t) rel + s->sh_entsize))
|
||||
switch (ELF_R_TYPE (rel->r_info))
|
||||
{
|
||||
case R_ARM_CALL:
|
||||
|
@ -205,6 +205,21 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
|||
*/
|
||||
case R_ARM_V4BX:
|
||||
break;
|
||||
case R_ARM_THM_MOVW_ABS_NC:
|
||||
case R_ARM_THM_MOVT_ABS:
|
||||
{
|
||||
grub_uint32_t offset;
|
||||
offset = grub_arm_thm_movw_movt_get_value((grub_uint16_t *) target);
|
||||
offset += sym_addr;
|
||||
|
||||
if (ELF_R_TYPE (rel->r_info) == R_ARM_THM_MOVT_ABS)
|
||||
offset >>= 16;
|
||||
else
|
||||
offset &= 0xffff;
|
||||
|
||||
grub_arm_thm_movw_movt_set_value((grub_uint16_t *) target, offset);
|
||||
}
|
||||
break;
|
||||
case R_ARM_THM_JUMP19:
|
||||
{
|
||||
/* Thumb instructions can be 16-bit aligned */
|
||||
|
|
|
@ -25,6 +25,20 @@
|
|||
#include <grub/i18n.h>
|
||||
#include <grub/arm/reloc.h>
|
||||
|
||||
static inline grub_uint32_t
|
||||
thumb_get_instruction_word (grub_uint16_t *target)
|
||||
{
|
||||
/* Extract instruction word in alignment-safe manner */
|
||||
return grub_le_to_cpu16 ((*target)) << 16 | grub_le_to_cpu16 (*(target + 1));
|
||||
}
|
||||
|
||||
static inline void
|
||||
thumb_set_instruction_word (grub_uint16_t *target, grub_uint32_t insword)
|
||||
{
|
||||
*target = grub_cpu_to_le16 (insword >> 16);
|
||||
*(target + 1) = grub_cpu_to_le16 (insword & 0xffff);
|
||||
}
|
||||
|
||||
/*
|
||||
* R_ARM_ABS32
|
||||
*
|
||||
|
@ -56,9 +70,7 @@ grub_arm_thm_call_get_offset (grub_uint16_t *target)
|
|||
grub_uint32_t insword;
|
||||
grub_int32_t offset;
|
||||
|
||||
/* Extract instruction word in alignment-safe manner */
|
||||
insword = (grub_le_to_cpu16 (*target) << 16)
|
||||
| (grub_le_to_cpu16(*(target + 1)));
|
||||
insword = thumb_get_instruction_word (target);
|
||||
|
||||
/* Extract bitfields from instruction words */
|
||||
sign = (insword >> 26) & 1;
|
||||
|
@ -83,9 +95,7 @@ grub_arm_thm_call_set_offset (grub_uint16_t *target, grub_int32_t offset)
|
|||
grub_uint32_t insword;
|
||||
int is_blx;
|
||||
|
||||
/* Extract instruction word in alignment-safe manner */
|
||||
insword = (grub_le_to_cpu16 (*target) << 16)
|
||||
| (grub_le_to_cpu16(*(target + 1)));
|
||||
insword = thumb_get_instruction_word (target);
|
||||
|
||||
if (((insword >> 12) & 0xd) == 0xc)
|
||||
is_blx = 1;
|
||||
|
@ -108,9 +118,7 @@ grub_arm_thm_call_set_offset (grub_uint16_t *target, grub_int32_t offset)
|
|||
(((offset >> 12) & 0x03ff) << 16) |
|
||||
(j1 << 13) | (j2 << 11) | ((offset >> 1) & 0x07ff);
|
||||
|
||||
/* Write instruction word back in alignment-safe manner */
|
||||
*target = grub_cpu_to_le16 ((insword >> 16) & 0xffff);
|
||||
*(target + 1) = grub_cpu_to_le16 (insword & 0xffff);
|
||||
thumb_set_instruction_word (target, insword);
|
||||
|
||||
grub_dprintf ("dl", " *insword = 0x%08x", insword);
|
||||
|
||||
|
@ -123,9 +131,7 @@ grub_arm_thm_jump19_get_offset (grub_uint16_t *target)
|
|||
grub_int32_t offset;
|
||||
grub_uint32_t insword;
|
||||
|
||||
/* Extract instruction word in alignment-safe manner */
|
||||
insword = (grub_le_to_cpu16 (*target) << 16)
|
||||
| (grub_le_to_cpu16(*(target + 1)));
|
||||
insword = thumb_get_instruction_word (target);
|
||||
|
||||
/* Extract and sign extend offset */
|
||||
offset = ((insword >> 26) & 1) << 19
|
||||
|
@ -149,9 +155,7 @@ grub_arm_thm_jump19_set_offset (grub_uint16_t *target, grub_int32_t offset)
|
|||
offset >>= 1;
|
||||
offset &= 0xfffff;
|
||||
|
||||
/* Extract instruction word in alignment-safe manner */
|
||||
insword = grub_le_to_cpu16 ((*target)) << 16
|
||||
| grub_le_to_cpu16 (*(target + 1));
|
||||
insword = thumb_get_instruction_word (target);
|
||||
|
||||
/* Reassemble instruction word and write back */
|
||||
insword &= insmask;
|
||||
|
@ -160,8 +164,7 @@ grub_arm_thm_jump19_set_offset (grub_uint16_t *target, grub_int32_t offset)
|
|||
| ((offset >> 17) & 1) << 13
|
||||
| ((offset >> 11) & 0x3f) << 16
|
||||
| (offset & 0x7ff);
|
||||
*target = grub_cpu_to_le16 (insword >> 16);
|
||||
*(target + 1) = grub_cpu_to_le16 (insword & 0xffff);
|
||||
thumb_set_instruction_word (target, insword);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -172,6 +175,32 @@ grub_arm_thm_jump19_check_offset (grub_int32_t offset)
|
|||
return 1;
|
||||
}
|
||||
|
||||
grub_uint16_t
|
||||
grub_arm_thm_movw_movt_get_value (grub_uint16_t *target)
|
||||
{
|
||||
grub_uint32_t insword;
|
||||
|
||||
insword = thumb_get_instruction_word (target);
|
||||
|
||||
return ((insword & 0xf0000) >> 4) | ((insword & 0x04000000) >> 15) | \
|
||||
((insword & 0x7000) >> 4) | (insword & 0xff);
|
||||
}
|
||||
|
||||
void
|
||||
grub_arm_thm_movw_movt_set_value (grub_uint16_t *target, grub_uint16_t value)
|
||||
{
|
||||
grub_uint32_t insword;
|
||||
const grub_uint32_t insmask = 0xfbf08f00;
|
||||
|
||||
insword = thumb_get_instruction_word (target);
|
||||
insword &= insmask;
|
||||
|
||||
insword |= ((value & 0xf000) << 4) | ((value & 0x0800) << 15) | \
|
||||
((value & 0x0700) << 4) | (value & 0xff);
|
||||
|
||||
thumb_set_instruction_word (target, insword);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************
|
||||
* ARM (A32) relocations: *
|
||||
|
|
404
grub-core/kern/compiler-rt.c
Normal file
404
grub-core/kern/compiler-rt.c
Normal file
|
@ -0,0 +1,404 @@
|
|||
/* compiler-rt.c - compiler helpers. */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010-2014 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/misc.h>
|
||||
#include <grub/compiler-rt.h>
|
||||
|
||||
#ifndef GRUB_EMBED_DECOMPRESSOR
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
memcpy (void *dest, const void *src, grub_size_t n)
|
||||
{
|
||||
return grub_memmove (dest, src, n);
|
||||
}
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
memmove (void *dest, const void *src, grub_size_t n)
|
||||
{
|
||||
return grub_memmove (dest, src, n);
|
||||
}
|
||||
int GRUB_BUILTIN_ATTR
|
||||
memcmp (const void *s1, const void *s2, grub_size_t n)
|
||||
{
|
||||
return grub_memcmp (s1, s2, n);
|
||||
}
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
memset (void *s, int c, grub_size_t n)
|
||||
{
|
||||
return grub_memset (s, c, n);
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
||||
void GRUB_BUILTIN_ATTR
|
||||
__bzero (void *s, grub_size_t n)
|
||||
{
|
||||
grub_memset (s, 0, n);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if GRUB_DIVISION_IN_SOFTWARE
|
||||
|
||||
grub_uint32_t
|
||||
__udivsi3 (grub_uint32_t a, grub_uint32_t b)
|
||||
{
|
||||
return grub_divmod64 (a, b, 0);
|
||||
}
|
||||
|
||||
grub_int32_t
|
||||
__divsi3 (grub_int32_t a, grub_int32_t b)
|
||||
{
|
||||
return grub_divmod64s (a, b, 0);
|
||||
}
|
||||
|
||||
grub_uint32_t
|
||||
__umodsi3 (grub_uint32_t a, grub_uint32_t b)
|
||||
{
|
||||
grub_uint64_t ret;
|
||||
grub_divmod64 (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_int32_t
|
||||
__modsi3 (grub_int32_t a, grub_int32_t b)
|
||||
{
|
||||
grub_int64_t ret;
|
||||
grub_divmod64s (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
__udivdi3 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
return grub_divmod64 (a, b, 0);
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
__umoddi3 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
grub_uint64_t ret;
|
||||
grub_divmod64 (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_int64_t
|
||||
__divdi3 (grub_int64_t a, grub_int64_t b)
|
||||
{
|
||||
return grub_divmod64s (a, b, 0);
|
||||
}
|
||||
|
||||
grub_int64_t
|
||||
__moddi3 (grub_int64_t a, grub_int64_t b)
|
||||
{
|
||||
grub_int64_t ret;
|
||||
grub_divmod64s (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef NEED_CTZDI2
|
||||
|
||||
unsigned
|
||||
__ctzdi2 (grub_uint64_t x)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
if (!x)
|
||||
return 64;
|
||||
if (!(x & 0xffffffff))
|
||||
{
|
||||
x >>= 32;
|
||||
ret |= 32;
|
||||
}
|
||||
if (!(x & 0xffff))
|
||||
{
|
||||
x >>= 16;
|
||||
ret |= 16;
|
||||
}
|
||||
if (!(x & 0xff))
|
||||
{
|
||||
x >>= 8;
|
||||
ret |= 8;
|
||||
}
|
||||
if (!(x & 0xf))
|
||||
{
|
||||
x >>= 4;
|
||||
ret |= 4;
|
||||
}
|
||||
if (!(x & 0x3))
|
||||
{
|
||||
x >>= 2;
|
||||
ret |= 2;
|
||||
}
|
||||
if (!(x & 0x1))
|
||||
{
|
||||
x >>= 1;
|
||||
ret |= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef NEED_CTZSI2
|
||||
unsigned
|
||||
__ctzsi2 (grub_uint32_t x)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
if (!x)
|
||||
return 32;
|
||||
|
||||
if (!(x & 0xffff))
|
||||
{
|
||||
x >>= 16;
|
||||
ret |= 16;
|
||||
}
|
||||
if (!(x & 0xff))
|
||||
{
|
||||
x >>= 8;
|
||||
ret |= 8;
|
||||
}
|
||||
if (!(x & 0xf))
|
||||
{
|
||||
x >>= 4;
|
||||
ret |= 4;
|
||||
}
|
||||
if (!(x & 0x3))
|
||||
{
|
||||
x >>= 2;
|
||||
ret |= 2;
|
||||
}
|
||||
if (!(x & 0x1))
|
||||
{
|
||||
x >>= 1;
|
||||
ret |= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if defined (__clang__) && !defined(GRUB_EMBED_DECOMPRESSOR)
|
||||
/* clang emits references to abort(). */
|
||||
void __attribute__ ((noreturn))
|
||||
abort (void)
|
||||
{
|
||||
grub_fatal ("compiler abort");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (defined (__MINGW32__) || defined (__CYGWIN__))
|
||||
void __register_frame_info (void)
|
||||
{
|
||||
}
|
||||
|
||||
void __deregister_frame_info (void)
|
||||
{
|
||||
}
|
||||
|
||||
void ___chkstk_ms (void)
|
||||
{
|
||||
}
|
||||
|
||||
void __chkstk_ms (void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
union component64
|
||||
{
|
||||
grub_uint64_t full;
|
||||
struct
|
||||
{
|
||||
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||
grub_uint32_t high;
|
||||
grub_uint32_t low;
|
||||
#else
|
||||
grub_uint32_t low;
|
||||
grub_uint32_t high;
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
#if defined (__powerpc__) || defined (__arm__) || defined(__mips__)
|
||||
|
||||
/* Based on libgcc2.c from gcc suite. */
|
||||
grub_uint64_t
|
||||
__lshrdi3 (grub_uint64_t u, int b)
|
||||
{
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
const union component64 uu = {.full = u};
|
||||
const int bm = 32 - b;
|
||||
union component64 w;
|
||||
|
||||
if (bm <= 0)
|
||||
{
|
||||
w.high = 0;
|
||||
w.low = (grub_uint32_t) uu.high >> -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
const grub_uint32_t carries = (grub_uint32_t) uu.high << bm;
|
||||
|
||||
w.high = (grub_uint32_t) uu.high >> b;
|
||||
w.low = ((grub_uint32_t) uu.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.full;
|
||||
}
|
||||
|
||||
/* Based on libgcc2.c from gcc suite. */
|
||||
grub_uint64_t
|
||||
__ashrdi3 (grub_uint64_t u, int b)
|
||||
{
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
const union component64 uu = {.full = u};
|
||||
const int bm = 32 - b;
|
||||
union component64 w;
|
||||
|
||||
if (bm <= 0)
|
||||
{
|
||||
/* w.high = 1..1 or 0..0 */
|
||||
w.high = ((grub_int32_t) uu.high) >> (32 - 1);
|
||||
w.low = ((grub_int32_t) uu.high) >> -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
const grub_uint32_t carries = ((grub_uint32_t) uu.high) << bm;
|
||||
|
||||
w.high = ((grub_int32_t) uu.high) >> b;
|
||||
w.low = ((grub_uint32_t) uu.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.full;
|
||||
}
|
||||
|
||||
/* Based on libgcc2.c from gcc suite. */
|
||||
grub_uint64_t
|
||||
__ashldi3 (grub_uint64_t u, int b)
|
||||
{
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
const union component64 uu = {.full = u};
|
||||
const int bm = 32 - b;
|
||||
union component64 w;
|
||||
|
||||
if (bm <= 0)
|
||||
{
|
||||
w.low = 0;
|
||||
w.high = (grub_uint32_t) uu.low << -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
const grub_uint32_t carries = (grub_uint32_t) uu.low >> bm;
|
||||
|
||||
w.low = (grub_uint32_t) uu.low << b;
|
||||
w.high = ((grub_uint32_t) uu.high << b) | carries;
|
||||
}
|
||||
|
||||
return w.full;
|
||||
}
|
||||
|
||||
/* Based on libgcc2.c from gcc suite. */
|
||||
int
|
||||
__ucmpdi2 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
union component64 ac, bc;
|
||||
ac.full = a;
|
||||
bc.full = b;
|
||||
|
||||
if (ac.high < bc.high)
|
||||
return 0;
|
||||
else if (ac.high > bc.high)
|
||||
return 2;
|
||||
|
||||
if (ac.low < bc.low)
|
||||
return 0;
|
||||
else if (ac.low > bc.low)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined (__powerpc__) || defined(__mips__) || defined(__sparc__) || defined(__arm__)
|
||||
|
||||
/* Based on libgcc2.c from gcc suite. */
|
||||
grub_uint32_t
|
||||
__bswapsi2 (grub_uint32_t u)
|
||||
{
|
||||
return ((((u) & 0xff000000) >> 24)
|
||||
| (((u) & 0x00ff0000) >> 8)
|
||||
| (((u) & 0x0000ff00) << 8)
|
||||
| (((u) & 0x000000ff) << 24));
|
||||
}
|
||||
|
||||
/* Based on libgcc2.c from gcc suite. */
|
||||
grub_uint64_t
|
||||
__bswapdi2 (grub_uint64_t u)
|
||||
{
|
||||
return ((((u) & 0xff00000000000000ull) >> 56)
|
||||
| (((u) & 0x00ff000000000000ull) >> 40)
|
||||
| (((u) & 0x0000ff0000000000ull) >> 24)
|
||||
| (((u) & 0x000000ff00000000ull) >> 8)
|
||||
| (((u) & 0x00000000ff000000ull) << 8)
|
||||
| (((u) & 0x0000000000ff0000ull) << 24)
|
||||
| (((u) & 0x000000000000ff00ull) << 40)
|
||||
| (((u) & 0x00000000000000ffull) << 56));
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __arm__
|
||||
grub_uint32_t
|
||||
__aeabi_uidiv (grub_uint32_t a, grub_uint32_t b)
|
||||
__attribute__ ((alias ("__udivsi3")));
|
||||
grub_int32_t
|
||||
__aeabi_idiv (grub_int32_t a, grub_int32_t b)
|
||||
__attribute__ ((alias ("__divsi3")));
|
||||
void *__aeabi_memcpy (void *dest, const void *src, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memcpy")));
|
||||
void *__aeabi_memset (void *s, int c, grub_size_t n)
|
||||
__attribute__ ((alias ("memset")));
|
||||
|
||||
int
|
||||
__aeabi_ulcmp (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
return __ucmpdi2 (a, b) - 1;
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
__aeabi_lasr (grub_uint64_t u, int b)
|
||||
__attribute__ ((alias ("__ashrdi3")));
|
||||
grub_uint64_t
|
||||
__aeabi_llsr (grub_uint64_t u, int b)
|
||||
__attribute__ ((alias ("__lshrdi3")));
|
||||
|
||||
grub_uint64_t
|
||||
__aeabi_llsl (grub_uint64_t u, int b)
|
||||
__attribute__ ((alias ("__ashldi3")));
|
||||
|
||||
#endif
|
|
@ -348,7 +348,7 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e)
|
|||
mod->symtab = grub_malloc (s->sh_size);
|
||||
if (!mod->symtab)
|
||||
return grub_errno;
|
||||
memcpy (mod->symtab, (char *) e + s->sh_offset, s->sh_size);
|
||||
grub_memcpy (mod->symtab, (char *) e + s->sh_offset, s->sh_size);
|
||||
#else
|
||||
mod->symtab = (Elf_Sym *) ((char *) e + s->sh_offset);
|
||||
#endif
|
||||
|
|
|
@ -262,6 +262,7 @@ grub_efi_get_memory_map (grub_efi_uintn_t *memory_map_size,
|
|||
grub_efi_boot_services_t *b;
|
||||
grub_efi_uintn_t key;
|
||||
grub_efi_uint32_t version;
|
||||
grub_efi_uintn_t size;
|
||||
|
||||
if (grub_efi_is_finished)
|
||||
{
|
||||
|
@ -291,10 +292,14 @@ grub_efi_get_memory_map (grub_efi_uintn_t *memory_map_size,
|
|||
map_key = &key;
|
||||
if (! descriptor_version)
|
||||
descriptor_version = &version;
|
||||
if (! descriptor_size)
|
||||
descriptor_size = &size;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
status = efi_call_5 (b->get_memory_map, memory_map_size, memory_map, map_key,
|
||||
descriptor_size, descriptor_version);
|
||||
if (*descriptor_size == 0)
|
||||
*descriptor_size = sizeof (grub_efi_memory_descriptor_t);
|
||||
if (status == GRUB_EFI_SUCCESS)
|
||||
return 1;
|
||||
else if (status == GRUB_EFI_BUFFER_TOO_SMALL)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include "../ia64/cache.c"
|
||||
#elif defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
void __clear_cache (char *beg, char *end);
|
||||
void __clear_cache (void *beg, void *end);
|
||||
|
||||
void
|
||||
grub_arch_sync_caches (void *address, grub_size_t len)
|
||||
|
|
|
@ -99,7 +99,7 @@ find_free_slot (void)
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < sizeof (map) / sizeof (map[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE (map); i++)
|
||||
if (! map[i].drive)
|
||||
return i;
|
||||
|
||||
|
@ -115,7 +115,7 @@ grub_util_biosdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
|||
if (pull != GRUB_DISK_PULL_NONE)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < sizeof (map) / sizeof (map[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE (map); i++)
|
||||
if (map[i].drive && hook (map[i].drive, hook_data))
|
||||
return 1;
|
||||
|
||||
|
@ -184,7 +184,7 @@ grub_hostdisk_os_dev_to_grub_drive (const char *os_disk, int add)
|
|||
unsigned int i;
|
||||
char *canon;
|
||||
|
||||
canon = canonicalize_file_name (os_disk);
|
||||
canon = grub_canonicalize_file_name (os_disk);
|
||||
if (!canon)
|
||||
canon = xstrdup (os_disk);
|
||||
|
||||
|
@ -535,7 +535,7 @@ read_device_map (const char *dev_map)
|
|||
/* On Linux, the devfs uses symbolic links horribly, and that
|
||||
confuses the interface very much, so use realpath to expand
|
||||
symbolic links. */
|
||||
map[drive].device = canonicalize_file_name (p);
|
||||
map[drive].device = grub_canonicalize_file_name (p);
|
||||
if (! map[drive].device)
|
||||
map[drive].device = xstrdup (p);
|
||||
|
||||
|
@ -581,7 +581,7 @@ grub_util_biosdisk_fini (void)
|
|||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < sizeof (map) / sizeof (map[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(map); i++)
|
||||
{
|
||||
if (map[i].drive)
|
||||
free (map[i].drive);
|
||||
|
|
|
@ -19,11 +19,6 @@
|
|||
|
||||
#include <config-util.h>
|
||||
|
||||
/* Legacy feature macro.*/
|
||||
#define _BSD_SOURCE
|
||||
/* New feature macro that provides everything _BSD_SOURCE and
|
||||
* _SVID_SOURCE provided and possibly more. */
|
||||
#define _DEFAULT_SOURCE
|
||||
#include <grub/fs.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/disk.h>
|
||||
|
|
|
@ -34,5 +34,5 @@ grub_rtc_get_time_ms (void)
|
|||
1 s 1 T rtc ticks
|
||||
*/
|
||||
grub_uint64_t ticks_ms_per_sec = ((grub_uint64_t) 1000) * grub_get_rtc ();
|
||||
return grub_divmod64 (ticks_ms_per_sec, GRUB_TICKS_PER_SECOND, 0);
|
||||
return grub_divmod64 (ticks_ms_per_sec, GRUB_TICKS_PER_SECOND ? : 1000, 0);
|
||||
}
|
||||
|
|
|
@ -61,8 +61,3 @@ multiboot_header:
|
|||
/* checksum */
|
||||
.long -0x1BADB002 - MULTIBOOT_MEMORY_INFO
|
||||
|
||||
/*
|
||||
* prot_to_real and associated structures (but NOT real_to_prot, that is
|
||||
* only needed for BIOS gates).
|
||||
*/
|
||||
#include "../realmode.S"
|
||||
|
|
|
@ -148,7 +148,7 @@ grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
|||
|
||||
while (1)
|
||||
{
|
||||
grub_memset (entry, 0, sizeof (entry));
|
||||
grub_memset (entry, 0, sizeof (*entry));
|
||||
|
||||
cont = grub_get_mmap_entry (entry, cont);
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ LOCAL(prot_to_real_addr):
|
|||
|
||||
.macro REAL_TO_PROT
|
||||
movl LOCAL(real_to_prot_addr), %eax
|
||||
DATA32 call *%ax
|
||||
calll *%eax
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
_start:
|
||||
jmp codestart
|
||||
|
||||
. = _start + GRUB_KERNEL_I386_QEMU_CORE_ENTRY_ADDR
|
||||
.org GRUB_KERNEL_I386_QEMU_CORE_ENTRY_ADDR
|
||||
VARIABLE(grub_core_entry_addr)
|
||||
.long 0
|
||||
|
||||
|
@ -73,5 +73,3 @@ codestart:
|
|||
1:
|
||||
hlt
|
||||
jmp 1b
|
||||
|
||||
#include "../realmode.S"
|
||||
|
|
|
@ -54,7 +54,7 @@ protstack:
|
|||
.endm
|
||||
|
||||
.macro REAL_TO_PROT
|
||||
DATA32 call real_to_prot
|
||||
calll real_to_prot
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
@ -137,7 +137,22 @@ real_to_prot:
|
|||
/* load the GDT register */
|
||||
xorw %ax, %ax
|
||||
movw %ax, %ds
|
||||
DATA32 ADDR32 lgdt gdtdesc
|
||||
#ifdef GRUB_MACHINE_QEMU
|
||||
/*
|
||||
qemu is special: gdtdesc is in ROM.
|
||||
%cs = 0xf000
|
||||
_start + GRUB_BOOT_MACHINE_SIZE = 0x100000
|
||||
So
|
||||
_start + GRUB_BOOT_MACHINE_SIZE - 0x10000 points to the same point
|
||||
as %cs.
|
||||
gdtdesc - (_start + GRUB_BOOT_MACHINE_SIZE - 0x10000)
|
||||
= gdtdesc - _start - GRUB_BOOT_MACHINE_SIZE + 0x10000
|
||||
but the later can be computed by assembly.
|
||||
*/
|
||||
lgdtl %cs:(gdtdesc - _start - GRUB_BOOT_MACHINE_SIZE + 0x10000)
|
||||
#else
|
||||
lgdtl gdtdesc
|
||||
#endif
|
||||
|
||||
/* turn on protected mode */
|
||||
movl %cr0, %eax
|
||||
|
@ -145,7 +160,7 @@ real_to_prot:
|
|||
movl %eax, %cr0
|
||||
|
||||
/* jump to relocation, flush prefetch queue, and reload %cs */
|
||||
DATA32 ljmp $GRUB_MEMORY_MACHINE_PROT_MODE_CSEG, $protcseg
|
||||
ljmpl $GRUB_MEMORY_MACHINE_PROT_MODE_CSEG, $protcseg
|
||||
|
||||
.code32
|
||||
protcseg:
|
||||
|
@ -178,6 +193,9 @@ protcseg:
|
|||
|
||||
/* return on the old (or initialized) stack! */
|
||||
ret
|
||||
/* prot_to_real assumes that this code is under 64K which is not
|
||||
true for qemu. */
|
||||
#ifndef GRUB_MACHINE_QEMU
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2009,2010 Free Software Foundation, Inc.
|
||||
|
@ -237,7 +255,7 @@ tmpcseg:
|
|||
movl %eax, %cr0
|
||||
|
||||
/* flush prefetch queue, reload %cs */
|
||||
DATA32 ljmp $0, $realcseg
|
||||
ljmpl $0, $realcseg
|
||||
|
||||
realcseg:
|
||||
/* we are in real mode now
|
||||
|
@ -258,6 +276,6 @@ realcseg:
|
|||
#endif
|
||||
|
||||
/* return on new stack! */
|
||||
DATA32 ret
|
||||
|
||||
retl
|
||||
#endif
|
||||
.code32
|
||||
|
|
|
@ -57,6 +57,8 @@ grub_get_tsc (void)
|
|||
return (((grub_uint64_t) hi) << 32) | lo;
|
||||
}
|
||||
|
||||
#ifndef GRUB_MACHINE_XEN
|
||||
|
||||
static __inline int
|
||||
grub_cpu_is_tsc_supported (void)
|
||||
{
|
||||
|
@ -69,8 +71,6 @@ grub_cpu_is_tsc_supported (void)
|
|||
return (d & (1 << 4)) != 0;
|
||||
}
|
||||
|
||||
#ifndef GRUB_MACHINE_XEN
|
||||
|
||||
static void
|
||||
grub_pit_wait (grub_uint16_t tics)
|
||||
{
|
||||
|
@ -122,7 +122,11 @@ calibrate_tsc (void)
|
|||
grub_pit_wait (0xffff);
|
||||
end_tsc = grub_get_tsc ();
|
||||
|
||||
grub_tsc_rate = grub_divmod64 ((55ULL << 32), end_tsc - tsc_boot_time, 0);
|
||||
grub_tsc_rate = 0;
|
||||
if (end_tsc > tsc_boot_time)
|
||||
grub_tsc_rate = grub_divmod64 ((55ULL << 32), end_tsc - tsc_boot_time, 0);
|
||||
if (grub_tsc_rate == 0)
|
||||
grub_tsc_rate = 5368;/* 800 MHz */
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/cpu/kernel.h>
|
||||
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
mips_attributes
|
||||
|
||||
FUNCTION (grub_arch_sync_caches)
|
||||
#include "cache_flush.S"
|
||||
|
@ -65,4 +67,4 @@ FUNCTION (grub_arch_sync_dma_caches)
|
|||
#endif
|
||||
sync_op
|
||||
|
||||
jr $ra
|
||||
jr $ra
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <grub/offsets.h>
|
||||
#include <grub/machine/memory.h>
|
||||
#include <grub/machine/kernel.h>
|
||||
#include <grub/cpu/kernel.h>
|
||||
#include <grub/offsets.h>
|
||||
|
||||
#define BASE_ADDR 8
|
||||
|
@ -28,6 +29,7 @@
|
|||
.globl __start, _start, start
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
mips_attributes
|
||||
__start:
|
||||
_start:
|
||||
start:
|
||||
|
@ -36,7 +38,7 @@ start:
|
|||
bal cont
|
||||
nop
|
||||
|
||||
. = _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
|
||||
.org GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
|
||||
VARIABLE(grub_total_modules_size)
|
||||
.long 0
|
||||
|
||||
|
|
|
@ -95,25 +95,6 @@ grub_memmove (void *dest, const void *src, grub_size_t n)
|
|||
return dest;
|
||||
}
|
||||
|
||||
#ifndef __APPLE__
|
||||
void *memmove (void *dest, const void *src, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memmove")));
|
||||
/* GCC emits references to memcpy() for struct copies etc. */
|
||||
void *memcpy (void *dest, const void *src, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memmove")));
|
||||
#else
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
memcpy (void *dest, const void *src, grub_size_t n)
|
||||
{
|
||||
return grub_memmove (dest, src, n);
|
||||
}
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
memmove (void *dest, const void *src, grub_size_t n)
|
||||
{
|
||||
return grub_memmove (dest, src, n);
|
||||
}
|
||||
#endif
|
||||
|
||||
char *
|
||||
grub_strcpy (char *dest, const char *src)
|
||||
{
|
||||
|
@ -253,16 +234,6 @@ grub_memcmp (const void *s1, const void *s2, grub_size_t n)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#ifndef __APPLE__
|
||||
int memcmp (const void *s1, const void *s2, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memcmp")));
|
||||
#else
|
||||
int GRUB_BUILTIN_ATTR
|
||||
memcmp (const void *s1, const void *s2, grub_size_t n)
|
||||
{
|
||||
return grub_memcmp (s1, s2, n);
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
grub_strcmp (const char *s1, const char *s2)
|
||||
|
@ -532,26 +503,6 @@ grub_memset (void *s, int c, grub_size_t len)
|
|||
|
||||
return s;
|
||||
}
|
||||
#ifndef __APPLE__
|
||||
void *memset (void *s, int c, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memset")));
|
||||
#else
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
memset (void *s, int c, grub_size_t n)
|
||||
{
|
||||
return grub_memset (s, c, n);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if !defined(GRUB_UTIL) && defined(__APPLE__)
|
||||
void GRUB_BUILTIN_ATTR
|
||||
__bzero (void *s, grub_size_t n)
|
||||
{
|
||||
grub_memset (s, 0, n);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
grub_size_t
|
||||
grub_strlen (const char *s)
|
||||
|
@ -594,10 +545,10 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
|
|||
grub_uint64_t m = 0;
|
||||
|
||||
/* ARM and IA64 don't have a fast 32-bit division.
|
||||
Using that code would just make us use libgcc routines, calling
|
||||
them twice (once for modulo and once for quotient.
|
||||
Using that code would just make us use software division routines, calling
|
||||
ourselves indirectly and hence getting infinite recursion.
|
||||
*/
|
||||
#if !defined (__arm__) && !defined (__ia64__)
|
||||
#if !GRUB_DIVISION_IN_SOFTWARE
|
||||
/* Skip the slow computation if 32-bit arithmetic is possible. */
|
||||
if (n < 0xffffffff && d < 0xffffffff)
|
||||
{
|
||||
|
@ -631,132 +582,6 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
|
|||
return q;
|
||||
}
|
||||
|
||||
#if !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
|
||||
#if defined (__arm__)
|
||||
|
||||
grub_uint32_t
|
||||
__udivsi3 (grub_uint32_t a, grub_uint32_t b)
|
||||
{
|
||||
return grub_divmod64 (a, b, 0);
|
||||
}
|
||||
|
||||
grub_uint32_t
|
||||
__umodsi3 (grub_uint32_t a, grub_uint32_t b)
|
||||
{
|
||||
grub_uint64_t ret;
|
||||
grub_divmod64 (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef NEED_CTZDI2
|
||||
|
||||
unsigned
|
||||
__ctzdi2 (grub_uint64_t x)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
if (!x)
|
||||
return 64;
|
||||
if (!(x & 0xffffffff))
|
||||
{
|
||||
x >>= 32;
|
||||
ret |= 32;
|
||||
}
|
||||
if (!(x & 0xffff))
|
||||
{
|
||||
x >>= 16;
|
||||
ret |= 16;
|
||||
}
|
||||
if (!(x & 0xff))
|
||||
{
|
||||
x >>= 8;
|
||||
ret |= 8;
|
||||
}
|
||||
if (!(x & 0xf))
|
||||
{
|
||||
x >>= 4;
|
||||
ret |= 4;
|
||||
}
|
||||
if (!(x & 0x3))
|
||||
{
|
||||
x >>= 2;
|
||||
ret |= 2;
|
||||
}
|
||||
if (!(x & 0x1))
|
||||
{
|
||||
x >>= 1;
|
||||
ret |= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef NEED_CTZSI2
|
||||
unsigned
|
||||
__ctzsi2 (grub_uint32_t x)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
if (!x)
|
||||
return 32;
|
||||
|
||||
if (!(x & 0xffff))
|
||||
{
|
||||
x >>= 16;
|
||||
ret |= 16;
|
||||
}
|
||||
if (!(x & 0xff))
|
||||
{
|
||||
x >>= 8;
|
||||
ret |= 8;
|
||||
}
|
||||
if (!(x & 0xf))
|
||||
{
|
||||
x >>= 4;
|
||||
ret |= 4;
|
||||
}
|
||||
if (!(x & 0x3))
|
||||
{
|
||||
x >>= 2;
|
||||
ret |= 2;
|
||||
}
|
||||
if (!(x & 0x1))
|
||||
{
|
||||
x >>= 1;
|
||||
ret |= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __arm__
|
||||
grub_uint32_t
|
||||
__aeabi_uidiv (grub_uint32_t a, grub_uint32_t b)
|
||||
__attribute__ ((alias ("__udivsi3")));
|
||||
#endif
|
||||
|
||||
#if defined (__ia64__)
|
||||
|
||||
grub_uint64_t
|
||||
__udivdi3 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
return grub_divmod64 (a, b, 0);
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
__umoddi3 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
grub_uint64_t ret;
|
||||
grub_divmod64 (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* GRUB_UTIL */
|
||||
|
||||
/* Convert a long long value to a string. This function avoids 64-bit
|
||||
modular arithmetic or divisions. */
|
||||
static inline char *
|
||||
|
@ -1265,15 +1090,6 @@ grub_abort (void)
|
|||
grub_exit ();
|
||||
}
|
||||
|
||||
#if defined (__clang__) && !defined (GRUB_UTIL)
|
||||
/* clang emits references to abort(). */
|
||||
void __attribute__ ((noreturn))
|
||||
abort (void)
|
||||
{
|
||||
grub_abort ();
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
grub_fatal (const char *fmt, ...)
|
||||
{
|
||||
|
@ -1286,23 +1102,6 @@ grub_fatal (const char *fmt, ...)
|
|||
grub_abort ();
|
||||
}
|
||||
|
||||
#if (defined (__MINGW32__) || defined (__CYGWIN__)) && !defined(GRUB_UTIL)
|
||||
void __register_frame_info (void)
|
||||
{
|
||||
}
|
||||
|
||||
void __deregister_frame_info (void)
|
||||
{
|
||||
}
|
||||
void ___chkstk_ms (void)
|
||||
{
|
||||
}
|
||||
|
||||
void __chkstk_ms (void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if BOOT_TIME_STATS
|
||||
|
||||
#include <grub/time.h>
|
||||
|
|
130
grub-core/kern/powerpc/compiler-rt.S
Normal file
130
grub-core/kern/powerpc/compiler-rt.S
Normal file
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Special support for eabi and SVR4
|
||||
*
|
||||
* Copyright (C) 1995-2014 Free Software Foundation, Inc.
|
||||
* Written By Michael Meissner
|
||||
* 64-bit support written by David Edelsohn
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 3, or (at your option) any
|
||||
* later version.
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* Under Section 7 of GPL version 3, you are granted additional
|
||||
* permissions described in the GCC Runtime Library Exception, version
|
||||
* 3.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License and
|
||||
* a copy of the GCC Runtime Library Exception along with this program;
|
||||
* see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Do any initializations needed for the eabi environment */
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/dl.h>
|
||||
|
||||
.section ".text"
|
||||
|
||||
#define CFI_RESTORE(reg) .cfi_restore reg
|
||||
#define CFI_OFFSET(reg, off) .cfi_offset reg, off
|
||||
#define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg
|
||||
#define CFI_STARTPROC .cfi_startproc
|
||||
#define CFI_ENDPROC .cfi_endproc
|
||||
|
||||
/* Routines for restoring integer registers, called by the compiler. */
|
||||
/* Called with r11 pointing to the stack header word of the caller of the */
|
||||
/* function, just beyond the end of the integer restore area. */
|
||||
|
||||
CFI_STARTPROC
|
||||
CFI_DEF_CFA_REGISTER (11)
|
||||
CFI_OFFSET (65, 4)
|
||||
CFI_OFFSET (14, -72)
|
||||
CFI_OFFSET (15, -68)
|
||||
CFI_OFFSET (16, -64)
|
||||
CFI_OFFSET (17, -60)
|
||||
CFI_OFFSET (18, -56)
|
||||
CFI_OFFSET (19, -52)
|
||||
CFI_OFFSET (20, -48)
|
||||
CFI_OFFSET (21, -44)
|
||||
CFI_OFFSET (22, -40)
|
||||
CFI_OFFSET (23, -36)
|
||||
CFI_OFFSET (24, -32)
|
||||
CFI_OFFSET (25, -28)
|
||||
CFI_OFFSET (26, -24)
|
||||
CFI_OFFSET (27, -20)
|
||||
CFI_OFFSET (28, -16)
|
||||
CFI_OFFSET (29, -12)
|
||||
CFI_OFFSET (30, -8)
|
||||
CFI_OFFSET (31, -4)
|
||||
FUNCTION(_restgpr_14_x) lwz 14,-72(11) /* restore gp registers */
|
||||
CFI_RESTORE (14)
|
||||
FUNCTION(_restgpr_15_x) lwz 15,-68(11)
|
||||
CFI_RESTORE (15)
|
||||
FUNCTION(_restgpr_16_x) lwz 16,-64(11)
|
||||
CFI_RESTORE (16)
|
||||
FUNCTION(_restgpr_17_x) lwz 17,-60(11)
|
||||
CFI_RESTORE (17)
|
||||
FUNCTION(_restgpr_18_x) lwz 18,-56(11)
|
||||
CFI_RESTORE (18)
|
||||
FUNCTION(_restgpr_19_x) lwz 19,-52(11)
|
||||
CFI_RESTORE (19)
|
||||
FUNCTION(_restgpr_20_x) lwz 20,-48(11)
|
||||
CFI_RESTORE (20)
|
||||
FUNCTION(_restgpr_21_x) lwz 21,-44(11)
|
||||
CFI_RESTORE (21)
|
||||
FUNCTION(_restgpr_22_x) lwz 22,-40(11)
|
||||
CFI_RESTORE (22)
|
||||
FUNCTION(_restgpr_23_x) lwz 23,-36(11)
|
||||
CFI_RESTORE (23)
|
||||
FUNCTION(_restgpr_24_x) lwz 24,-32(11)
|
||||
CFI_RESTORE (24)
|
||||
FUNCTION(_restgpr_25_x) lwz 25,-28(11)
|
||||
CFI_RESTORE (25)
|
||||
FUNCTION(_restgpr_26_x) lwz 26,-24(11)
|
||||
CFI_RESTORE (26)
|
||||
FUNCTION(_restgpr_27_x) lwz 27,-20(11)
|
||||
CFI_RESTORE (27)
|
||||
FUNCTION(_restgpr_28_x) lwz 28,-16(11)
|
||||
CFI_RESTORE (28)
|
||||
FUNCTION(_restgpr_29_x) lwz 29,-12(11)
|
||||
CFI_RESTORE (29)
|
||||
FUNCTION(_restgpr_30_x) lwz 30,-8(11)
|
||||
CFI_RESTORE (30)
|
||||
FUNCTION(_restgpr_31_x) lwz 0,4(11)
|
||||
lwz 31,-4(11)
|
||||
CFI_RESTORE (31)
|
||||
mtlr 0
|
||||
CFI_RESTORE (65)
|
||||
mr 1,11
|
||||
CFI_DEF_CFA_REGISTER (1)
|
||||
blr
|
||||
CFI_ENDPROC
|
||||
|
||||
CFI_STARTPROC
|
||||
FUNCTION(_savegpr_14) stw 14,-72(11) /* save gp registers */
|
||||
FUNCTION(_savegpr_15) stw 15,-68(11)
|
||||
FUNCTION(_savegpr_16) stw 16,-64(11)
|
||||
FUNCTION(_savegpr_17) stw 17,-60(11)
|
||||
FUNCTION(_savegpr_18) stw 18,-56(11)
|
||||
FUNCTION(_savegpr_19) stw 19,-52(11)
|
||||
FUNCTION(_savegpr_20) stw 20,-48(11)
|
||||
FUNCTION(_savegpr_21) stw 21,-44(11)
|
||||
FUNCTION(_savegpr_22) stw 22,-40(11)
|
||||
FUNCTION(_savegpr_23) stw 23,-36(11)
|
||||
FUNCTION(_savegpr_24) stw 24,-32(11)
|
||||
FUNCTION(_savegpr_25) stw 25,-28(11)
|
||||
FUNCTION(_savegpr_26) stw 26,-24(11)
|
||||
FUNCTION(_savegpr_27) stw 27,-20(11)
|
||||
FUNCTION(_savegpr_28) stw 28,-16(11)
|
||||
FUNCTION(_savegpr_29) stw 29,-12(11)
|
||||
FUNCTION(_savegpr_30) stw 30,-8(11)
|
||||
FUNCTION(_savegpr_31) stw 31,-4(11)
|
||||
blr
|
||||
CFI_ENDPROC
|
|
@ -27,7 +27,7 @@ _start:
|
|||
ba codestart
|
||||
mov %o4, %o0
|
||||
|
||||
. = EXT_C(_start) + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
|
||||
.org GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
|
||||
|
||||
VARIABLE(grub_total_module_size)
|
||||
.word 0
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue