Hello kernel Gurus!
[debian/woody on alpha sx165/lx164, gcc-3.3.4]
We need to netboot our alphas (because booting from the SCSI controllers
is not an option, they are not supported by the SRM console) and I try
to make a bootp image of our kernel.
When doing this on our alpha the
make bootimage
and the
make bootpfile
both bail out with:
make[1]: Entering directory `/usr/src/linux-2.4.27/arch/alpha/boot'
tools/objstrip -v /usr/src/linux-2.4.27/vmlinux vmlinux.nh
tools/objstrip: extracting 0xfffffc0000310000-0xfffffc00005cfef8 (at
2000)
tools/objstrip: copying 2883320 byte from /usr/src/linux-2.4.27/vmlinux
tools/objstrip: zero-filling bss and aligning to 0 with 393432 bytes
echo "#define KERNEL_SIZE `ls -l vmlinux.nh | awk '{print $5}'`" >
ksize.hT
cmp -s ksize.hT ksize.h || mv -f ksize.hT ksize.h
rm -f ksize.hT
ld -static -T bootloader.lds head.o main.o
/usr/src/linux-2.4.27/arch/alpha/lib/lib.a
/usr/src/linux-2.4.27/lib/lib.a
/usr/src/linux-2.4.27/arch/alpha/lib/lib.a -o bootloader
/usr/src/linux-2.4.27/lib/lib.a(vsprintf.o): In function `vsnprintf':
vsprintf.o(.text+0xcd4): undefined reference to `printk'
vsprintf.o(.text+0xcdc): undefined reference to `printk'
/usr/src/linux-2.4.27/lib/lib.a(dump_stack.o): In function `dump_stack':
dump_stack.o(.text+0x10): undefined reference to `printk'
dump_stack.o(.text+0x1c): undefined reference to `printk'
make[1]: *** [bootloader] Error 1
make[1]: Leaving directory `/usr/src/linux-2.4.27/arch/alpha/boot'
make: *** [bootimage] Error 2
and similar with bootpfile
Is there a way around this, we definitely need the bootp image.
Thanks a lot and all the best
Norbert
-------------------------------------------------------------------------------
Norbert Preining <preining AT logic DOT at> Technische Universit?t Wien
gpg DSA: 0x09C5B094 fp: 14DF 2E6C 0307 BE6D AD76 A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
SCREEB (n.)
To make the noise of a nylon anorak rubbing against a pair of corduroy
trousers.
--- Douglas Adams, The Meaning of Liff
On Tue, Oct 12, 2004 at 07:33:44PM +0200, Norbert Preining wrote:
> When doing this on our alpha the
> make bootimage
> and the
> make bootpfile
> both bail out with:
...
> /usr/src/linux-2.4.27/arch/alpha/lib/lib.a -o bootloader
> /usr/src/linux-2.4.27/lib/lib.a(vsprintf.o): In function `vsnprintf':
> vsprintf.o(.text+0xcd4): undefined reference to `printk'
Thanks for the report. The appended patch should fix that.
Ivan.
--- 2.4/arch/alpha/boot/bootloader.lds Tue Jul 3 01:40:14 2001
+++ linux/arch/alpha/boot/bootloader.lds Wed Oct 13 23:18:50 2004
@@ -1,5 +1,6 @@
OUTPUT_FORMAT("elf64-alpha")
ENTRY(__start)
+printk = srm_printk;
SECTIONS
{
. = 0x20000000;
On Mit, 13 Okt 2004, Ivan Kokshaysky wrote:
> > /usr/src/linux-2.4.27/arch/alpha/lib/lib.a -o bootloader
> > /usr/src/linux-2.4.27/lib/lib.a(vsprintf.o): In function `vsnprintf':
> > vsprintf.o(.text+0xcd4): undefined reference to `printk'
>
> Thanks for the report. The appended patch should fix that.
Thanks a lot. This fixed it. Testing will be done tomorrow.
Best wishes
Norbert
-------------------------------------------------------------------------------
Norbert Preining <preining AT logic DOT at> Technische Universit?t Wien
gpg DSA: 0x09C5B094 fp: 14DF 2E6C 0307 BE6D AD76 A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
WHAPLODE DROVE (n.)
A homicidal golf stroke.
--- Douglas Adams, The Meaning of Liff
Dear Ivan, dear kernel kackers!
On Mit, 13 Okt 2004, Ivan Kokshaysky wrote:
> > make bootpfile
Ok, now I have a boot file but the kernel is not started:
>>> boot ewa0 -fl ...
...
jumping to bootstrap code
Linux/AXP bootp loader for linux 2.4.27
Switching to OSF PAL-code .. 0k (rev 1000800020117)
Loading the kernel...'root=/dev/sda1'
Halted CPU 0
halt code = 2
kernel stack not valid halt
PC = 200000000
boot failure
>>>
(typed in from screen)
SRM 5.5, AlphaPC164
normal (from scsi) boot dmesg with aboot is attached.
Any hints for this?
Best wishes
Norbert
-------------------------------------------------------------------------------
Norbert Preining <preining AT logic DOT at> Technische Universit?t Wien
gpg DSA: 0x09C5B094 fp: 14DF 2E6C 0307 BE6D AD76 A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
HARPENDEN (n.)
The coda to a phone conversion, consisting of about eight exchanges,
by which people try gracefully to get off the line.
--- Douglas Adams, The Meaning of Liff
Norbert Preining <[email protected]> writes:
> Dear Ivan, dear kernel kackers!
>
> On Mit, 13 Okt 2004, Ivan Kokshaysky wrote:
>> > make bootpfile
>
> Ok, now I have a boot file but the kernel is not started:
>
>>>> boot ewa0 -fl ...
> ...
> jumping to bootstrap code
> Linux/AXP bootp loader for linux 2.4.27
> Switching to OSF PAL-code .. 0k (rev 1000800020117)
> Loading the kernel...'root=/dev/sda1'
>
> Halted CPU 0
>
> halt code = 2
> kernel stack not valid halt
> PC = 200000000
> boot failure
Try building more things as modules instead of builtin, if possible.
--
M?ns Rullg?rd
[email protected]
On Don, 14 Okt 2004, M?ns Rullg?rd wrote:
> > Loading the kernel...'root=/dev/sda1'
> >
> > Halted CPU 0
> >
> > halt code = 2
> > kernel stack not valid halt
> > PC = 200000000
> > boot failure
>
> Try building more things as modules instead of builtin, if possible.
I have reduced the whole kernel zo more or less nothing included,
besides the SCSI drivers, and the same still happens.
Best wishes
Norbert
-------------------------------------------------------------------------------
Norbert Preining <preining AT logic DOT at> Technische Universit?t Wien
gpg DSA: 0x09C5B094 fp: 14DF 2E6C 0307 BE6D AD76 A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
LOCHRANZA (n.)
The long unaccomplished wail in the middle of a Scottish folk song
where the pipes nip around the corner for a couple of drinks.
--- Douglas Adams, The Meaning of Liff
On Thu, Oct 14, 2004 at 03:00:35PM +0200, Norbert Preining wrote:
> Ok, now I have a boot file but the kernel is not started:
>
> >>> boot ewa0 -fl ...
> ...
> Halted CPU 0
>
> halt code = 2
> kernel stack not valid halt
I was able to reproduce that on SX164 with both bootpfile and bootpzfile.
As it turns out, the final kernel destination overlaps the initial stack
region. Please test the appended patch.
Ivan.
--- 2.4/arch/alpha/boot/bootp.c Fri Oct 5 05:47:08 2001
+++ linux/arch/alpha/boot/bootp.c Tue Oct 19 19:22:21 2004
@@ -26,6 +26,8 @@ extern unsigned long switch_to_osf_pal(u
struct pcb_struct * pcb_va, struct pcb_struct * pcb_pa,
unsigned long *vptb);
+extern void move_stack(unsigned long new_stack);
+
struct hwrpb_struct *hwrpb = INIT_HWRPB;
static struct pcb_struct pcb_va[1];
@@ -118,12 +120,10 @@ static inline void
runkernel(void)
{
__asm__ __volatile__(
- "bis %1,%1,$30\n\t"
"bis %0,%0,$27\n\t"
"jmp ($27)"
: /* no outputs: it doesn't even return */
- : "r" (START_ADDR),
- "r" (PAGE_SIZE + INIT_STACK));
+ : "r" (START_ADDR));
}
extern char _end;
@@ -147,9 +147,7 @@ start_kernel(void)
*/
static long nbytes;
static char envval[256] __attribute__((aligned(8)));
-#ifdef INITRD_IMAGE_SIZE
static unsigned long initrd_start;
-#endif
srm_printk("Linux/AXP bootp loader for Linux " UTS_RELEASE "\n");
if (INIT_HWRPB->pagesize != 8192) {
@@ -164,12 +162,19 @@ start_kernel(void)
}
pal_init();
-#ifdef INITRD_IMAGE_SIZE
/* The initrd must be page-aligned. See below for the
cause of the magic number 5. */
- initrd_start = ((START_ADDR + 5*KERNEL_SIZE) | (PAGE_SIZE-1)) + 1;
+ initrd_start = ((START_ADDR + 5*KERNEL_SIZE + PAGE_SIZE) |
+ (PAGE_SIZE-1)) + 1;
+#ifdef INITRD_IMAGE_SIZE
srm_printk("Initrd positioned at %#lx\n", initrd_start);
#endif
+
+ /*
+ * Move the stack to a safe place to ensure it won't be
+ * overwritten by kernel image.
+ */
+ move_stack(initrd_start - PAGE_SIZE);
nbytes = callback_getenv(ENV_BOOTED_OSFLAGS, envval, sizeof(envval));
if (nbytes < 0 || nbytes >= sizeof(envval)) {
--- 2.4/arch/alpha/boot/bootpz.c Tue Oct 19 19:27:49 2004
+++ linux/arch/alpha/boot/bootpz.c Tue Oct 19 19:12:16 2004
@@ -32,9 +32,6 @@
#undef DEBUG_CHECK_RANGE
#define DEBUG_ADDRESSES
-#define DEBUG_SP(x) \
- {register long sp asm("30"); srm_printk("%s (sp=%lx)\n", x, sp);}
-
extern unsigned long switch_to_osf_pal(unsigned long nr,
struct pcb_struct * pcb_va, struct pcb_struct * pcb_pa,
unsigned long *vptb);
@@ -42,6 +39,8 @@ extern unsigned long switch_to_osf_pal(u
extern int decompress_kernel(void* destination, void *source,
size_t ksize, size_t kzsize);
+extern void move_stack(unsigned long new_stack);
+
struct hwrpb_struct *hwrpb = INIT_HWRPB;
static struct pcb_struct pcb_va[1];
@@ -154,12 +153,10 @@ static inline void
runkernel(void)
{
__asm__ __volatile__(
- "bis %1,%1,$30\n\t"
"bis %0,%0,$27\n\t"
"jmp ($27)"
: /* no outputs: it doesn't even return */
- : "r" (START_ADDR),
- "r" (PAGE_SIZE + INIT_STACK));
+ : "r" (START_ADDR));
}
/* Must record the SP (it is virtual) on entry, so we can make sure
@@ -244,7 +241,9 @@ extern char _end;
for "bootmem" anyway.
*/
#define K_COPY_IMAGE_START NEXT_PAGE(K_KERNEL_IMAGE_END)
-#define K_INITRD_START NEXT_PAGE(K_COPY_IMAGE_START + KERNEL_SIZE)
+/* Reserve one page below INITRD for the new stack. */
+#define K_INITRD_START \
+ NEXT_PAGE(K_COPY_IMAGE_START + KERNEL_SIZE + PAGE_SIZE)
#define K_COPY_IMAGE_END \
(K_INITRD_START + REAL_INITRD_SIZE + MALLOC_AREA_SIZE)
#define K_COPY_IMAGE_SIZE \
@@ -410,8 +409,7 @@ start_kernel(void)
initrd_image_start,
INITRD_IMAGE_SIZE);
#endif
- memcpy((void *)initrd_image_start,
- (void *)V_INITRD_START,
+ memcpy((void *)initrd_image_start, (void *)V_INITRD_START,
INITRD_IMAGE_SIZE);
#endif /* INITRD_IMAGE_SIZE */
@@ -427,9 +425,14 @@ start_kernel(void)
K_KERNEL_IMAGE_START,
(unsigned)KERNEL_SIZE);
#endif
+ /*
+ * Move the stack to a safe place to ensure it won't be
+ * overwritten by kernel image.
+ */
+ move_stack(initrd_image_start - PAGE_SIZE);
+
memcpy((void *)K_KERNEL_IMAGE_START,
- (void *)uncompressed_image_start,
- KERNEL_SIZE);
+ (void *)uncompressed_image_start, KERNEL_SIZE);
}
/* Clear the zero page, then move the argument list in. */
--- 2.4/arch/alpha/boot/bootloader.lds Tue Jul 3 01:40:14 2001
+++ linux/arch/alpha/boot/bootloader.lds Tue Oct 19 15:56:21 2004
@@ -1,5 +1,6 @@
OUTPUT_FORMAT("elf64-alpha")
ENTRY(__start)
+printk = srm_printk;
SECTIONS
{
. = 0x20000000;
--- 2.4/arch/alpha/boot/head.S Mon Oct 12 22:40:12 1998
+++ linux/arch/alpha/boot/head.S Tue Oct 19 18:51:47 2004
@@ -100,3 +100,24 @@ halt:
.prologue 0
call_pal PAL_halt
.end halt
+
+/* $16 - new stack page */
+ .align 3
+ .globl move_stack
+ .ent move_stack
+move_stack:
+ .prologue 0
+ lda $0, 0x1fff($31)
+ and $0, $30, $1 /* Stack offset */
+ or $1, $16, $16 /* New stack pointer */
+ mov $30, $1
+ mov $16, $2
+1: ldq $3, 0($1) /* Move the stack */
+ addq $1, 8, $1
+ stq $3, 0($2)
+ and $0, $1, $4
+ addq $2, 8, $2
+ bne $4, 1b
+ mov $16, $30
+ ret ($26)
+ .end move_stack
On Die, 19 Okt 2004, Ivan Kokshaysky wrote:
> I was able to reproduce that on SX164 with both bootpfile and bootpzfile.
> As it turns out, the final kernel destination overlaps the initial stack
> region. Please test the appended patch.
Bingo. Thanks a lot. I tested bootpfile and this worked without any
problems. Very nice.
Best wishes
Norbert
-------------------------------------------------------------------------------
Norbert Preining <preining AT logic DOT at> Technische Universit?t Wien
gpg DSA: 0x09C5B094 fp: 14DF 2E6C 0307 BE6D AD76 A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
TUMBY (n.)
The involuntary abdominal gurgling which fills the silence following
someone else's intimate personal revelation.
--- Douglas Adams, The Meaning of Liff