Andreas,
I haven't found a way to tell ARAnyM to load the kernel to FastRAM, so
this will need testing on real hardware,

Can you try this patch?  Use [LILO] SkipSTRAM = true to enable.

Thanks for providing this patch - I will have to check whether I can get all packages I need to compile ARAnyM on my PC (last time I tried, it was a bit tricky).

Cheers,

   Michael


Andreas.

diff --git a/src/bootos_linux.cpp b/src/bootos_linux.cpp
index 78adbb8..c0e55bb 100644
--- a/src/bootos_linux.cpp
+++ b/src/bootos_linux.cpp
@@ -409,7 +409,7 @@ int LinuxBootOs::checkKernel(void)
     Elf32_Ehdr *kexec_elf;     /* header of kernel executable */
     Elf32_Phdr *kernel_phdrs;
        unsigned long min_addr=0xffffffff, max_addr=0;
-       unsigned long kernel_size, mem_ptr;
+       unsigned long kernel_size, mem_ptr, kernel_offset;
        int i;
        const char *kname, *kernel_name="vmlinux";
@@ -475,6 +475,10 @@ int LinuxBootOs::checkKernel(void)
        kernel_size = max_addr - min_addr;
        D(bug("lilo: kernel_size=%lu",kernel_size));
+ if (bx_options.lilo.skip_stram)
+               kernel_offset = FastRAMBase;
+       else
+               kernel_offset = 0;
        mem_ptr = KERNEL_START;
        for (i=0; i<SDL_SwapBE16(kexec_elf->e_phnum); i++) {
                unsigned long segment_length;
@@ -490,21 +494,29 @@ int LinuxBootOs::checkKernel(void)
                }
                segment_ptr =  SDL_SwapBE32(kernel_phdrs[i].p_vaddr)-PAGE_SIZE;
- memcpy(((char *)RAMBaseHost) + mem_ptr + segment_ptr, ((char *) kexec_elf) + segment_offset, segment_length);
+               if (bx_options.lilo.skip_stram)
+                       memcpy (FastRAMBaseHost + mem_ptr + segment_ptr, (char 
*) kexec_elf + segment_offset, segment_length);
+               else
+                       memcpy(RAMBaseHost + mem_ptr + segment_ptr, (char *) 
kexec_elf + segment_offset, segment_length);
- D(bug("lilo: Copied segment %d: 0x%08x,0x%08x at 0x%08x",i,segment_offset,segment_length,mem_ptr+segment_ptr));
+           D(bug("lilo: Copied segment %d: 0x%08x,0x%08x at 
0x%08x",i,segment_offset,segment_length,kernel_offset+mem_ptr+segment_ptr));
        }
/*--- Copy the ramdisk after kernel (and reserved bootinfo) ---*/
        if (ramdisk && ramdisk_length) {
                unsigned long rd_start;
                unsigned long rd_len;
+               unsigned long rd_offset;
+ if (bx_options.lilo.skip_stram)
+                       rd_offset = KERNEL_START + kernel_size + MAX_BI_SIZE;
+               else
+                       rd_offset = 0;
                rd_len = ramdisk_length - RAMDISK_FS_START;
-               if (FastRAMSize>rd_len) {
+               if (FastRAMSize > rd_offset + rd_len) {
                        /* Load in FastRAM */
-                       rd_start = FastRAMBase;
-                       memcpy(FastRAMBaseHost, ((unsigned char *)ramdisk) + 
RAMDISK_FS_START, rd_len);
+                       rd_start = FastRAMBase + rd_offset;
+                       memcpy(FastRAMBaseHost + rd_offset, (unsigned char 
*)ramdisk + RAMDISK_FS_START, rd_len);
                } else {
                        /* Load in ST-RAM */
                        rd_start = RAMSize - rd_len;
@@ -519,7 +531,7 @@ int LinuxBootOs::checkKernel(void)
                for (i=0; i<16; i++) {
                        uint32 *tmp;
- tmp = (uint32 *)(((unsigned char *)FastRAMBaseHost) /*+ rd_start*/ + 512);
+                       tmp = (uint32 *)((unsigned char *)FastRAMBaseHost + 
rd_offset + 512);
                        D(bug("lilo: ramdisk[%d]=0x%08x",i, 
SDL_SwapBE32(tmp[i])));
                }
 #endif
@@ -557,7 +569,8 @@ int LinuxBootOs::checkKernel(void)
        bi.mch_type = SDL_SwapBE32(ATARI_MACH_AB40);
bi.num_memory=0;
-       ADD_CHUNK(0, RAMSize);
+       if (!bx_options.lilo.skip_stram)
+               ADD_CHUNK(0, RAMSize);
        if (FastRAMSize>0) {
                ADD_CHUNK(FastRAMBase, FastRAMSize);
        }
@@ -569,24 +582,30 @@ int LinuxBootOs::checkKernel(void)
        }
/*--- Copy boot info in RAM ---*/
-       memcpy(RAMBaseHost + KERNEL_START + kernel_size, &bi_union.record, 
bi_size);
-    D(bug("lilo: bootinfo at 0x%08x",KERNEL_START + kernel_size));
+       if (bx_options.lilo.skip_stram)
+               memcpy(FastRAMBaseHost + KERNEL_START + kernel_size, 
&bi_union.record, bi_size);
+       else
+               memcpy(RAMBaseHost + KERNEL_START + kernel_size, 
&bi_union.record, bi_size);
+       D(bug("lilo: bootinfo at 0x%08x", kernel_offset + KERNEL_START + 
kernel_size));
for (i=0; i<16; i++) {
                uint32 *tmp;
- tmp = (uint32 *)(((unsigned char *)RAMBaseHost) + KERNEL_START + kernel_size);
+               if (bx_options.lilo.skip_stram)
+                       tmp = (uint32 *)((unsigned char *)FastRAMBaseHost + 
KERNEL_START + kernel_size);
+               else
+                       tmp = (uint32 *)((unsigned char *)RAMBaseHost + 
KERNEL_START + kernel_size);
                D(bug("lilo: bi_union.record[%d]=0x%08x",i, 
SDL_SwapBE32(tmp[i])));
        }
/*--- Init SP & PC ---*/
        uint32 *tmp = (uint32 *)RAMBaseHost;
-       tmp[0] = SDL_SwapBE32(KERNEL_START);    /* SP */
+       tmp[0] = SDL_SwapBE32(kernel_offset + KERNEL_START);    /* SP */
        tmp[1] = SDL_SwapBE32(0x00e00000);              /* PC = ROMBase */
-       ROMBaseHost[4] = KERNEL_START >> 24;
-       ROMBaseHost[5] = KERNEL_START >> 16;
-       ROMBaseHost[6] = KERNEL_START >>  8;
-       ROMBaseHost[7] = KERNEL_START & 0xff;
+       ROMBaseHost[4] = (kernel_offset + KERNEL_START) >> 24;
+       ROMBaseHost[5] = (kernel_offset + KERNEL_START) >> 16;
+       ROMBaseHost[6] = (kernel_offset + KERNEL_START) >>  8;
+       ROMBaseHost[7] = (kernel_offset + KERNEL_START) & 0xff;
        
        D(bug("lilo: ok"));
diff --git a/src/include/parameters.h b/src/include/parameters.h
index fad3b5f..93be09c 100644
--- a/src/include/parameters.h
+++ b/src/include/parameters.h
@@ -155,6 +155,7 @@ typedef struct {
        char kernel[512];       /* /path/to/vmlinux[.gz] */
        char args[512];         /* command line arguments for kernel */
        char ramdisk[512];      /* /path/to/ramdisk[.gz] */
+       bool skip_stram;        /* load kernel to TT RAM */
 } bx_lilo_options_t;
// Midi options
diff --git a/src/parameters.cpp b/src/parameters.cpp
index aea8b95..66a4bfb 100644
--- a/src/parameters.cpp
+++ b/src/parameters.cpp
@@ -595,6 +595,7 @@ struct Config_Tag lilo_conf[]={
        { "Kernel", Path_Tag, &LILO(kernel), sizeof(LILO(kernel)), 0},
        { "Args", String_Tag, &LILO(args), sizeof(LILO(args)), 0},
        { "Ramdisk", Path_Tag, &LILO(ramdisk), sizeof(LILO(ramdisk)), 0},
+       { "SkipSTRAM", Bool_Tag, &LILO(skip_stram), 0, 0},
        { NULL , Error_Tag, NULL, 0, 0 }
 };
@@ -603,6 +604,7 @@ void preset_lilo()
   safe_strncpy(LILO(kernel), "linux.bin", sizeof(LILO(kernel)));
   safe_strncpy(LILO(args), "root=/dev/ram video=atafb:vga16", 
sizeof(LILO(args)));
   safe_strncpy(LILO(ramdisk), "root.bin", sizeof(LILO(ramdisk)));
+  LILO(skip_stram) = false;
 }
void postload_lilo()



--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: https://lists.debian.org/[email protected]

Reply via email to