Blame view

kernel/linux-imx6_3.14.28/arch/x86/xen/xen-head.S 3.89 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
  /* Xen-specific pieces of head.S, intended to be included in the right
  	place in head.S */
  
  #ifdef CONFIG_XEN
  
  #include <linux/elfnote.h>
  #include <linux/init.h>
  
  #include <asm/boot.h>
  #include <asm/asm.h>
  #include <asm/page_types.h>
  
  #include <xen/interface/elfnote.h>
  #include <xen/interface/features.h>
  #include <asm/xen/interface.h>
  
  #ifdef CONFIG_XEN_PVH
  #define PVH_FEATURES_STR  "|writable_descriptor_tables|auto_translated_physmap|supervisor_mode_kernel"
  /* Note the lack of 'hvm_callback_vector'. Older hypervisor will
   * balk at this being part of XEN_ELFNOTE_FEATURES, so we put it in
   * XEN_ELFNOTE_SUPPORTED_FEATURES which older hypervisors will ignore.
   */
  #define PVH_FEATURES ((1 << XENFEAT_writable_page_tables) | \
  		      (1 << XENFEAT_auto_translated_physmap) | \
  		      (1 << XENFEAT_supervisor_mode_kernel) | \
  		      (1 << XENFEAT_hvm_callback_vector))
  /* The XENFEAT_writable_page_tables is not stricly neccessary as we set that
   * up regardless whether this CONFIG option is enabled or not, but it
   * clarifies what the right flags need to be.
   */
  #else
  #define PVH_FEATURES_STR  ""
  #define PVH_FEATURES (0)
  #endif
  
  	__INIT
  ENTRY(startup_xen)
  	cld
  #ifdef CONFIG_X86_32
  	mov %esi,xen_start_info
  	mov $init_thread_union+THREAD_SIZE,%esp
  #else
  	mov %rsi,xen_start_info
  	mov $init_thread_union+THREAD_SIZE,%rsp
  #endif
  	jmp xen_start_kernel
  
  	__FINIT
  
  .pushsection .text
  	.balign PAGE_SIZE
  ENTRY(hypercall_page)
  #define NEXT_HYPERCALL(x) \
  	ENTRY(xen_hypercall_##x) \
  	.skip 32
  
  NEXT_HYPERCALL(set_trap_table)
  NEXT_HYPERCALL(mmu_update)
  NEXT_HYPERCALL(set_gdt)
  NEXT_HYPERCALL(stack_switch)
  NEXT_HYPERCALL(set_callbacks)
  NEXT_HYPERCALL(fpu_taskswitch)
  NEXT_HYPERCALL(sched_op_compat)
  NEXT_HYPERCALL(platform_op)
  NEXT_HYPERCALL(set_debugreg)
  NEXT_HYPERCALL(get_debugreg)
  NEXT_HYPERCALL(update_descriptor)
  NEXT_HYPERCALL(ni)
  NEXT_HYPERCALL(memory_op)
  NEXT_HYPERCALL(multicall)
  NEXT_HYPERCALL(update_va_mapping)
  NEXT_HYPERCALL(set_timer_op)
  NEXT_HYPERCALL(event_channel_op_compat)
  NEXT_HYPERCALL(xen_version)
  NEXT_HYPERCALL(console_io)
  NEXT_HYPERCALL(physdev_op_compat)
  NEXT_HYPERCALL(grant_table_op)
  NEXT_HYPERCALL(vm_assist)
  NEXT_HYPERCALL(update_va_mapping_otherdomain)
  NEXT_HYPERCALL(iret)
  NEXT_HYPERCALL(vcpu_op)
  NEXT_HYPERCALL(set_segment_base)
  NEXT_HYPERCALL(mmuext_op)
  NEXT_HYPERCALL(xsm_op)
  NEXT_HYPERCALL(nmi_op)
  NEXT_HYPERCALL(sched_op)
  NEXT_HYPERCALL(callback_op)
  NEXT_HYPERCALL(xenoprof_op)
  NEXT_HYPERCALL(event_channel_op)
  NEXT_HYPERCALL(physdev_op)
  NEXT_HYPERCALL(hvm_op)
  NEXT_HYPERCALL(sysctl)
  NEXT_HYPERCALL(domctl)
  NEXT_HYPERCALL(kexec_op)
  NEXT_HYPERCALL(tmem_op) /* 38 */
  ENTRY(xen_hypercall_rsvr)
  	.skip 320
  NEXT_HYPERCALL(mca) /* 48 */
  NEXT_HYPERCALL(arch_1)
  NEXT_HYPERCALL(arch_2)
  NEXT_HYPERCALL(arch_3)
  NEXT_HYPERCALL(arch_4)
  NEXT_HYPERCALL(arch_5)
  NEXT_HYPERCALL(arch_6)
  	.balign PAGE_SIZE
  .popsection
  
  	ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz "linux")
  	ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz "2.6")
  	ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz "xen-3.0")
  #ifdef CONFIG_X86_32
  	ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      _ASM_PTR __PAGE_OFFSET)
  #else
  	ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      _ASM_PTR __START_KERNEL_map)
  #endif
  	ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          _ASM_PTR startup_xen)
  	ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, _ASM_PTR hypercall_page)
  	ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .ascii "!writable_page_tables|pae_pgdir_above_4gb"; .asciz PVH_FEATURES_STR)
  	ELFNOTE(Xen, XEN_ELFNOTE_SUPPORTED_FEATURES, .long (PVH_FEATURES) |
  						(1 << XENFEAT_writable_page_tables) |
  						(1 << XENFEAT_dom0))
  	ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz "yes")
  	ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz "generic")
  	ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,
  		.quad _PAGE_PRESENT; .quad _PAGE_PRESENT)
  	ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1)
  	ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   _ASM_PTR __HYPERVISOR_VIRT_START)
  	ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   _ASM_PTR 0)
  
  #endif /*CONFIG_XEN */