Deduplicate code.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user