I have no problems booting linux on AMD eval board from flash
without BIOS. I wrote AMD 22/23h register setup procedure
which switches to protected mode and places gdt at 0x00000
(who cares - we don't have real mode interrupt table!:),
no mods in kernel, 2 changes in boot/compressed/misc.c,
currently I use romfs on slightly modyfied Olivers
/dev/rom0.
I agree with Andy - no reason to mess with setup.S -
just skip it.
I don't see any reason to relocate lgdt in ../kernel/head.S
just make sure that initially you create linux compatible
gtd in safe place. Note linux uses 0x10, 0x18 descriptors
for code/data and skips 0x8 - which typically is used for
data.
PS. esp = 0x90000 is used for 'big' kernels - reread ../kernel/heas.S
At 11:08 AM 4/26/99 -0500, Naushit Sakarvadia wrote:
>Hello
>
>Can you tell me what is the value of the esp before the instructin lss ...when
>it crashes...
>
>it should be 0x90000. Yours might be different because you are skipping
>uncompression part and the esp is
>being set there in head.S.
>
>you can see /usr/src/linux/arch/i386/boot/compressed/head.S there it is being
>initialised to
>0x90000 and you are skipping that...
>
>Let me know if you are successful or unsucessful...
>
>All the best..
>
>
>Regards,
>Naushit
>
>
>
>
>Andy Waddell wrote:
>
>> I've been attemping to get Linux to boot up out of FLASH on a SC400 eval
>> board and I've run into a little snag that someone may be able to help me
>> with.
>>
>> Since I already had a fairly full featured bootloader running on the board
>> which sets up the board and switches to protected mode, etc, I took the
>> approach of skipping the initial code in bootsect.S and setup.S and loading
>> the 32-bit code directly into memory and just jumping in. I figured that
>> any of the stuff I skipped I could just add into my bootloader or to some
>> place early the the 32-bit code. This seemed to work fairly well. The
>> decompression code seems to run just fine, and after decompression it jumps
>> in to the kernel proper at abosolute address 0x100000 (1 Meg). Once in the
>> kernel I'm executing fine for several instructions, but then the board
>> reboots. I've narrowed it down to one instruction (set ATW: comment below)
>> that is causing the problem, but I can't see why. I've dumped memory (after
>> the decompression) and everything seems to be in the correct place.
>> Something about turning on paging is causing things to fail, but I can't see
>> why. There must be something which is either set up by the BIOS or by the
>> code in setup.S (which I skipped) but I'm not enough of an x86 person to
>> know. This same kernel/code will run fine if I make a boot disk out of it
>> and use one of the BIOS's included with the board.
>>
>>
>>
>> from arch/i386/kernel/head.S
>>
>> /*
>> * swapper_pg_dir is the main page directory, address 0x00101000
>> */
>> ENTRY(stext)
>> ENTRY(_stext)
>> startup_32:
>> /*
>> * Set segments to known values
>> */
>> cld
>> movl $(__KERNEL_DS),%eax
>> movl %ax,%ds
>> movl %ax,%es
>> movl %ax,%fs
>> movl %ax,%gs
>> #ifdef __SMP__
>> orw %bx,%bx
>> jz 1f
>> /*
>> * New page tables may be in 4Mbyte page mode and may
>> * be using the global pages.
>> *
>> * NOTE! We have to correct for the fact that we're
>> * not yet offset PAGE_OFFSET..
>> */
>> #define cr4_bits mmu_cr4_features-__PAGE_OFFSET
>> movl %cr4,%eax # Turn on 4Mb pages
>> orl cr4_bits,%eax
>> movl %eax,%cr4
>> #endif
>> /*
>> * Setup paging (the tables are already set up, just switch them on)
>> */
>> 1:
>> movl $0x101000,%eax
>> movl %eax,%cr3 /* set the page table pointer.. */
>> movl %cr0,%eax
>> orl $0x80000000,%eax
>> movl %eax,%cr0 /* ..and set paging (PG) bit */
>> jmp 1f /* flush the prefetch-queue */
>> 1:
>> movl $1f,%eax
>> jmp *%eax /* make sure eip is relocated */
>> 1:
>>
>>
>>
>> /* ATW: my Elan board reboots on this instruction!!! (lss) */
>>
>>
>> /* Set up the stack pointer */
>> lss stack_start,%esp
>>
>> #ifdef __SMP__
>> orw %bx,%bx
>> jz 1f /* Initial CPU cleans BSS */
>> pushl $0
>> popfl
>> jmp checkCPUtype
>> 1:
>> #endif __SMP__
>> /*
>> * Clear BSS first so that there are no surprises...
>> */
>> xorl %eax,%eax
>> movl $ SYMBOL_NAME(__bss_start),%edi
>> movl $ SYMBOL_NAME(_end),%ecx
>> subl %edi,%ecx
>> cld
>> rep
>> stosb
>>
>> --andy
>>
>
>
>