diff --git a/arch/sparc32/aoutload.c b/arch/sparc32/aoutload.c index b85561b..29defac 100644 --- a/arch/sparc32/aoutload.c +++ b/arch/sparc32/aoutload.c @@ -65,6 +65,7 @@ int aout_load(struct sys_info *info, const char *filename, const char *cmdline) goto out; for (offset = 0; offset < 16 * 512; offset += 512) { + file_seek(offset); if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) { debug("Can't read a.out header\n"); retval = LOADER_NOT_SUPPORT; @@ -72,8 +73,6 @@ int aout_load(struct sys_info *info, const char *filename, const char *cmdline) } if (!N_BADMAG(ehdr)) break; - - file_seek(offset); } if (N_BADMAG(ehdr)) { diff --git a/arch/sparc32/ldscript b/arch/sparc32/ldscript index f885b98..884ca07 100644 --- a/arch/sparc32/ldscript +++ b/arch/sparc32/ldscript @@ -14,7 +14,7 @@ BASE_ADDR = 0xffd00000; HEAP_SIZE = 16384; STACK_SIZE = 16384; VMEM_SIZE = 128 * 1024; -IOMEM_SIZE = 128 * 1024; +IOMEM_SIZE = 256 * 1024; SECTIONS { diff --git a/drivers/esp.c b/drivers/esp.c index f7b45a4..ed4b3a4 100644 --- a/drivers/esp.c +++ b/drivers/esp.c @@ -140,9 +140,11 @@ do_command(esp_private_t *esp, sd_private_t *sd, int cmdlen, int replylen) // offset is multiple of 512, len in bytes static int -ob_sd_read_sectors(esp_private_t *esp, sd_private_t *sd, int offset, void *dest, short len) +ob_sd_read_sectors(esp_private_t *esp, sd_private_t *sd, int offset, void *dest, + short len, short sect_offset) { - DPRINTF("ob_sd_read_sectors id %d %lx block=%d len=%d\n", sd->id, (unsigned long)dest, offset, len); + DPRINTF("ob_sd_read_sectors id %d %lx sector=%d len=%d soff %d\n", + sd->id, (unsigned long)dest, offset, len, sect_offset); // Setup command = Read(10) memset(esp->buffer, 0, 10); @@ -157,10 +159,10 @@ ob_sd_read_sectors(esp_private_t *esp, sd_private_t *sd, int offset, void *dest, esp->buffer[8] = (len >> 8) & 0xff; esp->buffer[9] = len & 0xff; - if (do_command(esp, sd, 10, len * 512)) + if (do_command(esp, sd, 10, len * 512 + sect_offset)) return 0; - memcpy(dest, esp->buffer, len * 512); + memcpy(dest, esp->buffer + sect_offset, len * 512); return 0; } @@ -179,12 +181,8 @@ read_capacity(esp_private_t *esp, sd_private_t *sd) return 0; } - sd->sectors = (esp->buffer[0] << 24) | (esp->buffer[1] << 16) | (esp->buffer[2] << 8) | esp->buffer[3]; -#if 0 sd->bs = (esp->buffer[4] << 24) | (esp->buffer[5] << 16) | (esp->buffer[6] << 8) | esp->buffer[7]; -#else - sd->bs = 512; -#endif + sd->sectors = ((esp->buffer[0] << 24) | (esp->buffer[1] << 16) | (esp->buffer[2] << 8) | esp->buffer[3]) * (sd->bs / 512); return 1; } @@ -232,16 +230,20 @@ ob_sd_read_blocks(sd_private_t **sd) cell n = POP(), cnt = n; ucell blk = POP(); char *dest = (char*)POP(); + int pos, spb, sect_offset; DPRINTF("ob_sd_read_blocks id %d %lx block=%d n=%d\n", (*sd)->id, (unsigned long)dest, blk, n ); - n *= (*sd)->bs / 512; + spb = (*sd)->bs / 512; while (n) { - if (ob_sd_read_sectors(global_esp, *sd, blk, dest, 1)) { - DPRINTF("ob_ide_read_blocks: error\n"); + sect_offset = blk / spb; + pos = (blk - sect_offset * spb) * 512; + + if (ob_sd_read_sectors(global_esp, *sd, sect_offset, dest, 1, pos)) { + DPRINTF("ob_sd_read_blocks: error\n"); RET(0); } - dest += (*sd)->bs; + dest += 512; n--; blk++; } @@ -249,9 +251,9 @@ ob_sd_read_blocks(sd_private_t **sd) } static void -ob_sd_block_size(sd_private_t **sd) +ob_sd_block_size(__attribute__((unused))sd_private_t **sd) { - PUSH((*sd)->bs); + PUSH(512); } static void diff --git a/forth/admin/nvram.fs b/forth/admin/nvram.fs index 3b7d3f7..b6d4cdf 100644 --- a/forth/admin/nvram.fs +++ b/forth/admin/nvram.fs @@ -344,6 +344,17 @@ no-conf-def " security-mode" secmode-config " true" " little-endian?" bool-config [THEN] +[IFDEF] CONFIG_SPARC32 +\ ---- SPARC32 ---- +" true" " tpe-link-test?" bool-config +" 9600,8,n,1,-" " ttya-mode" str-config +" true" " ttya-ignore-cd" bool-config +" false" " ttya-rts-dtr-off" bool-config +" 9600,8,n,1,-" " ttyb-mode" str-config +" true" " ttyb-ignore-cd" bool-config +" false" " ttyb-rts-dtr-off" bool-config +[THEN] + \ --- ??? --- " " " boot-screen" str-config " " " boot-script" str-config diff --git a/modules/sun-parts.c b/modules/sun-parts.c index 30a71be..8425552 100644 --- a/modules/sun-parts.c +++ b/modules/sun-parts.c @@ -119,7 +119,7 @@ sunparts_open( sunparts_info_t *di ) RET(0); } - bs = 512; // XXX get real block size? + bs = 512; /* get partition data */ p = (struct sun_disklabel *)buf;