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:
@@ -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;
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user