Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

undiisr.S 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #define PXENV_UNDI_ISR 0x0014
  2. #define PXENV_UNDI_ISR_IN_START 1
  3. #define PXENV_UNDI_ISR_OUT_OURS 0
  4. #define PXENV_UNDI_ISR_OUT_NOT_OURS 1
  5. #define IRQ_PIC_CUTOFF 8
  6. #define ICR_EOI_NON_SPECIFIC 0x20
  7. #define PIC1_ICR 0x20
  8. #define PIC2_ICR 0xa0
  9. .text
  10. .arch i386
  11. .section ".text16", "ax", @progbits
  12. .section ".data16", "aw", @progbits
  13. .code16
  14. .section ".text16"
  15. .globl undiisr
  16. undiisr:
  17. /* Preserve registers */
  18. pushw %ds
  19. pushw %es
  20. pushw %fs
  21. pushw %gs
  22. pushfl
  23. pushal
  24. /* Set up our segment registers */
  25. movw %cs:rm_ds, %ax
  26. movw %ax, %ds
  27. /* Check that we have an UNDI entry point */
  28. cmpw $0, undinet_entry_point
  29. je chain
  30. /* Issue UNDI API call */
  31. movw %ax, %es
  32. movw $undinet_params, %di
  33. movw $PXENV_UNDI_ISR, %bx
  34. movw $PXENV_UNDI_ISR_IN_START, funcflag
  35. pushw %es
  36. pushw %di
  37. pushw %bx
  38. lcall *undinet_entry_point
  39. cli /* Just in case */
  40. addw $6, %sp
  41. cmpw $PXENV_UNDI_ISR_OUT_OURS, funcflag
  42. jne eoi
  43. trig: /* Record interrupt occurence */
  44. incb undiisr_trigger_count
  45. eoi: /* Send EOI */
  46. movb $ICR_EOI_NON_SPECIFIC, %al
  47. cmpb $IRQ_PIC_CUTOFF, undiisr_irq
  48. jb 1f
  49. outb %al, $PIC2_ICR
  50. 1: outb %al, $PIC1_ICR
  51. jmp exit
  52. chain: /* Chain to next handler */
  53. pushfw
  54. lcall *undiisr_next_handler
  55. exit: /* Restore registers and return */
  56. popal
  57. popfl
  58. popw %gs
  59. popw %fs
  60. popw %es
  61. popw %ds
  62. iret
  63. .section ".data16"
  64. undinet_params:
  65. status: .word 0
  66. funcflag: .word 0
  67. bufferlength: .word 0
  68. framelength: .word 0
  69. frameheaderlength: .word 0
  70. frame: .word 0, 0
  71. prottype: .byte 0
  72. pkttype: .byte 0