Magellan Linux

Contents of /trunk/grub/patches/grub-0.97-pic.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 144 - (show annotations) (download)
Tue May 8 20:06:05 2007 UTC (17 years ago) by niro
File size: 1980 byte(s)
-import

1 fix PIC issues by psm and Kevin F. Quinn
2
3 http://bugs.gentoo.org/80693
4
5 --- grub-0.96/stage2/char_io.c
6 +++ grub-0.96/stage2/char_io.c
7 @@ -1202,37 +1202,62 @@
8 }
9 #endif /* ! STAGE1_5 */
10
11 +#ifdef GRUB_UTIL
12 +# ifdef __PIC__
13 +# if defined(HAVE_START_SYMBOL) && defined(HAVE_END_SYMBOL)
14 + extern char start[];
15 + extern char end[];
16 +# elif defined(HAVE_USCORE_START_SYMBOL) && defined (HAVE_USCORE_END_SYMBOL)
17 + extern char _start[];
18 + extern char _end[];
19 +# endif
20 +# endif
21 +#endif
22 int
23 memcheck (int addr, int len)
24 {
25 #ifdef GRUB_UTIL
26 +# ifdef __PIC__
27 +# if defined(HAVE_START_SYMBOL) && defined(HAVE_END_SYMBOL)
28 + if (start <= addr && end > addr + len)
29 + return ! errnum;
30 +# elif defined(HAVE_USCORE_START_SYMBOL) && defined (HAVE_USCORE_END_SYMBOL)
31 + if (_start <= addr && _end > addr + len)
32 + return ! errnum;
33 +# endif
34 +# else /* __PIC__ */
35 auto int start_addr (void);
36 auto int end_addr (void);
37
38 auto int start_addr (void)
39 {
40 int ret;
41 -# if defined(HAVE_START_SYMBOL)
42 +# if defined(HAVE_START_SYMBOL)
43 asm volatile ("movl $start, %0" : "=a" (ret));
44 -# elif defined(HAVE_USCORE_START_SYMBOL)
45 +# elif defined(HAVE_USCORE_START_SYMBOL)
46 asm volatile ("movl $_start, %0" : "=a" (ret));
47 -# endif
48 +# else
49 + erk! /* function would return undefined data in this case - barf */
50 +# endif
51 return ret;
52 }
53
54 auto int end_addr (void)
55 {
56 int ret;
57 -# if defined(HAVE_END_SYMBOL)
58 +# if defined(HAVE_END_SYMBOL)
59 asm volatile ("movl $end, %0" : "=a" (ret));
60 -# elif defined(HAVE_USCORE_END_SYMBOL)
61 +# elif defined(HAVE_USCORE_END_SYMBOL)
62 asm volatile ("movl $_end, %0" : "=a" (ret));
63 -# endif
64 +# else
65 + erk! /* function would return undefined data in this case - barf */
66 +# endif
67 return ret;
68 }
69
70 if (start_addr () <= addr && end_addr () > addr + len)
71 return ! errnum;
72 +# endif /* __PIC__ */
73 #endif /* GRUB_UTIL */
74
75 if ((addr < RAW_ADDR (0x1000))