Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. pushal
  23. /* Set up our segment registers */
  24. movw %cs:rm_ds, %ax
  25. movw %ax, %ds
  26. /* Check that we have an UNDI entry point */
  27. cmpw $0, undinet_entry_point
  28. je chain
  29. /* Issue UNDI API call */
  30. movw %ax, %es
  31. movw $undinet_params, %di
  32. movw $PXENV_UNDI_ISR, %bx
  33. movw $PXENV_UNDI_ISR_IN_START, funcflag
  34. pushw %es
  35. pushw %di
  36. pushw %bx
  37. lcall *undinet_entry_point
  38. cli /* Just in case */
  39. addw $6, %sp
  40. cmpw $PXENV_UNDI_ISR_OUT_OURS, funcflag
  41. jne eoi
  42. trig: /* Record interrupt occurence */
  43. incb undiisr_trigger_count
  44. eoi: /* Send EOI */
  45. movb $ICR_EOI_NON_SPECIFIC, %al
  46. cmpb $IRQ_PIC_CUTOFF, undiisr_irq
  47. jb 1f
  48. outb %al, $PIC2_ICR
  49. 1: outb %al, $PIC1_ICR
  50. jmp exit
  51. chain: /* Chain to next handler */
  52. pushfw
  53. lcall *undiisr_next_handler
  54. exit: /* Restore registers and return */
  55. popal
  56. popw %gs
  57. popw %fs
  58. popw %es
  59. popw %ds
  60. iret
  61. .section ".data16"
  62. undinet_params:
  63. status: .word 0
  64. funcflag: .word 0
  65. bufferlength: .word 0
  66. framelength: .word 0
  67. frameheaderlength: .word 0
  68. frame: .word 0, 0
  69. prottype: .byte 0
  70. pkttype: .byte 0