1  /* Reduced from qemu-7.2.0's hw/intc/omap_intc.c */
       2  
       3  #define NULL ((void*)0)
       4  
       5  typedef unsigned char __uint8_t;
       6  typedef unsigned int __uint32_t;
       7  typedef unsigned long int __uint64_t;
       8  typedef __uint8_t uint8_t;
       9  typedef __uint32_t uint32_t;
      10  typedef __uint64_t uint64_t;
      11  typedef uint64_t hwaddr;
      12  typedef struct omap_intr_handler_s omap_intr_handler;
      13  
      14  struct omap_intr_handler_bank_s
      15  {
      16    uint32_t irqs;
      17    uint32_t inputs;
      18    uint32_t mask;
      19    uint32_t fiq;
      20    uint32_t sens_edge;
      21    uint32_t swi;
      22    unsigned char priority[32];
      23  };
      24  
      25  struct omap_intr_handler_s
      26  {
      27    /* [...snip...] */
      28    unsigned char nbanks;
      29    /* [...snip...] */
      30    int sir_intr[2];
      31    int autoidle;
      32    uint32_t mask;
      33    struct omap_intr_handler_bank_s bank[3];
      34  };
      35  
      36  uint64_t
      37  omap2_inth_read(struct omap_intr_handler_s* s, int offset)
      38  {
      39    int bank_no, line_no;
      40    struct omap_intr_handler_bank_s* bank = NULL;
      41  
      42    if ((offset & 0xf80) == 0x80) {
      43      bank_no = (offset & 0x60) >> 5;
      44      if (bank_no < s->nbanks) {
      45        offset &= ~0x60;
      46        bank = &s->bank[bank_no];
      47      } else {
      48        return 0;
      49      }
      50    }
      51  
      52    switch (offset) {
      53      case 0x10:
      54        return (s->autoidle >> 2) & 1;
      55  
      56      case 0x14:
      57        return 1;
      58  
      59      case 0x40:
      60        return s->sir_intr[0];
      61  
      62      case 0x44:
      63        return s->sir_intr[1];
      64  
      65      case 0x48:
      66        return (!s->mask) << 2;
      67  
      68      case 0x4c:
      69        return 0;
      70  
      71      case 0x50:
      72        return s->autoidle & 3;
      73  
      74      case 0x80:
      75        return bank->inputs; /* { dg-bogus "dereference of NULL 'bank'" "PR analyzer/108806" } */
      76  
      77      case 0x84:
      78        return bank->mask; /* { dg-bogus "dereference of NULL 'bank'" "PR analyzer/108806" } */
      79  
      80      case 0x88:
      81      case 0x8c:
      82        return 0;
      83  
      84      case 0x90:
      85        return bank->swi; /* { dg-bogus "dereference of NULL 'bank'" "PR analyzer/108806" } */
      86  
      87      case 0x94:
      88        return 0;
      89  
      90      case 0x98:
      91        return bank->irqs & ~bank->mask & ~bank->fiq; /* { dg-bogus "dereference of NULL 'bank'" "PR analyzer/108806" } */
      92  
      93      case 0x9c:
      94        return bank->irqs & ~bank->mask & bank->fiq; /* { dg-bogus "dereference of NULL 'bank'" "PR analyzer/108806" } */
      95  
      96      case 0x100 ... 0x300:
      97        bank_no = (offset - 0x100) >> 7;
      98        if (bank_no > s->nbanks)
      99          break;
     100        bank = &s->bank[bank_no];
     101        line_no = (offset & 0x7f) >> 2;
     102        return (bank->priority[line_no] << 2) | ((bank->fiq >> line_no) & 1);
     103    }
     104    return 0;
     105  }