Commit 80637a6afd873791ba1766ba7b29b02aca7fd90c
1 parent
e42c20b4
Shuffle code to avoid NetBSD gcc 3.4.6 inlining bug (Rumko)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3924 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
43 additions
and
44 deletions
hw/slavio_serial.c
| ... | ... | @@ -215,7 +215,6 @@ struct SerialState { |
| 215 | 215 | static void handle_kbd_command(ChannelState *s, int val); |
| 216 | 216 | static int serial_can_receive(void *opaque); |
| 217 | 217 | static void serial_receive_byte(ChannelState *s, int ch); |
| 218 | -static inline void set_txint(ChannelState *s); | |
| 219 | 218 | |
| 220 | 219 | static void clear_queue(void *opaque) |
| 221 | 220 | { |
| ... | ... | @@ -321,28 +320,6 @@ static void slavio_serial_reset(void *opaque) |
| 321 | 320 | slavio_serial_reset_chn(&s->chn[1]); |
| 322 | 321 | } |
| 323 | 322 | |
| 324 | -static inline void clr_rxint(ChannelState *s) | |
| 325 | -{ | |
| 326 | - s->rxint = 0; | |
| 327 | - s->rxint_under_svc = 0; | |
| 328 | - if (s->chn == chn_a) { | |
| 329 | - if (s->wregs[W_MINTR] & MINTR_STATUSHI) | |
| 330 | - s->otherchn->rregs[R_IVEC] = IVEC_HINOINT; | |
| 331 | - else | |
| 332 | - s->otherchn->rregs[R_IVEC] = IVEC_LONOINT; | |
| 333 | - s->rregs[R_INTR] &= ~INTR_RXINTA; | |
| 334 | - } else { | |
| 335 | - if (s->wregs[W_MINTR] & MINTR_STATUSHI) | |
| 336 | - s->rregs[R_IVEC] = IVEC_HINOINT; | |
| 337 | - else | |
| 338 | - s->rregs[R_IVEC] = IVEC_LONOINT; | |
| 339 | - s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB; | |
| 340 | - } | |
| 341 | - if (s->txint) | |
| 342 | - set_txint(s); | |
| 343 | - slavio_serial_update_irq(s); | |
| 344 | -} | |
| 345 | - | |
| 346 | 323 | static inline void set_rxint(ChannelState *s) |
| 347 | 324 | { |
| 348 | 325 | s->rxint = 1; |
| ... | ... | @@ -367,6 +344,49 @@ static inline void set_rxint(ChannelState *s) |
| 367 | 344 | slavio_serial_update_irq(s); |
| 368 | 345 | } |
| 369 | 346 | |
| 347 | +static inline void set_txint(ChannelState *s) | |
| 348 | +{ | |
| 349 | + s->txint = 1; | |
| 350 | + if (!s->rxint_under_svc) { | |
| 351 | + s->txint_under_svc = 1; | |
| 352 | + if (s->chn == chn_a) { | |
| 353 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) | |
| 354 | + s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA; | |
| 355 | + else | |
| 356 | + s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA; | |
| 357 | + } else { | |
| 358 | + s->rregs[R_IVEC] = IVEC_TXINTB; | |
| 359 | + } | |
| 360 | + } | |
| 361 | + if (s->chn == chn_a) | |
| 362 | + s->rregs[R_INTR] |= INTR_TXINTA; | |
| 363 | + else | |
| 364 | + s->otherchn->rregs[R_INTR] |= INTR_TXINTB; | |
| 365 | + slavio_serial_update_irq(s); | |
| 366 | +} | |
| 367 | + | |
| 368 | +static inline void clr_rxint(ChannelState *s) | |
| 369 | +{ | |
| 370 | + s->rxint = 0; | |
| 371 | + s->rxint_under_svc = 0; | |
| 372 | + if (s->chn == chn_a) { | |
| 373 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) | |
| 374 | + s->otherchn->rregs[R_IVEC] = IVEC_HINOINT; | |
| 375 | + else | |
| 376 | + s->otherchn->rregs[R_IVEC] = IVEC_LONOINT; | |
| 377 | + s->rregs[R_INTR] &= ~INTR_RXINTA; | |
| 378 | + } else { | |
| 379 | + if (s->wregs[W_MINTR] & MINTR_STATUSHI) | |
| 380 | + s->rregs[R_IVEC] = IVEC_HINOINT; | |
| 381 | + else | |
| 382 | + s->rregs[R_IVEC] = IVEC_LONOINT; | |
| 383 | + s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB; | |
| 384 | + } | |
| 385 | + if (s->txint) | |
| 386 | + set_txint(s); | |
| 387 | + slavio_serial_update_irq(s); | |
| 388 | +} | |
| 389 | + | |
| 370 | 390 | static inline void clr_txint(ChannelState *s) |
| 371 | 391 | { |
| 372 | 392 | s->txint = 0; |
| ... | ... | @@ -389,27 +409,6 @@ static inline void clr_txint(ChannelState *s) |
| 389 | 409 | slavio_serial_update_irq(s); |
| 390 | 410 | } |
| 391 | 411 | |
| 392 | -static inline void set_txint(ChannelState *s) | |
| 393 | -{ | |
| 394 | - s->txint = 1; | |
| 395 | - if (!s->rxint_under_svc) { | |
| 396 | - s->txint_under_svc = 1; | |
| 397 | - if (s->chn == chn_a) { | |
| 398 | - if (s->wregs[W_MINTR] & MINTR_STATUSHI) | |
| 399 | - s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA; | |
| 400 | - else | |
| 401 | - s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA; | |
| 402 | - } else { | |
| 403 | - s->rregs[R_IVEC] = IVEC_TXINTB; | |
| 404 | - } | |
| 405 | - } | |
| 406 | - if (s->chn == chn_a) | |
| 407 | - s->rregs[R_INTR] |= INTR_TXINTA; | |
| 408 | - else | |
| 409 | - s->otherchn->rregs[R_INTR] |= INTR_TXINTB; | |
| 410 | - slavio_serial_update_irq(s); | |
| 411 | -} | |
| 412 | - | |
| 413 | 412 | static void slavio_serial_update_parameters(ChannelState *s) |
| 414 | 413 | { |
| 415 | 414 | int speed, parity, data_bits, stop_bits; | ... | ... |