paravirt_patchlist.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /******************************************************************************
  2. * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
  3. * VA Linux Systems Japan K.K.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. *
  19. */
  20. #include <linux/bug.h>
  21. #include <linux/init.h>
  22. #include <linux/kernel.h>
  23. #include <asm/paravirt.h>
  24. #define DECLARE(name) \
  25. extern unsigned long \
  26. __ia64_native_start_gate_##name##_patchlist[]; \
  27. extern unsigned long \
  28. __ia64_native_end_gate_##name##_patchlist[]
  29. DECLARE(fsyscall);
  30. DECLARE(brl_fsys_bubble_down);
  31. DECLARE(vtop);
  32. DECLARE(mckinley_e9);
  33. extern unsigned long __start_gate_section[];
  34. #define ASSIGN(name) \
  35. .start_##name##_patchlist = \
  36. (unsigned long)__ia64_native_start_gate_##name##_patchlist, \
  37. .end_##name##_patchlist = \
  38. (unsigned long)__ia64_native_end_gate_##name##_patchlist
  39. struct pv_patchdata pv_patchdata __initdata = {
  40. ASSIGN(fsyscall),
  41. ASSIGN(brl_fsys_bubble_down),
  42. ASSIGN(vtop),
  43. ASSIGN(mckinley_e9),
  44. .gate_section = (void*)__start_gate_section,
  45. };
  46. unsigned long __init
  47. paravirt_get_gate_patchlist(enum pv_gate_patchlist type)
  48. {
  49. #define CASE(NAME, name) \
  50. case PV_GATE_START_##NAME: \
  51. return pv_patchdata.start_##name##_patchlist; \
  52. case PV_GATE_END_##NAME: \
  53. return pv_patchdata.end_##name##_patchlist; \
  54. switch (type) {
  55. CASE(FSYSCALL, fsyscall);
  56. CASE(BRL_FSYS_BUBBLE_DOWN, brl_fsys_bubble_down);
  57. CASE(VTOP, vtop);
  58. CASE(MCKINLEY_E9, mckinley_e9);
  59. default:
  60. BUG();
  61. break;
  62. }
  63. return 0;
  64. }
  65. void * __init
  66. paravirt_get_gate_section(void)
  67. {
  68. return pv_patchdata.gate_section;
  69. }