[hatari-devel] MegaSTE cache emulation issues |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/hatari-devel Archives
]
- To: hatari-devel@xxxxxxxxxxxxxxxxxxx
- Subject: [hatari-devel] MegaSTE cache emulation issues
- From: Christian Zietz <czietz@xxxxxxx>
- Date: Sat, 28 Jun 2025 21:27:12 +0200
- Autocrypt: addr=czietz@xxxxxxx; keydata= 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
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1751138834; x=1751743634; i=czietz@xxxxxxx; bh=7DRxbmA0byhEYjDIO16ggndccPWrXacu0xhOOb95lkw=; h=X-UI-Sender-Class:Content-Type:Message-ID:Date:MIME-Version:To: From:Subject:cc:content-transfer-encoding:content-type:date:from: message-id:mime-version:reply-to:subject:to; b=siE3BZdb5cfdv76OI74fJc0ZRDejVN1KJ3KvEnlbub46f/Sn+8FhnTEcrtn+otwt dyU0xzZZgnf0R0E/ZObMr4IXWbldWKoQDM3fj1wbpXGOWWiova5vJXjEoJ5Jz31VQ 6JvNq9cWJlArliI2ibt5ZMgjCvBngEq40QdzwCGbOaxmjDPUBgT8nm4kJLymRLXtr NoRD/zaIv009mDVR9VGMd4vKeyhkQTyaE6uo+hVCz5FACn1RZaW3ir2K+MpUEziC/ VGUjCFzt9s5L9xCR3agL9+IAUn6+Qtye82mDrWhhJEcnhl7ULa89uUtWDZFB/Dwdn lfgxtC4GKzeR4Gzbow==
- Ui-outboundreport: notjunk:1;M01:P0:iDZL7Shu9pA=;EDDOlwX9WUzB/oIBMjJC+3IpOIP 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 cg==
Hi,
while investigating why Spectre stopped working on Hatari 2.6.0 in
MegaSTE 16 MHz + cache mode (reported here
https://www.atari-forum.com/viewtopic.php?p=482013#p482013), I found
three issues with the cache emulation. The attached test program
illustrates all three. The first two were "red herrings" as far as
Spectre is concerned, the third is the reason for the regression w.r.t.
Spectre.
#1: When no further files are found, Fsnext() zeroes the file name in
the DTA:
https://framagit.org/hatari/hatari/-/blob/v2.6.0/src/gemdos.c?ref_type=tags#L2965.
However, it does not flush/invalidate the cache, as
M68000_Flush_Data_Cache is only called in PopulateDTA. (This would
presumably also affect CPUs with built-in data cache.)
Note: As stated in the comments, C:\TEST.TXT must exist for the test
program to demonstrate this issue.
#2: When a write fails with a bus error (e.g. because of an attempted
write to ROM), the cache is still updated. I would have expected the bus
error to clear the entire cache as it happens on a real MegaSTE. The bus
error handling needs to be checked.
#3: Due to the 24-bit address bus of the 68000, the MegaSTE does not
care about the top eight bits of the address. However, the current code
in Hatari
https://framagit.org/hatari/hatari/-/blob/v2.6.0/src/m68000.c?ref_type=tags#L1242
treats addresses where the top bits are not zero as uncacheable. The
address should be taken AND 0xFFFFFF before doing this check.
All of these issues can potentially cause hard-to-debug problems in
MegaSTE 16 MHz + cache mode in Hatari 2.6.0.
Regards
Christian
#include <stdint.h>
#include <stdio.h>
#include <osbind.h>
#define TEST_ADDR_1 0u
#define TEST_ADDR_2A 0x000003f0ul
#define TEST_ADDR_2B 0x800003f0ul
_DTA *mydta;
void safe_write(uint32_t addr, uint16_t val)
{
__asm ("move.l 8.w,-(sp)\n"
"move.l #1f,8.w\n"
"move.l sp,a5\n"
"move.w %1,(%0)\n"
"1: move.l a5,sp\n"
"move.l (sp)+,8.w"
: : "a"(addr), "r"(val) : "a5","memory");
}
int main(void)
{
long ret1, ret2;
long old_ssp = Super(0ul);
uint16_t val1, val2;
// Fsfirst/Fsnext specific issue (C: needs to be a GEMDOS drive, and C:\TEST.TXT needs to exist)
mydta = (_DTA*)Fgetdta();
ret1 = Fsfirst("C:\\TEST.TXT", 0x27); // will succeed
val1 = *(volatile uint16_t*)(mydta->dta_name);
ret2 = Fsnext(); // will fail
// note that Fsnext will have zeroed out dta_name[0]
val2 = *(volatile uint16_t*)(mydta->dta_name);
printf("ret1 = %ld, ret2 = %ld\r\n", ret1, ret2);
printf("val = %04x (expected 5445)\r\n", val1);
printf("val = %04x (expected 0045)\r\n", val2);
// test a write that fails with a bus error
safe_write(TEST_ADDR_1, 0xaaaa);
printf("val = %04x (expected 602e)\r\n", *(volatile uint16_t*)TEST_ADDR_1);
// test a write to an address that aliases
*(volatile uint16_t*)TEST_ADDR_2A = 0xaaaa;
*(volatile uint16_t*)TEST_ADDR_2B = 0x5555;
printf("val = %04x (expected 5555)\r\n", *(volatile uint16_t*)TEST_ADDR_2A);
Super(old_ssp);
return 0;
}
Attachment:
grab0046.png
Description: PNG image
Attachment:
grab0047.png
Description: PNG image