⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 realmode_switch.s

📁 嵌入式试验箱S3C2410的bootloader源代码
💻 S
字号:
/* * (C) Copyright 2002 * Daniel Engstr鰉, Omicron Ceti AB, daniel@omicron.se * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA *//* 32bit -> 16bit -> 32bit mode switch code *//* * Stack frame at 0xe00 *      e00 ebx; *	e04 ecx; *	e08 edx; *	e0c esi; *	e10 edi; *	e14 ebp; *	e18 eax; *	e1c ds; *	e20 es; *	e24 fs; *	e28 gs; *	e2c orig_eax; *	e30 eip; *	e34 cs; *	e38 eflags; *	e3c esp; *	e40 ss; */#define a32		.byte 0x67;		/* address size prefix 32 */#define o32		.byte 0x66;		/* operand size prefix 32 */.section .realmode, "ax".code16						/* 16bit protected mode code here */.globl realmode_enterrealmode_enter:o32	pushao32	pushf	cli	sidt   	saved_idt	sgdt    saved_gdt	movl    %esp, %eax	movl    %eax, saved_protected_mode_esp	movl	$0x10, %eax	movl    %eax, %esp	movw	$0x28, %ax	movw	%ax, %ds	movw	%ax, %es	movw	%ax, %fs	movw	%ax, %gs	lidt	realmode_idt_ptr	movl	%cr0, %eax                	/* Go back into real mode by */	andl	$0x7ffffffe, %eax         	/* clearing PE to 0 */	movl	%eax, %cr0	ljmp	$0x0,$do_realmode             	/* switch to real mode */do_realmode:					/* realmode code from here */	movw	%cs,%ax	movw	%ax,%ds	movw	%ax,%es	movw	%ax,%fs	movw	%ax,%gs						/* create a temporary stack */	movw	$0xc0, %ax	movw	%ax, %ss	movw	$0x200, %ax	movw	%ax, %sp	popl	%ebx	popl	%ecx	popl	%edx	popl	%esi	popl	%edi	popl	%ebp	popl	%eax	movl	%eax, temp_eax	popl	%eax	movw	%ax, %ds	popl	%eax	movw	%ax, %es	popl	%eax	movw	%ax, %fs	popl	%eax	movw	%ax, %gs	popl	%eax				/* orig_eax */	popl	%eaxcs	movw	%ax, temp_ip	popl	%eaxcs	movw	%ax, temp_cso32	popf	popl	%eax	popw	%ss	movl	%eax, %espcs	movl	temp_eax, %eax	wbinvd                                  /* self-modifying code,						 * better flush the cache */	.byte	0x9a				/* lcall */temp_ip:	.word	0	     			/* new ip */temp_cs:	.word   0				/* new cs */realmode_ret:						/* save eax, esp and ss */cs	movl	%eax, saved_eax	movl	%esp, %eaxcs	movl	%eax, saved_esp	movw    %ss, %axcs	movw	%ax, saved_ss	/* restore the stack, note that we set sp to 0x244;	 * pt_regs is 0x44 bytes long and we push the structure	 * backwards on to the stack, bottom first */	movw	$0xc0, %ax	movw	%ax, %ss	movw	$0x244, %ax	movw	%ax, %sp	xorl	%eax,%eaxcs	movw	saved_ss, %ax	pushl	%eaxcs	movl	saved_esp, %eax	pushl	%eaxo32	pushf	xorl	%eax,%eaxcs	movw	temp_cs, %ax	pushl	%eaxcs	movw	temp_ip, %ax	pushl	%eax	pushl	$0	movw	%gs, %ax	pushl	%eax	movw	%fs, %ax	pushl	%eax	movw	%es, %ax	pushl	%eax	movw	%ds, %ax	pushl	%eax	movl	saved_eax, %eax	pushl	%eax	pushl	%ebp	pushl	%edi	pushl	%esi	pushl	%edx	pushl	%ecx	pushl	%ebxo32 cs	lidt	saved_idto32 cs	lgdt    saved_gdt			/* Set GDTR */	movl    %cr0, %eax              	/* Go back into protected mode */	orl     $1,%eax                 	/* reset PE to 1 */	movl    %eax, %cr0	jmp     next_line               	/* flush prefetch queue */next_line:	movw	$return_ptr, %ax	movw    %ax,%bpo32 cs	ljmp	*(%bp).code32protected_mode:	movl    $0x18,%eax         		/* reload GDT[3] */	movw    %ax,%fs                 	/* reset FS */	movw	%ax,%ds                		/* reset DS */	movw    %ax,%gs                 	/* reset GS */	movw    %ax,%es                 	/* reset ES */	movw    %ax,%ss                 	/* reset SS */	movl    saved_protected_mode_esp, %eax	movl	%eax, %esp	popf	popa	rettemp_eax:	.long	0saved_ss:	.word   0saved_esp:	.long	0saved_eax:	.long	0realmode_idt_ptr:	.word	0x400	.word	0x0, 0x0saved_gdt:	.word 	0, 0, 0, 0saved_idt:	.word 	0, 0, 0, 0saved_protected_mode_esp:	.long 	0return_ptr:	.long	protected_mode	.word	0x10

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -