#ifndef PROCESS_LEADER_H #define PROCESS_LEADER_H #include "quantum.h" bool process_leader(uint16_t keycode, keyrecord_t *record); void leader_start(void); void leader_end(void); #ifndef LEADER_TIMEOUT #define LEADER_TIMEOUT 200 #endif #define SEQ_ONE_KEY(key) if (leader_sequence[0] == (key) && leader_sequence[1] == 0 && leader_sequence[2] == 0 && leader_sequence[3] == 0 && leader_sequence[4] == 0) #define SEQ_TWO_KEYS(key1, key2) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == 0 && leader_sequence[3] == 0 && leader_sequence[4] == 0) #define SEQ_THREE_KEYS(key1, key2, key3) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == (key3) && leader_sequence[3] == 0 && leader_sequence[4] == 0) #define SEQ_FOUR_KEYS(key1, key2, key3, key4) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == (key3) && leader_sequence[3] == (key4) && leader_sequence[4] == 0) #define SEQ_FIVE_KEYS(key1, key2, key3, key4, key5) if (leader_sequence[0] == (key1) && leader_sequence[1] == (key2) && leader_sequence[2] == (key3) && leader_sequence[3] == (key4) && leader_sequence[4] == (key5)) #define LEADER_EXTERNS() extern bool leading; extern uint16_t leader_time; extern uint16_t leader_sequence[5]; extern uint8_t leader_sequence_size #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT) #endifss='sub right'>James
aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/trampoline.S
blob: 44baea0bbbd4b6b1cba689c8e77d4f2aed0965be (plain)
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
/*
 *
 *	Trampoline.S	Derived from Setup.S by Linus Torvalds
 *
 *	4 Jan 1997 Michael Chastain: changed to gnu as.
 *
 *	Entry: CS:IP point to the start of our code, we are 
 *	in real mode with no stack, but the rest of the 
 *	trampoline page to make our stack and everything else
 *	is a mystery.
 *
 *	On entry to trampoline_data, the processor is in real mode
 *	with 16-bit addressing and 16-bit data.  CS has some value
 *	and IP is zero.  Thus, data addresses need to be absolute
 *	(no relocation) and are taken with regard to r_base.
 */

#include <xen/config.h>
#include <public/xen.h>
#include <asm/desc.h>
#include <asm/page.h>

#ifdef CONFIG_SMP
        
.data

.code16

ENTRY(trampoline_data)
r_base = .
        mov	%cs, %ax	# Code and data in the same place
	mov	%ax, %ds

	movl	$0xA5A5A5A5, %ebx # Flag an SMP trampoline
	cli			# We should be safe anyway

	movl	$0xA5A5A5A5, trampoline_data - r_base

	lidt	idt_48 - r_base	# load idt with 0, 0
	lgdt	gdt_48 - r_base	# load gdt with whatever is appropriate

	xor	%ax, %ax
	inc	%ax		# protected mode (PE) bit
	lmsw	%ax		# into protected mode
	jmp	flush_instr
flush_instr:
#if defined(__x86_64__)
	ljmpl	$__HYPERVISOR_CS32, $0x100000 # 1MB
#else        
	ljmpl	$__HYPERVISOR_CS,   $0x100000 # 1MB
#endif

idt_48:
	.word	0			# idt limit = 0
	.word	0, 0			# idt base = 0L

gdt_48:
	.word	LAST_RESERVED_GDT_BYTE
#ifdef __i386__
	.long	gdt_table - FIRST_RESERVED_GDT_BYTE - __PAGE_OFFSET
#else
	.long   0x101000 - FIRST_RESERVED_GDT_BYTE
#endif

ENTRY(trampoline_end)

#endif /* CONFIG_SMP */