cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

trampoline_32.S (1919B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 *
      4 *	Trampoline.S	Derived from Setup.S by Linus Torvalds
      5 *
      6 *	4 Jan 1997 Michael Chastain: changed to gnu as.
      7 *
      8 *	This is only used for booting secondary CPUs in SMP machine
      9 *
     10 *	Entry: CS:IP point to the start of our code, we are
     11 *	in real mode with no stack, but the rest of the
     12 *	trampoline page to make our stack and everything else
     13 *	is a mystery.
     14 *
     15 *	We jump into arch/x86/kernel/head_32.S.
     16 *
     17 *	On entry to trampoline_start, the processor is in real mode
     18 *	with 16-bit addressing and 16-bit data.  CS has some value
     19 *	and IP is zero.  Thus, we load CS to the physical segment
     20 *	of the real mode code before doing anything further.
     21 */
     22
     23#include <linux/linkage.h>
     24#include <asm/segment.h>
     25#include <asm/page_types.h>
     26#include "realmode.h"
     27
     28	.text
     29	.code16
     30
     31	.balign	PAGE_SIZE
     32SYM_CODE_START(trampoline_start)
     33	wbinvd			# Needed for NUMA-Q should be harmless for others
     34
     35	LJMPW_RM(1f)
     361:
     37	mov	%cs, %ax	# Code and data in the same place
     38	mov	%ax, %ds
     39
     40	cli			# We should be safe anyway
     41
     42	movl	tr_start, %eax	# where we need to go
     43
     44	/*
     45	 * GDT tables in non default location kernel can be beyond 16MB and
     46	 * lgdt will not be able to load the address as in real mode default
     47	 * operand size is 16bit. Use lgdtl instead to force operand size
     48	 * to 32 bit.
     49	 */
     50	lidtl	tr_idt			# load idt with 0, 0
     51	lgdtl	tr_gdt			# load gdt with whatever is appropriate
     52
     53	movw	$1, %dx			# protected mode (PE) bit
     54	lmsw	%dx			# into protected mode
     55
     56	ljmpl	$__BOOT_CS, $pa_startup_32
     57SYM_CODE_END(trampoline_start)
     58
     59	.section ".text32","ax"
     60	.code32
     61SYM_CODE_START(startup_32)			# note: also used from wakeup_asm.S
     62	jmp	*%eax
     63SYM_CODE_END(startup_32)
     64
     65	.bss
     66	.balign 8
     67SYM_DATA_START(trampoline_header)
     68	SYM_DATA_LOCAL(tr_start,	.space 4)
     69	SYM_DATA_LOCAL(tr_gdt_pad,	.space 2)
     70	SYM_DATA_LOCAL(tr_gdt,		.space 6)
     71SYM_DATA_END(trampoline_header)
     72	
     73#include "trampoline_common.S"