apu_boot.S 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //#pragma GCC optimize("O0")
  2. #include "../common/asm.h"
  3. .align 0x1000 // 按照4k对齐
  4. .section .text
  5. .code16
  6. ENTRY(_apu_boot_start)
  7. _apu_boot_base = .
  8. cli
  9. wbinvd // 将处理器缓存同步到内存中
  10. mov %cs, %ax
  11. mov %ax, %ds
  12. mov %ax, %es
  13. mov %ax, %ss
  14. mov %ax, %fs
  15. mov %ax, %gs
  16. // 设置栈指针
  17. movl $(_apu_boot_tmp_stack_end - _apu_boot_base), %esp
  18. // 计算ap处理器引导程序的基地址
  19. mov %cs, %ax
  20. movzx %ax, %esi
  21. shll $4, %esi
  22. // set gdt and 32bit/64bit code addr
  23. leal (_apu_code32 - _apu_boot_base)(%esi), %eax
  24. movl %eax, (_apu_code32_vector - _apu_boot_base)
  25. leal (_apu_code64 - _apu_boot_base)(%esi), %eax
  26. movl %eax, (_apu_code64_vector - _apu_boot_base)
  27. leal (_apu_tmp_gdt - _apu_boot_base)(%esi), %eax
  28. movl %eax, (_apu_tmp_gdt + 2 - _apu_boot_base)
  29. // 从实模式切换到保护模式
  30. lidtl _apu_tmp_idt - _apu_boot_base
  31. lgdtl _apu_tmp_gdt - _apu_boot_base
  32. // 操作cr0控制器,使能保护模式
  33. smsw %ax
  34. bts $0, %ax
  35. lmsw %ax
  36. // 转到保护模式
  37. ljmpl *(_apu_code32_vector - _apu_boot_base)
  38. .code32
  39. .align 0x1000
  40. _apu_code32:
  41. # 转到长模式
  42. mov $0x10, %ax
  43. mov %ax, %ds
  44. mov %ax, %es
  45. mov %ax, %ss
  46. mov %ax, %fs
  47. mov %ax, %gs
  48. // 设置栈指针
  49. leal (_apu_boot_tmp_stack_end - _apu_boot_base)(%esi), %eax
  50. movl %eax, %esp
  51. // 1. 允许 PAE
  52. mov %cr4, %eax
  53. or $(1<<5), %eax
  54. mov %eax, %cr4
  55. movl $enter_head_from_ap_boot, %eax
  56. jmpl *%eax
  57. hlt
  58. .code64
  59. .align 0x1000
  60. _apu_code64:
  61. hlt
  62. .align 0x1000
  63. _apu_tmp_idt:
  64. .word 0
  65. .word 0,0
  66. .align 0x1000
  67. _apu_tmp_gdt:
  68. .short _apu_tmp_gdt_end - _apu_tmp_gdt -1
  69. .long _apu_tmp_gdt - _apu_boot_base
  70. .short 0
  71. .quad 0x00cf9a000000ffff
  72. .quad 0x00cf92000000ffff
  73. .quad 0x0020980000000000
  74. .quad 0x0000920000000000
  75. _apu_tmp_gdt_end:
  76. .align 0x1000
  77. _apu_code32_vector:
  78. .long _apu_code32 - _apu_boot_base
  79. .word 0x08,0
  80. .align 0x1000
  81. _apu_code64_vector:
  82. .long _apu_code64 - _apu_boot_base
  83. .word 0x18,0
  84. .align 0x1000
  85. _apu_boot_tmp_stack_start:
  86. // .org 0x400
  87. _apu_boot_tmp_stack_end:
  88. ENTRY(_apu_boot_end)