symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_interrupt.py
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_interrupt.py	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,91 @@
+import qemu
+
+class syborg_interrupt(qemu.devclass):
+  REG_ID            = 0
+  REG_STATUS        = 1
+  REG_CURRENT       = 2
+  REG_DISABLE_ALL   = 3
+  REG_DISABLE       = 4
+  REG_ENABLE        = 5
+  REG_TOTAL         = 6
+
+  def update(self):
+    self.pending = self.level & self.enabled
+    self.set_irq_level(0, len(self.pending) > 0)
+
+  def set_input(self, n, level):
+    if level:
+      if n in self.level:
+        return
+      self.level.add(n)
+    else:
+      if n not in self.level:
+        return
+      self.level.discard(n)
+    self.update()
+
+  def create(self):
+    self.num_inputs = self.properties["num-interrupts"]
+    self.enabled = set()
+    self.level = set()
+    self.pending = set()
+    self.create_interrupts(self.set_input, self.num_inputs)
+
+  def read_reg(self, offset):
+    offset >>= 2
+    if offset == self.REG_ID:
+      return 0xc51d0000
+    elif offset == self.REG_STATUS:
+      return len(self.pending)
+    elif offset == self.REG_CURRENT:
+      for i in range(self.num_inputs):
+        if i in self.pending:
+          return i
+      return 0xffffffff
+    elif offset == self.REG_TOTAL:
+      return self.num_inputs
+    return 0
+
+  def write_reg(self, offset, value):
+    offset >>= 2
+    if offset == self.REG_DISABLE_ALL:
+      self.enabled = set()
+    elif offset == self.REG_DISABLE:
+      if (value < self.num_inputs):
+        self.enabled.discard(value)
+    elif offset == self.REG_ENABLE:
+      if (value < self.num_inputs):
+        self.enabled.add(value)
+    self.update()
+
+  def save(self, f):
+    f.put_u32(self.num_inputs)
+    for i in range(self.num_inputs):
+      val = 0
+      if i in self.enabled:
+        val |= 1
+      if i in self.level:
+        val |= 2
+      f.put_u32(val)
+
+  def load(self, f):
+    val = f.get_u32()
+    if val != self.num_inputs:
+      raise ValueError, "Incorrect number of IRQs"
+    self.level = set()
+    self.enabled = set()
+    for i in range(self.num_inputs):
+      val = f.get_u32()
+      if (val & 1) != 0:
+        self.enabled.add(i)
+      if (val & 2) != 0:
+        self.level.add(i)
+    self.update()
+
+  # Device class properties
+  regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
+  irqs = 1
+  name = "syborg,interrupt"
+  properties = {"num-interrupts":64}
+
+qemu.register_device(syborg_interrupt)