source: trunk/hal/x86_64/core/hal_cpu.S @ 280

Last change on this file since 280 was 236, checked in by max@…, 7 years ago

Launch the secondary CPUs. For now, they all say hello and enter
an infinite loop.

File size: 3.1 KB
Line 
1/*
2 * hal_cpu.S - Miscellaneous CPU functions
3 *
4 * Copyright (c) 2017 Maxime Villard
5 *
6 * This file is part of ALMOS-MKH.
7 *
8 * ALMOS-MKH is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2.0 of the License.
11 *
12 * ALMOS-MKH is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#define x86_ASM
23#include <hal_boot.h>
24#include <hal_segmentation.h>
25#include <hal_register.h>
26
27ASM_ENTRY(lgdt)
28        lgdt    (%rdi)
29        /* Reload the prefetch queue */
30        jmp     1f
31        nop
321:      /* Reload stale selectors */
33        movl    $GDT_FIXED_SEL(GDT_KDATA_SEL, SEL_KPL),%eax
34        movl    %eax,%ds
35        movl    %eax,%es
36        movl    %eax,%ss
37        ret
38
39ASM_ENTRY(lidt)
40        lidt    (%rdi)
41        ret
42
43ASM_ENTRY(ltr)
44        ltr     %di
45        ret
46
47ASM_ENTRY(invlpg)
48        invlpg  (%rdi)
49        ret
50
51ASM_ENTRY(sti)
52        sti
53        ret
54
55ASM_ENTRY(cli)
56        cli
57        ret
58
59ASM_ENTRY(rdtsc)
60        xorq    %rax,%rax
61        rdtsc
62        shlq    $32,%rdx
63        orq     %rdx,%rax
64        ret
65
66ASM_ENTRY(in8)
67        movq    %rdi,%rdx
68        xorq    %rax,%rax
69        inb     %dx,%al
70        ret
71
72ASM_ENTRY(in16)
73        movq    %rdi,%rdx
74        xorq    %rax,%rax
75        inw     %dx,%ax
76        ret
77
78ASM_ENTRY(out8)
79        movq    %rdi,%rdx
80        movq    %rsi,%rax
81        outb    %al,%dx
82        ret
83
84ASM_ENTRY(out16)
85        movq    %rdi,%rdx
86        movq    %rsi,%rax
87        outw    %ax,%dx
88        ret
89
90ASM_ENTRY(rdmsr)
91        movq    %rdi,%rcx
92        xorq    %rax,%rax
93        rdmsr
94        shlq    $32,%rdx
95        orq     %rdx,%rax
96        ret
97
98ASM_ENTRY(wrmsr)
99        movq    %rdi,%rcx
100        movq    %rsi,%rax
101        movq    %rsi,%rdx
102        shrq    $32,%rdx
103        wrmsr
104        ret
105
106ASM_ENTRY(mfence)
107        mfence
108        ret
109
110ASM_ENTRY(rcr0)
111        movq    %cr0,%rax
112        ret
113
114ASM_ENTRY(rcr2)
115        movq    %cr2,%rax
116        ret
117
118ASM_ENTRY(rcr3)
119        movq    %cr3,%rax
120        ret
121
122ASM_ENTRY(rcr4)
123        movq    %cr4,%rax
124        ret
125
126ASM_ENTRY(lcr4)
127        movq    %rdi,%cr4
128        ret
129
130ASM_ENTRY(cpuid)
131        movq    %rbx,%r8
132        movq    %rdi,%rax
133        movq    %rsi,%rcx
134        movq    %rdx,%rsi
135        cpuid
136        movl    %eax,0(%rsi)
137        movl    %ebx,4(%rsi)
138        movl    %ecx,8(%rsi)
139        movl    %edx,12(%rsi)
140        movq    %r8,%rbx
141        ret
142
143/*
144 * To flush all TLB entries, we must re-set the CR4_PGE flag in %cr4.
145 */
146ASM_ENTRY(tlbflushg)
147        movq    %cr4,%rax
148        movq    %rax,%rdx
149        andq    $~CR4_PGE,%rdx
150        movq    %rdx,%cr4
151        movq    %rax,%cr4
152        ret
153
154ASM_ENTRY(tlbflush)
155        movq    %cr3,%rax
156        movq    %rax,%cr3
157        ret
158
159ASM_ENTRY(x86_stop) /* debug only */
160        int     $0x0b
161        ret
162
163ASM_ENTRY(pause)
164        pause
165        ret
166
167ASM_ENTRY(wbinvd)
168        wbinvd
169        ret
170
171/* -------------------------------------------------------------------------- */
172
173ASM_ENTRY(atomic_cas_32)
174        movl    %esi,%eax
175        lock
176        cmpxchgl %edx,(%rdi)
177        /* %eax now contains the old value */
178        ret
179
180ASM_ENTRY(atomic_add_32)
181        movl    %esi,%eax
182        lock
183        xaddl   %eax,(%rdi)
184        /* %eax now contains the old value */
185        ret
186
187ASM_ENTRY(atomic_and_32)
188        movl    (%rdi),%eax
1891:
190        movl    %eax,%ecx
191        andl    %esi,%ecx
192        lock
193        cmpxchgl %ecx,(%rdi)
194        jnz     1b
195        /* %eax now contains the old value */
196        ret
197
198ASM_ENTRY(atomic_or_32)
199        movl    (%rdi),%eax
2001:
201        movl    %eax,%ecx
202        orl     %esi,%ecx
203        lock
204        cmpxchgl %ecx,(%rdi)
205        jnz     1b
206        /* %eax now contains the old value */
207        ret
208
Note: See TracBrowser for help on using the repository browser.