This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Attempted PATCH PXE]: Take 1 dies on gdb access


Below is an attempted PXE startup patch based on floppy startup
for pc/redboot. I hope to contribute the patch when it's working.
The patch works fine to the redboot prompt and redboot commands.
The machine reboots when gdb tries to load a program.

Anything obviously wrong with this patch?

What the patch does

1. Re-use the floppy startup code; i.e. duplicate most of the files, change
load address from 0x00003000 to 0x00007C00
2. Avoid relocation to 0x00003000; leave everything at 0x00007C00
(I also tried another version that copied the NBP down to 0x3000 in case there
was some funky page alignment / free base mem issue - didn't help)
3. Skip sector loading and jump straight to protected mode setup code
4. NBP does not unload PXE UNDI (but this shouldn't be necessary right?)


What works:
1. Arriving at Redboot prompt and simple redboot commands.
2. Using memory dump I checked that the whole redboot.pxe file is loaded
correctly from 0x7C00 onwards.

What fails:
1. The moment gdb tries to load a program the system reboots.
2. Tried with RAM startup programs linked at 0x000108000 and 0x000208000; both
cause reboots.


On the test machine:
Redboot floppy works
Redboot GRUB works
Redboot floppy image booted by PXELINUX/pxelinux.0/memdisk/ works - so methnks PXE loading
should work - the main difference is that pxelinux.0 does actually unload the PXE stack
before jumping to memdisk.


Any ideas? Thanks.

Cheers
Richard Chan


diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/cdl/hal_i386_pc.cdl packages/hal/i386/pc/current/cdl/hal_i386_pc.cdl
--- /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/cdl/hal_i386_pc.cdl	2004-11-19 09:16:28.081314080 +0800
+++ packages/hal/i386/pc/current/cdl/hal_i386_pc.cdl	2004-12-06 10:45:40.527377336 +0800
@@ -79,7 +79,7 @@
     cdl_component CYG_HAL_STARTUP {
         display       "Startup type"
         flavor        data
-        legal_values  {"RAM" "FLOPPY" "ROM" "GRUB"}
+        legal_values  {"RAM" "FLOPPY" "ROM" "GRUB" "PXE"}
         default_value {"RAM"}
 	no_define
 	define -file system.h CYG_HAL_STARTUP
@@ -90,7 +90,8 @@
             to a floppy disk, which can then be used for booting
             on PCs with a standard BIOS), GRUB startup (for being booted
             by the GRUB bootloader) ROM startup (for writing
-            straight to a boot ROM/Flash). ROM startup is experimental
+            straight to a boot ROM/Flash) PXE startup (for being booted by a 
+            NIC card with PXE boot ROM. ROM startup is experimental
             at this time."
     }
 
@@ -242,7 +243,7 @@
         cdl_option CYGBLD_BUILD_GDB_STUBS {
             display "Build GDB stub loader image"
             default_value 0
-            requires { CYG_HAL_STARTUP == "FLOPPY" || CYG_HAL_STARTUP == "GRUB" }
+            requires { CYG_HAL_STARTUP == "FLOPPY" || CYG_HAL_STARTUP == "GRUB" || CYG_HAL_STARTUP == "PXE" }
             requires CYGSEM_HAL_ROM_MONITOR
             requires CYGBLD_BUILD_COMMON_GDB_STUBS
             requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
@@ -287,6 +288,7 @@
 						 "i386_pc_ram") : \
 		     CYG_HAL_STARTUP == "ROM"  ? "i386_pc_rom" : \
 		     CYG_HAL_STARTUP == "GRUB" ? "i386_pc_grub" : \
+		     CYG_HAL_STARTUP == "PXE" ? "i386_pc_pxe" : \
 	                                         "i386_pc_floppy" }
 
         cdl_option CYGHWR_MEMORY_LAYOUT_LDI {
@@ -300,6 +302,7 @@
 						     "<pkgconf/mlt_i386_pc_ram.ldi>") : \
 		         CYG_HAL_STARTUP == "ROM"  ? "<pkgconf/mlt_i386_pc_rom.ldi>" : \
 		         CYG_HAL_STARTUP == "GRUB" ? "<pkgconf/mlt_i386_pc_grub.ldi>" : \
+		         CYG_HAL_STARTUP == "PXE" ? "<pkgconf/mlt_i386_pc_pxe.ldi>" : \
                                                      "<pkgconf/mlt_i386_pc_floppy.ldi>" }
         }
 
@@ -314,6 +317,7 @@
 						     "<pkgconf/mlt_i386_pc_ram.h>") : \
 		         CYG_HAL_STARTUP == "ROM"  ? "<pkgconf/mlt_i386_pc_rom.h>" : \
 		         CYG_HAL_STARTUP == "GRUB" ? "<pkgconf/mlt_i386_pc_grub.h>" : \
+		         CYG_HAL_STARTUP == "PXE" ? "<pkgconf/mlt_i386_pc_pxe.h>" : \
                                                        "<pkgconf/mlt_i386_pc_floppy.h>" }
         }
     }
@@ -324,7 +328,7 @@
         default_value 0
 	
         parent        CYGPKG_HAL_ROM_MONITOR
-        requires      { CYG_HAL_STARTUP == "FLOPPY" || CYG_HAL_STARTUP == "ROM" || CYG_HAL_STARTUP == "GRUB" }
+        requires      { CYG_HAL_STARTUP == "FLOPPY" || CYG_HAL_STARTUP == "ROM" || CYG_HAL_STARTUP == "GRUB" || CYG_HAL_STARTUP == "PXE" }
 	requires      { !CYGHWR_HAL_I386_FPU_SWITCH_LAZY }
         description   "
             Enable this option if this program is to be used as a ROM monitor,
@@ -386,6 +390,22 @@
                 }
             }
     
+            cdl_option CYGBLD_BUILD_REDBOOT_BIN_PXE {
+                display       "Build Redboot PXE binary image"
+                active_if     CYGBLD_BUILD_REDBOOT
+                active_if     { CYG_HAL_STARTUP == "PXE" }
+                calculated    1
+                no_define
+                description "This option enables the conversion of the Redboot 
+                             ELF image to a binary image suitable for network bootin
+                             via PXE."
+        
+                make -priority 325 {
+                    <PREFIX>/bin/redboot.pxe : <PREFIX>/bin/redboot.elf
+                    $(OBJCOPY) -O binary $< $@
+                }
+            }
+    
             cdl_option CYGBLD_BUILD_REDBOOT_BIN_ROM {
                 display       "Build Redboot ROM binary image"
                 active_if     CYGBLD_BUILD_REDBOOT
diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.h packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.h
--- /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.h	1970-01-01 07:30:00.000000000 +0730
+++ packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.h	2004-12-06 10:46:53.317311584 +0800
@@ -0,0 +1,22 @@
+// eCos memory layout - Fri Oct 20 08:16:03 2000
+
+// This is a generated file - do not edit
+
+#ifndef __ASSEMBLER__
+#include <cyg/infra/cyg_type.h>
+#include <stddef.h>
+
+#endif
+#define CYGMEM_REGION_ram (0)
+#define CYGMEM_REGION_ram_SIZE (0xa0000)
+#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
+#ifndef __ASSEMBLER__
+extern char CYG_LABEL_NAME (__heap1) [];
+#endif
+#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1))
+#define CYGMEM_SECTION_heap1_SIZE (0xa0000 - (size_t) CYG_LABEL_NAME (__heap1))
+#ifndef __ASSEMBLER__
+extern char CYG_LABEL_NAME (__pci_window) [];
+#endif
+#define CYGMEM_SECTION_pci_window (CYG_LABEL_NAME (__pci_window))
+#define CYGMEM_SECTION_pci_window_SIZE (0x64000)
diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.ldi packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.ldi
--- /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.ldi	1970-01-01 07:30:00.000000000 +0730
+++ packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.ldi	2004-12-06 10:47:25.519416120 +0800
@@ -0,0 +1,29 @@
+// eCos memory layout - Fri Oct 20 08:16:03 2000
+
+// This is a generated file - do not edit
+
+#include <cyg/infra/cyg_type.inc>
+
+MEMORY
+{
+    ram : ORIGIN = 0, LENGTH = 0xa0000
+}
+
+SECTIONS
+{
+    SECTIONS_BEGIN
+    SECTION_vectors (ram, 0x7C00, LMA_EQ_VMA)
+    SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA)
+    SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA)
+    SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA)
+    SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA)
+    SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA)
+    SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA)
+    SECTION_rel__got (ram, ALIGN (0x1), LMA_EQ_VMA)
+    SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA)
+    SECTION_sbss (ram, ALIGN (0x4), LMA_EQ_VMA)
+    SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA)
+    CYG_LABEL_DEFN(__pci_window) = ALIGN(0x10); . = CYG_LABEL_DEFN(__pci_window) + 0x64000;
+    CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
+    SECTIONS_END
+}
diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.mlt packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.mlt
--- /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.mlt	1970-01-01 07:30:00.000000000 +0730
+++ packages/hal/i386/pc/current/include/pkgconf/mlt_i386_pc_pxe.mlt	2004-12-06 10:47:40.805092344 +0800
@@ -0,0 +1,16 @@
+version 0
+region ram 0 a0000 0 !
+section vectors 0 1 0 1 1 1 1 1 7C00 7C00 text text !
+section text 0 4 0 1 0 1 0 1 fini fini !
+section fini 0 4 0 1 0 1 0 1 rodata1 rodata1 !
+section rodata1 0 8 0 1 0 1 0 1 rodata rodata !
+section rodata 0 8 0 1 0 1 0 1 fixup fixup !
+section fixup 0 4 0 1 0 1 0 1 gcc_except_table gcc_except_table !
+section gcc_except_table 0 1 0 1 0 1 0 1 rel.got rel.got !
+section rel.got 0 1 0 1 0 1 0 1 data data !
+section data 0 8 0 1 0 1 0 1 sbss sbss !
+section sbss 0 4 0 1 0 1 0 1 bss bss !
+section bss 0 10 0 1 0 1 0 1 pci_window pci_window !
+section pci_window 64000 10 0 0 0 1 0 1 heap1 heap1 !
+section heap1 0 8 0 0 0 0 0 0 !
+section rom 60000 1 0 0 1 0 1 0 a0000 a0000 !
diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/misc/redboot_PXE.ecm packages/hal/i386/pc/current/misc/redboot_PXE.ecm
--- /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/misc/redboot_PXE.ecm	1970-01-01 07:30:00.000000000 +0730
+++ packages/hal/i386/pc/current/misc/redboot_PXE.ecm	2004-12-06 10:38:19.048492328 +0800
@@ -0,0 +1,50 @@
+cdl_savefile_version 1;
+cdl_savefile_command cdl_savefile_version {};
+cdl_savefile_command cdl_savefile_command {};
+cdl_savefile_command cdl_configuration { description hardware template package };
+cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value };
+
+cdl_configuration eCos {
+#    package CYGPKG_IO_FLASH current ;
+    package CYGPKG_IO_ETH_DRIVERS current ;
+};
+
+cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT {
+    user_value 0
+};
+
+cdl_option CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM {
+    user_value 0
+};
+
+cdl_option CYGSEM_HAL_ROM_MONITOR {
+    user_value 1
+};
+
+cdl_component CYG_HAL_STARTUP {
+    user_value PXE
+};
+
+cdl_option CYGBLD_BUILD_REDBOOT {
+    user_value 1
+};
+
+cdl_option CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS {
+    user_value 0
+};
+
+#cdl_option CYGSEM_REDBOOT_FLASH_CONFIG {
+#    user_value 1
+#};
+#
+#cdl_option CYGBLD_REDBOOT_FLASH_BOOT_OFFSET {
+#  inferred_value 0x1C00000
+#};
+
+cdl_option CYGSEM_REDBOOT_BSP_SYSCALLS {
+  user_value 1
+};
+
diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/misc/redboot_PXE_SMP.ecm packages/hal/i386/pc/current/misc/redboot_PXE_SMP.ecm
--- /d1/cvs/ecos/ecos/packages/hal/i386/pc/current/misc/redboot_PXE_SMP.ecm	1970-01-01 07:30:00.000000000 +0730
+++ packages/hal/i386/pc/current/misc/redboot_PXE_SMP.ecm	2004-12-06 10:38:41.509077800 +0800
@@ -0,0 +1,44 @@
+cdl_savefile_version 1;
+cdl_savefile_command cdl_savefile_version {};
+cdl_savefile_command cdl_savefile_command {};
+cdl_savefile_command cdl_configuration { description hardware template package };
+cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value };
+cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value };
+
+cdl_configuration eCos {
+    package CYGPKG_IO_ETH_DRIVERS current ;
+};
+
+cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT {
+    user_value 0
+};
+
+cdl_option CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM {
+    user_value 0
+};
+
+cdl_option CYGSEM_HAL_ROM_MONITOR {
+    user_value 1
+};
+
+cdl_component CYG_HAL_STARTUP {
+    user_value PXE
+};
+
+cdl_option CYGBLD_BUILD_REDBOOT {
+    user_value 1
+};
+
+cdl_option CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS {
+    user_value 0
+};
+
+cdl_component CYGPKG_HAL_SMP_SUPPORT {
+    user_value 1
+};
+
+cdl_component CYGHWR_HAL_I386_FPU_SWITCH_LAZY {
+    user_value 0
+};
diff -N -x '*ORIG' -x '*~' -r -u /d1/cvs/ecos/ecos/packages/hal/i386/pcmb/current/include/pcmb.inc packages/hal/i386/pcmb/current/include/pcmb.inc
--- /d1/cvs/ecos/ecos/packages/hal/i386/pcmb/current/include/pcmb.inc	2002-05-29 08:24:50.000000000 +0800
+++ packages/hal/i386/pcmb/current/include/pcmb.inc	2004-12-06 10:34:07.867677616 +0800
@@ -60,7 +60,7 @@
 
 #ifndef CYGPKG_HAL_I386_CPU_INIT_DEFINED
 	
-#ifdef CYG_HAL_STARTUP_FLOPPY
+#if defined(CYG_HAL_STARTUP_FLOPPY) || defined(CYG_HAL_STARTUP_PXE)
 
 #define CYGPKG_HAL_I386_CPU_INIT_DEFINED
 
@@ -101,6 +101,10 @@
 	shl	$10, %eax
 	pushl	%eax
 
+#ifdef CYG_HAL_STARTUP_PXE
+	/* PXE has loaded us at 0x7C00 */
+	ljmp $0,$_pxeloaded
+#else
 	/* reset floppy */
 	movb $0,%ah
 	movb $0,%dl
@@ -203,6 +207,7 @@
 	jmp _start
 
 
+#endif /* CYG_HAL_STARTUP_PXE */
         /* Write the 0x55/0xAA signature at the end of the first
 	block.  Without this signature the BIOS won't consider this
 	block to be bootable.  
@@ -226,6 +231,7 @@
 	cmpb	$0, %al
 	jne	2b
 
+_pxeloaded:
 	/* Now we're all loaded up in memory. */
 
 	/* Optionally switch to a high-res video before entering	*/

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]