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; | ... | ... |