Annotation of /trunk/grub/patches/grub-0.97-pic.patch
Parent Directory | Revision Log
Revision 144 -
(hide annotations)
(download)
Tue May 8 20:06:05 2007 UTC (17 years, 4 months ago) by niro
File size: 1980 byte(s)
Tue May 8 20:06:05 2007 UTC (17 years, 4 months ago) by niro
File size: 1980 byte(s)
-import
1 | niro | 144 | 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)) |