numa_linux_amd64.s 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright © 2021 Jeffrey H. Johnson <trnsz@pobox.com>
  2. // Copyright © 2017-2020 The Go Authors.
  3. #include "textflag.h"
  4. // long vdsoGetCPU(unsigned *, unsigned *, void *)
  5. //
  6. // func getcpu() {
  7. // vdsoGetCPU(&cpu, &node, NULL)
  8. // }
  9. TEXT ·getcpu(SB), NOSPLIT|NEEDCTXT, $0-0 // this function is running g0 stack, we can overflow safety.
  10. // We don't know how much stack space the VDSO code will need.
  11. // In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n
  12. // and hardening can use a full page of stack space in gettime_sym
  13. // due to stack probes inserted to avoid stack/heap collisions.
  14. // https://github.com/golang/go/issues/20427#issuecomment-343255844
  15. MOVQ SP, BP // Save old SP; BP unchanged by C code.
  16. MOVQ 8(DX), DI // &cpu
  17. MOVQ 16(DX), SI // &node
  18. MOVQ $0, DX // tcache = NULL
  19. SUBQ $16, SP //
  20. ANDQ $~15, SP // Align for C code
  21. MOVQ ·vdsoGetCPU(SB), AX
  22. CALL AX
  23. MOVQ BP, SP // Restore real SP
  24. RET
  25. TEXT ·GetCPUAndNode(SB),NOSPLIT,$32-16
  26. // check support for Fastway
  27. CMPB ·NUMAfastway(SB), $0
  28. JE no_fastway
  29. // RDTSCP go1.11 support RDTSCP opcode but go1.10 not
  30. BYTE $0x0F; BYTE $0x01; BYTE $0xF9
  31. MOVL CX, AX
  32. SHRL $12, AX
  33. ANDL $4095, CX
  34. MOVQ CX, cpu+0(FP)
  35. MOVQ AX, node+8(FP)
  36. RET
  37. no_fastway:
  38. MOVQ $0, cpu+0(FP)
  39. MOVQ $0, node+8(FP)
  40. LEAQ ·getcpu(SB), AX
  41. MOVQ AX, fn-24(SP)
  42. LEAQ cpu+0(FP), AX
  43. MOVQ AX, cpu-16(SP)
  44. LEAQ node+8(FP), AX
  45. MOVQ AX, node-8(SP)
  46. LEAQ fn-24(SP), AX
  47. MOVQ AX, zone-32(SP)
  48. CALL runtime·systemstack(SB)
  49. RET