Use real time RTC as main RTC to avoid issues with timeouts and such.

Make available MC time via secondary RTC.
This commit is contained in:
Florian Nücke
2020-12-27 04:59:24 +01:00
parent b40dcd4669
commit adfda67edd
3 changed files with 21 additions and 17 deletions

View File

@@ -416,7 +416,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic
super.loadServer();
busElement.initialize();
virtualMachine.rtc.setWorld(getWorld());
virtualMachine.rtcMinecraft.setWorld(getWorld());
}
@Override
@@ -565,8 +565,8 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic
}
private static final class ComputerVirtualMachine extends VirtualMachine {
private static final int UART_INTERRUPT = 0x3;
private static final int VFS_INTERRUPT = 0x4;
private static final int UART_INTERRUPT = 0x4;
private static final int VFS_INTERRUPT = 0x5;
@Serialized public UART16550A uart;
@Serialized public VirtIOFileSystemDevice vfs;

View File

@@ -8,21 +8,20 @@ import li.cil.oc2.api.bus.device.vm.VMContext;
import li.cil.oc2.common.bus.RPCAdapter;
import li.cil.sedna.api.device.InterruptController;
import li.cil.sedna.device.rtc.GoldfishRTC;
import li.cil.sedna.device.rtc.SystemTimeRealTimeCounter;
import li.cil.sedna.device.virtio.VirtIOConsoleDevice;
import li.cil.sedna.riscv.R5Board;
public class VirtualMachine {
// We report a clock rate to the VM such that for the VM it looks as though
// passes as much faster as MC time passes faster than real time.
public static final int REPORTED_CPU_FREQUENCY = 700_000;
public static final int ACTUAL_CPU_FREQUENCY = REPORTED_CPU_FREQUENCY * 72;
public static final int CPU_FREQUENCY = 33_000_000;
public static final int RTC_INTERRUPT = 0x1;
public static final int RPC_INTERRUPT = 0x2;
public static final int RTC_HOST_INTERRUPT = 0x1;
public static final int RTC_MINECRAFT_INTERRUPT = 0x2;
public static final int RPC_INTERRUPT = 0x3;
///////////////////////////////////////////////////////////////////
public final MinecraftRealTimeCounter rtc = new MinecraftRealTimeCounter();
public final MinecraftRealTimeCounter rtcMinecraft = new MinecraftRealTimeCounter();
///////////////////////////////////////////////////////////////////
@@ -36,7 +35,7 @@ public class VirtualMachine {
public VirtualMachine(final DeviceBusController busController) {
board = new R5Board();
board.getCpu().setFrequency(REPORTED_CPU_FREQUENCY);
board.getCpu().setFrequency(CPU_FREQUENCY);
vmAdapter = new VirtualMachineDeviceBusAdapter(board);
final VMContext context = vmAdapter.getGlobalContext();
@@ -45,10 +44,15 @@ public class VirtualMachine {
final InterruptAllocator interruptAllocator = context.getInterruptAllocator();
final InterruptController interruptController = context.getInterruptController();
final GoldfishRTC rtc = new GoldfishRTC(this.rtc);
interruptAllocator.claimInterrupt(RTC_INTERRUPT).ifPresent(interrupt ->
rtc.getInterrupt().set(interrupt, interruptController));
memoryRangeAllocator.claimMemoryRange(rtc);
final GoldfishRTC rtcHost = new GoldfishRTC(SystemTimeRealTimeCounter.get());
interruptAllocator.claimInterrupt(RTC_HOST_INTERRUPT).ifPresent(interrupt ->
rtcHost.getInterrupt().set(interrupt, interruptController));
memoryRangeAllocator.claimMemoryRange(rtcHost);
final GoldfishRTC rtcMinecraft = new GoldfishRTC(this.rtcMinecraft);
interruptAllocator.claimInterrupt(RTC_MINECRAFT_INTERRUPT).ifPresent(interrupt ->
rtcMinecraft.getInterrupt().set(interrupt, interruptController));
memoryRangeAllocator.claimMemoryRange(rtcMinecraft);
deviceBusSerialDevice = new VirtIOConsoleDevice(board.getMemoryMap());
interruptAllocator.claimInterrupt(RPC_INTERRUPT).ifPresent(interrupt ->

View File

@@ -98,7 +98,7 @@ public class VirtualMachineRunner implements Runnable {
///////////////////////////////////////////////////////////////////
private int getCyclesPerTick() {
return VirtualMachine.ACTUAL_CPU_FREQUENCY / TICKS_PER_SECOND;
private static int getCyclesPerTick() {
return VirtualMachine.CPU_FREQUENCY / TICKS_PER_SECOND;
}
}