From f90762d9289792c76beceed785e9bbfec9550797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Thu, 5 Aug 2021 02:18:12 +0200 Subject: [PATCH] Deduplicate code. --- .../li/cil/oc2/common/vm/BuiltinDevices.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/vm/BuiltinDevices.java b/src/main/java/li/cil/oc2/common/vm/BuiltinDevices.java index 92ebcfe1..aaaf8099 100644 --- a/src/main/java/li/cil/oc2/common/vm/BuiltinDevices.java +++ b/src/main/java/li/cil/oc2/common/vm/BuiltinDevices.java @@ -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 initialize(final GlobalVMContext context, final T device, final int interrupt, final Function interruptSupplier) { + if (!context.getInterruptAllocator().claimInterrupt(interrupt)) throw new IllegalStateException(); + interruptSupplier.apply(device).set(interrupt, context.getInterruptController()); + context.getMemoryRangeAllocator().claimMemoryRange(device); + return device; } }