diff -r ffa851df0825 -r 2fb8b9db1c86 symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_interrupt.py --- /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)