Deduplicate code.

This commit is contained in:
Florian Nücke
2021-08-05 02:18:12 +02:00
parent 7959e85679
commit f90762d928

View File

@@ -3,12 +3,16 @@ package li.cil.oc2.common.vm;
import li.cil.ceres.api.Serialized;
import li.cil.oc2.common.bus.device.data.FileSystems;
import li.cil.oc2.common.vm.context.global.GlobalVMContext;
import li.cil.sedna.api.Interrupt;
import li.cil.sedna.api.device.MemoryMappedDevice;
import li.cil.sedna.device.rtc.GoldfishRTC;
import li.cil.sedna.device.rtc.SystemTimeRealTimeCounter;
import li.cil.sedna.device.serial.UART16550A;
import li.cil.sedna.device.virtio.VirtIOConsoleDevice;
import li.cil.sedna.device.virtio.VirtIOFileSystemDevice;
import java.util.function.Function;
public final class BuiltinDevices {
public static final int RTC_HOST_INTERRUPT = 0x1;
public static final int RTC_MINECRAFT_INTERRUPT = 0x2;
@@ -29,29 +33,19 @@ public final class BuiltinDevices {
///////////////////////////////////////////////////////////////////
public BuiltinDevices(final GlobalVMContext context) {
final GoldfishRTC rtcHost = new GoldfishRTC(SystemTimeRealTimeCounter.get());
if (!context.getInterruptAllocator().claimInterrupt(RTC_HOST_INTERRUPT)) throw new IllegalStateException();
rtcHost.getInterrupt().set(RTC_HOST_INTERRUPT, context.getInterruptController());
context.getMemoryRangeAllocator().claimMemoryRange(rtcHost);
initialize(context, new GoldfishRTC(SystemTimeRealTimeCounter.get()), RTC_HOST_INTERRUPT, GoldfishRTC::getInterrupt);
initialize(context, new GoldfishRTC(this.rtcMinecraft), RTC_MINECRAFT_INTERRUPT, GoldfishRTC::getInterrupt);
rpcSerialDevice = initialize(context, new VirtIOConsoleDevice(context.getMemoryMap()), RPC_INTERRUPT, VirtIOConsoleDevice::getInterrupt);
uart = initialize(context, new UART16550A(), UART_INTERRUPT, UART16550A::getInterrupt);
vfs = initialize(context, new VirtIOFileSystemDevice(context.getMemoryMap(), "builtin", FileSystems.getLayeredFileSystem()), VFS_INTERRUPT, VirtIOFileSystemDevice::getInterrupt);
}
final GoldfishRTC rtcMinecraft = new GoldfishRTC(this.rtcMinecraft);
if (!context.getInterruptAllocator().claimInterrupt(RTC_MINECRAFT_INTERRUPT)) throw new IllegalStateException();
rtcMinecraft.getInterrupt().set(RTC_MINECRAFT_INTERRUPT, context.getInterruptController());
context.getMemoryRangeAllocator().claimMemoryRange(rtcMinecraft);
///////////////////////////////////////////////////////////////////
rpcSerialDevice = new VirtIOConsoleDevice(context.getMemoryMap());
if (!context.getInterruptAllocator().claimInterrupt(RPC_INTERRUPT)) throw new IllegalStateException();
rpcSerialDevice.getInterrupt().set(RPC_INTERRUPT, context.getInterruptController());
context.getMemoryRangeAllocator().claimMemoryRange(rpcSerialDevice);
uart = new UART16550A();
if (!context.getInterruptAllocator().claimInterrupt(UART_INTERRUPT)) throw new IllegalStateException();
uart.getInterrupt().set(UART_INTERRUPT, context.getInterruptController());
context.getMemoryRangeAllocator().claimMemoryRange(uart);
vfs = new VirtIOFileSystemDevice(context.getMemoryMap(), "builtin", FileSystems.getLayeredFileSystem());
if (!context.getInterruptAllocator().claimInterrupt(VFS_INTERRUPT)) throw new IllegalStateException();
vfs.getInterrupt().set(VFS_INTERRUPT, context.getInterruptController());
context.getMemoryRangeAllocator().claimMemoryRange(vfs);
private static <T extends MemoryMappedDevice> T initialize(final GlobalVMContext context, final T device, final int interrupt, final Function<T, Interrupt> interruptSupplier) {
if (!context.getInterruptAllocator().claimInterrupt(interrupt)) throw new IllegalStateException();
interruptSupplier.apply(device).set(interrupt, context.getInterruptController());
context.getMemoryRangeAllocator().claimMemoryRange(device);
return device;
}
}