47 #define DEV_8259_LENGTH 2 55 uint64_t idata = 0, odata = 0;
63 fatal(
"[ 8259: read from 0x%x ]\n", (
int)relative_addr);
65 fatal(
"[ 8259: write to 0x%x: 0x%x ]\n",
66 (
int)relative_addr, (
int)idata);
69 switch (relative_addr) {
72 if ((idata & 0x10) == 0x10) {
75 fatal(
"[ 8259: TODO: Level " 76 "triggered (MCA bus) ]\n");
78 fatal(
"[ 8259: WARNING: Bit 2 set ]\n");
92 fatal(
"[ 8259: WARNING: Was in init-state, but" 93 " it was aborted? ]\n");
98 }
else if (idata == 0x0b) {
100 }
else if (idata == 0x0c) {
103 }
else if (idata == 0x20) {
104 int old_irr = d->
irr;
111 if ((old_irr & ~d->
ier) != (d->
irr & ~d->
ier)) {
117 }
else if ((idata >= 0x21 && idata <= 0x27) ||
118 (idata >= 0x60 && idata <= 0x67) ||
119 (idata >= 0xe0 && idata <= 0xe7)) {
121 int old_irr = d->
irr;
122 d->
irr &= ~(1 << (idata & 7));
123 d->
isr &= ~(1 << (idata & 7));
125 if ((old_irr & ~d->
ier) != (d->
irr & ~d->
ier)) {
131 }
else if (idata == 0x68) {
134 }
else if (idata >= 0xc0 && idata <= 0xc7) {
138 fatal(
"[ 8259: unimplemented command 0x%02x" 154 if ((d->
irr >> i) & 1) {
162 if ((d->
irr >> i) & 1) {
199 debug(
"[ 8259: WARNING! Bit 1 i" 200 "n Init Cmd 4 is set! ]\n");
203 fatal(
"[ 8259: WARNING! Bit 0 " 204 "in Init Cmd 4 is not" 212 int old_ier = d->
ier;
217 if ((d->
irr & ~old_ier) != (d->
irr & ~d->
ier)) {
229 fatal(
"[ 8259: unimplemented write to address 0x%x" 230 " data=0x%02x ]\n", (
int)relative_addr, (
int)idata);
233 fatal(
"[ 8259: unimplemented read from address 0x%x " 234 "]\n", (
int)relative_addr);
273 strlcat(name2,
" [secondary]", nlen);
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
void fatal(const char *fmt,...)
#define CHECK_ALLOCATION(ptr)
#define INTERRUPT_ASSERT(istruct)
#define INTERRUPT_CONNECT(name, istruct)
void COMBINE() strlen(struct cpu *cpu, struct arm_instr_call *ic, int low_addr)
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
#define INTERRUPT_DEASSERT(istruct)