usr/src/uts/i86pc/ml/cpr_wakecode.s
author Joseph A Townsend <Joseph.Townsend@Sun.COM>
Mon, 29 Jun 2009 11:35:21 -0700
changeset 9989 33d24b36e077
parent 7362 0b07b96ed3bd
child 12838 fca99d9e3f2f
permissions -rw-r--r--
6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     1
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     2
 * CDDL HEADER START
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     3
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     7
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    11
 * and limitations under the License.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    12
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    18
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    19
 * CDDL HEADER END
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    20
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    21
/*
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    23
 * Use is subject to license terms.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    24
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    25
	
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    26
#include <sys/asm_linkage.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    27
#include <sys/asm_misc.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    28
#include <sys/regset.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    29
#include <sys/privregs.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    30
#include <sys/x86_archext.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    31
#include <sys/cpr_wakecode.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    32
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    33
#if !defined(__lint)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    34
#include <sys/segments.h>
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    35
#include "assym.h"
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    36
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    37
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    38
#ifdef  DEBUG
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    39
#define LED     1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    40
#define SERIAL  1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    41
#endif	/*	DEBUG	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    42
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    43
#ifdef	DEBUG
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    44
#define	COM1	0x3f8
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    45
#define	COM2	0x2f8
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    46
#define	WC_COM	COM2	/* either COM1 or COM2			*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    47
#define	WC_LED	0x80    /* diagnostic led port ON motherboard	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    48
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    49
/*
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    50
 * defined as offsets from the data register
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    51
 */
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    52
#define	DLL	0	/* divisor latch (lsb) */
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    53
#define	DLH	1	/* divisor latch (msb) */
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    54
#define	LCR	3	/* line control register		*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    55
#define	MCR	4	/* modem control register		*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    56
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    57
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    58
#define	DLAB	0x80    /* divisor latch access bit		*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    59
#define	B9600L	0X0c	/* lsb bit pattern for 9600 baud	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    60
#define	B9600H	0X0	/* hsb bit pattern for 9600 baud	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    61
#define	DTR	0x01    /* Data Terminal Ready			*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    62
#define	RTS	0x02    /* Request To Send			*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    63
#define	STOP1	0x00	/* 1 stop bit				*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    64
#define	BITS8	0x03    /* 8 bits per char			*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    65
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    66
#endif	/*	DEBUG	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
    67
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    68
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    69
 *	This file contains the low level routines involved in getting
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    70
 *	into and out of ACPI S3, including those needed for restarting
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    71
 *	the non-boot cpus.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    72
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    73
 *	Our assumptions:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    74
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    75
 *	Our actions:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    76
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    77
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    78
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    79
#if defined(lint) || defined(__lint)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    80
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    81
/*ARGSUSED*/
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    82
int
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    83
wc_save_context(wc_cpu_t *pcpu)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    84
{ return 0; }
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    85
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    86
#else	/* lint */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    87
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    88
#if defined(__GNU_AS__)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    89
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    90
	NOTHING AT ALL YET!
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    91
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    92
#else	/* !defined(__GNU_AS__) */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    93
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    94
#if defined(__amd64)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    95
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    96
	ENTRY_NP(wc_save_context)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    97
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    98
	movq	(%rsp), %rdx		/ return address
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
    99
	movq	%rdx, WC_RETADDR(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   100
	pushq	%rbp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   101
	movq	%rsp,%rbp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   102
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   103
	movq    %rdi, WC_VIRTADDR(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   104
	movq    %rdi, WC_RDI(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   105
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   106
	movq    %rdx, WC_RDX(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   107
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   108
/ stash everything else we need
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   109
	sgdt	WC_GDT(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   110
	sidt	WC_IDT(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   111
	sldt	WC_LDT(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   112
	str	WC_TR(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   113
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   114
	movq	%cr0, %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   115
	movq	%rdx, WC_CR0(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   116
	movq	%cr3, %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   117
	movq	%rdx, WC_CR3(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   118
	movq	%cr4, %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   119
	movq	%rdx, WC_CR4(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   120
	movq	%cr8, %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   121
	movq	%rdx, WC_CR8(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   122
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   123
	movq    %r8, WC_R8(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   124
	movq    %r9, WC_R9(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   125
	movq    %r10, WC_R10(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   126
	movq    %r11, WC_R11(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   127
	movq    %r12, WC_R12(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   128
	movq    %r13, WC_R13(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   129
	movq    %r14, WC_R14(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   130
	movq    %r15, WC_R15(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   131
	movq    %rax, WC_RAX(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   132
	movq    %rbp, WC_RBP(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   133
	movq    %rbx, WC_RBX(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   134
	movq    %rcx, WC_RCX(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   135
	movq    %rsi, WC_RSI(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   136
	movq    %rsp, WC_RSP(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   137
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   138
	movw	%ss, WC_SS(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   139
	movw	%cs, WC_CS(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   140
	movw	%ds, WC_DS(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   141
	movw	%es, WC_ES(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   142
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   143
	movq	$0, %rcx		/ save %fs register
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   144
	movw    %fs, %cx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   145
	movq    %rcx, WC_FS(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   146
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   147
	movl    $MSR_AMD_FSBASE, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   148
	rdmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   149
	movl    %eax, WC_FSBASE(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   150
	movl    %edx, WC_FSBASE+4(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   151
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   152
	movq	$0, %rcx		/ save %gs register
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   153
	movw    %gs, %cx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   154
	movq    %rcx, WC_GS(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   155
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   156
	movl    $MSR_AMD_GSBASE, %ecx	/ save gsbase msr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   157
	rdmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   158
	movl    %eax, WC_GSBASE(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   159
	movl    %edx, WC_GSBASE+4(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   160
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   161
	movl    $MSR_AMD_KGSBASE, %ecx	/ save kgsbase msr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   162
	rdmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   163
	movl    %eax, WC_KGSBASE(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   164
	movl    %edx, WC_KGSBASE+4(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   165
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   166
	movq	%gs:CPU_ID, %rax	/ save current cpu id
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   167
	movq	%rax, WC_CPU_ID(%rdi)
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   168
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   169
	pushfq
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   170
	popq	WC_EFLAGS(%rdi)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   171
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   172
	wbinvd				/ flush the cache
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   173
	mfence
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   174
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   175
	movq	$1, %rax		/ at suspend return 1
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   176
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   177
	leave
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   178
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   179
	ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   180
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   181
	SET_SIZE(wc_save_context)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   182
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   183
#elif defined(__i386)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   184
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   185
	ENTRY_NP(wc_save_context)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   186
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   187
	movl	4(%esp), %eax		/ wc_cpu_t *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   188
	movl	%eax, WC_VIRTADDR(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   189
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   190
	movl	(%esp), %edx		/ return address
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   191
	movl	%edx, WC_RETADDR(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   192
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   193
	str	WC_TR(%eax)		/ stash everything else we need
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   194
	sgdt	WC_GDT(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   195
	sldt	WC_LDT(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   196
	sidt	WC_IDT(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   197
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   198
	movl	%cr0, %edx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   199
	movl	%edx, WC_CR0(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   200
	movl	%cr3, %edx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   201
	movl	%edx, WC_CR3(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   202
	movl	%cr4, %edx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   203
	movl	%edx, WC_CR4(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   204
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   205
	movl	%ebx, WC_EBX(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   206
	movl	%edi, WC_EDI(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   207
	movl	%esi, WC_ESI(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   208
	movl	%ebp, WC_EBP(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   209
	movl	%esp, WC_ESP(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   210
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   211
	movw	%ss, WC_SS(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   212
	movw	%cs, WC_CS(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   213
	movw	%ds, WC_DS(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   214
	movw	%es, WC_ES(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   215
	movw	%fs, WC_FS(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   216
	movw	%gs, WC_GS(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   217
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   218
	pushfl
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   219
	popl	WC_EFLAGS(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   220
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   221
	pushl	%gs:CPU_ID		/ save current cpu id
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   222
	popl	WC_CPU_ID(%eax)
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   223
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   224
	wbinvd				/ flush the cache
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   225
	mfence
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   226
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   227
	movl	$1, %eax		/ at suspend return 1
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   228
	ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   229
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   230
	SET_SIZE(wc_save_context)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   231
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   232
#endif	/* __amd64 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   233
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   234
#endif	/* __GNU_AS__ */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   235
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   236
#endif /* lint */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   237
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   238
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   239
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   240
 *	Our assumptions:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   241
 *		- We are running in real mode.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   242
 *		- Interrupts are disabled.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   243
 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   244
 *	Our actions:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   245
 *		- We start using our GDT by loading correct values in the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   246
 *		  selector registers (cs=KCS_SEL, ds=es=ss=KDS_SEL, fs=KFS_SEL,
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   247
 *		  gs=KGS_SEL).
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   248
 *		- We change over to using our IDT.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   249
 *		- We load the default LDT into the hardware LDT register.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   250
 *		- We load the default TSS into the hardware task register.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   251
 *		- We restore registers
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   252
 *		- We return to original caller (a la setjmp)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   253
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   254
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   255
#if defined(lint) || defined(__lint)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   256
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   257
void
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   258
wc_rm_start(void)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   259
{}
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   260
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   261
void
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   262
wc_rm_end(void)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   263
{}
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   264
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   265
#else	/* lint */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   266
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   267
#if defined(__GNU_AS__)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   268
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   269
	NOTHING AT ALL YET!
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   270
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   271
#else	/* __GNU_AS__ */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   272
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   273
#if defined(__amd64)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   274
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   275
	ENTRY_NP(wc_rm_start)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   276
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   277
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   278
	 * For vulcan as we need to do a .code32 and mentally invert the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   279
	 * meaning of the addr16 and data16 prefixes to get 32-bit access when
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   280
	 * generating code to be executed in 16-bit mode (sigh...)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   281
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   282
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   283
	.code32
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   284
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   285
	cli
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   286
	movw		%cs, %ax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   287
	movw		%ax, %ds		/ establish ds ...
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   288
	movw		%ax, %ss		/ ... and ss:esp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   289
	D16 movl	$WC_STKSTART, %esp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   290
/ using the following value blows up machines! - DO NOT USE
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   291
/	D16 movl	0xffc, %esp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   292
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   293
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   294
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   295
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   296
	D16 movb        $0xd1, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   297
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   298
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   299
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   300
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   301
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   302
	D16 movb        $0x61, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   303
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   304
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   305
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   306
	D16 call	cominit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   307
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   308
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   309
	 * Enable protected-mode, write protect, and alignment mask
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   310
	 * %cr0 has already been initialsed to zero
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   311
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   312
	movl		%cr0, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   313
	D16 orl		$[CR0_PE|CR0_WP|CR0_AM], %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   314
	movl		%eax, %cr0
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   315
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   316
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   317
	 * Do a jmp immediately after writing to cr0 when enabling protected
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   318
	 * mode to clear the real mode prefetch queue (per Intel's docs)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   319
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   320
	jmp		pestart
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   321
pestart:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   322
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   323
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   324
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   325
	D16 movb        $0xd2, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   326
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   327
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   328
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   329
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   330
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   331
	D16 movb        $0x62, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   332
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   333
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   334
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   335
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   336
	 * 16-bit protected mode is now active, so prepare to turn on long
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   337
	 * mode
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   338
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   339
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   340
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   341
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   342
	D16 movb        $0xd3, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   343
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   344
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   345
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   346
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   347
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   348
	D16 movb        $0x63, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   349
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   350
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   351
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   352
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   353
 	 * Add any initial cr4 bits
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   354
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   355
	movl		%cr4, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   356
	A16 D16 orl	CR4OFF, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   357
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   358
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   359
	 * Enable PAE mode (CR4.PAE)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   360
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   361
	D16 orl		$CR4_PAE, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   362
	movl		%eax, %cr4
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   363
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   364
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   365
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   366
	D16 movb        $0xd4, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   367
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   368
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   369
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   370
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   371
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   372
	D16 movb        $0x64, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   373
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   374
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   375
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   376
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   377
	 * Point cr3 to the 64-bit long mode page tables.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   378
	 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   379
	 * Note that these MUST exist in 32-bit space, as we don't have
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   380
	 * a way to load %cr3 with a 64-bit base address for the page tables
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   381
	 * until the CPU is actually executing in 64-bit long mode.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   382
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   383
	A16 D16 movl	CR3OFF, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   384
	movl		%eax, %cr3
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   385
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   386
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   387
	 * Set long mode enable in EFER (EFER.LME = 1)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   388
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   389
	D16 movl	$MSR_AMD_EFER, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   390
	rdmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   391
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   392
	D16 orl		$AMD_EFER_LME, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   393
	wrmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   394
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   395
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   396
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   397
	D16 movb        $0xd5, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   398
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   399
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   400
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   401
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   402
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   403
	D16 movb        $0x65, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   404
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   405
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   406
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   407
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   408
	 * Finally, turn on paging (CR0.PG = 1) to activate long mode.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   409
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   410
	movl		%cr0, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   411
	D16 orl		$CR0_PG, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   412
	movl		%eax, %cr0
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   413
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   414
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   415
	 * The instruction after enabling paging in CR0 MUST be a branch.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   416
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   417
	jmp		long_mode_active
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   418
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   419
long_mode_active:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   420
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   421
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   422
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   423
	D16 movb        $0xd6, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   424
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   425
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   426
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   427
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   428
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   429
	D16 movb        $0x66, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   430
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   431
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   432
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   433
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   434
	 * Long mode is now active but since we're still running with the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   435
	 * original 16-bit CS we're actually in 16-bit compatability mode.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   436
	 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   437
	 * We have to load an intermediate GDT and IDT here that we know are
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   438
	 * in 32-bit space before we can use the kernel's GDT and IDT, which
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   439
	 * may be in the 64-bit address space, and since we're in compatability
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   440
	 * mode, we only have access to 16 and 32-bit instructions at the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   441
	 * moment.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   442
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   443
	A16 D16 lgdt	TEMPGDTOFF	/* load temporary GDT */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   444
	A16 D16 lidt	TEMPIDTOFF	/* load temporary IDT */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   445
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   446
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   447
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   448
 	 * Do a far transfer to 64-bit mode.  Set the CS selector to a 64-bit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   449
	 * long mode selector (CS.L=1) in the temporary 32-bit GDT and jump
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   450
	 * to the real mode platter address of wc_long_mode_64 as until the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   451
	 * 64-bit CS is in place we don't have access to 64-bit instructions
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   452
	 * and thus can't reference a 64-bit %rip.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   453
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   454
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   455
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   456
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   457
	D16 movb        $0xd7, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   458
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   459
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   460
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   461
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   462
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   463
	D16 movb        $0x67, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   464
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   465
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   466
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   467
	D16 	pushl 	$TEMP_CS64_SEL
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   468
	A16 D16 pushl	LM64OFF
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   469
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   470
	D16 lret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   471
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   472
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   473
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   474
 * Support routine to re-initialize VGA subsystem
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   475
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   476
vgainit:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   477
	D16 ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   478
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   479
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   480
 * Support routine to re-initialize keyboard (which is USB - help!)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   481
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   482
kbdinit:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   483
	D16 ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   484
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   485
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   486
 * Support routine to re-initialize COM ports to something sane
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   487
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   488
cominit:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   489
	/ init COM1 & COM2
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   490
	
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   491
#if     DEBUG
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   492
/*
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   493
 * on debug kernels we need to initialize COM1 & COM2 here, so that
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   494
 * we can get debug output before the asy driver has resumed
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   495
 */
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   496
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   497
/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   498
	D16 movl	$[COM1+LCR], %edx
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   499
	D16 movb	$DLAB, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   500
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   501
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   502
	D16 movl	$[COM1+DLL], %edx	/ divisor latch lsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   503
	D16 movb	$B9600L, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   504
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   505
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   506
	D16 movl	$[COM1+DLH], %edx	/ divisor latch hsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   507
	D16 movb	$B9600H, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   508
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   509
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   510
	D16 movl	$[COM1+LCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   511
	D16 movb	$[STOP1|BITS8], %al	/ 1 stop bit, 8bit word len
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   512
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   513
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   514
	D16 movl	$[COM1+MCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   515
	D16 movb	$[RTS|DTR], %al		/ data term ready & req to send
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   516
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   517
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   518
/ select COM2
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   519
	D16 movl	$[COM2+LCR], %edx
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   520
	D16 movb	$DLAB, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   521
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   522
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   523
	D16 movl	$[COM2+DLL], %edx	/ divisor latch lsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   524
	D16 movb	$B9600L, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   525
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   526
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   527
	D16 movl	$[COM2+DLH], %edx	/ divisor latch hsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   528
	D16 movb	$B9600H, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   529
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   530
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   531
	D16 movl	$[COM2+LCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   532
	D16 movb	$[STOP1|BITS8], %al	/ 1 stop bit, 8bit word len
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   533
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   534
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   535
	D16 movl	$[COM2+MCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   536
	D16 movb	$[RTS|DTR], %al		/ data term ready & req to send
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   537
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   538
#endif	/*	DEBUG	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   539
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   540
	D16 ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   541
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   542
	.code64
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   543
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   544
	.globl wc_long_mode_64
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   545
wc_long_mode_64:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   546
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   547
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   548
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   549
	movb        $0xd8, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   550
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   551
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   552
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   553
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   554
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   555
	movb        $0x68, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   556
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   557
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   558
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   559
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   560
	 * We are now running in long mode with a 64-bit CS (EFER.LMA=1,
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   561
	 * CS.L=1) so we now have access to 64-bit instructions.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   562
	 *
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   563
	 * First, set the 64-bit GDT base.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   564
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   565
	.globl	rm_platter_pa
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   566
	movl	rm_platter_pa, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   567
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   568
	lgdtq	GDTROFF(%rax)		/* load 64-bit GDT */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   569
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   570
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   571
	 * Save the CPU number in %r11; get the value here since it's saved in
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   572
	 * the real mode platter.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   573
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   574
/ JAN
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   575
/ the following is wrong! need to figure out MP systems
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   576
/	movl	CPUNOFF(%rax), %r11d
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   577
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   578
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   579
	 * Add rm_platter_pa to %rsp to point it to the same location as seen
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   580
	 * from 64-bit mode.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   581
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   582
	addq	%rax, %rsp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   583
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   584
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   585
	 * Now do an lretq to load CS with the appropriate selector for the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   586
	 * kernel's 64-bit GDT and to start executing 64-bit setup code at the
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   587
	 * virtual address where boot originally loaded this code rather than
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   588
	 * the copy in the real mode platter's rm_code array as we've been
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   589
	 * doing so far.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   590
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   591
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   592
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   593
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   594
	movb        $0xd9, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   595
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   596
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   597
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   598
/ JAN this should produce 'i' but we get 'g' instead ???
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   599
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   600
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   601
	movb        $0x69, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   602
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   603
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   604
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   605
	pushq	$KCS_SEL
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   606
	pushq	$kernel_wc_code
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   607
	lretq
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   608
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   609
	.globl kernel_wc_code
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   610
kernel_wc_code:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   611
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   612
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   613
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   614
	movb        $0xda, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   615
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   616
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   617
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   618
/ JAN this should produce 'j' but we get 'g' instead ???
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   619
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   620
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   621
	movb        $0x6a, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   622
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   623
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   624
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   625
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   626
	 * Complete the balance of the setup we need to before executing
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   627
	 * 64-bit kernel code (namely init rsp, TSS, LGDT, FS and GS).
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   628
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   629
	.globl  rm_platter_va
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   630
	movq    rm_platter_va, %rbx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   631
	addq	$WC_CPU, %rbx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   632
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   633
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   634
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   635
	movb        $0xdb, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   636
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   637
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   638
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   639
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   640
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   641
	movw        $0x6b, %ax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   642
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   643
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   644
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   645
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   646
	 * restore the rest of the registers
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   647
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   648
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   649
	lidtq	WC_IDT(%rbx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   650
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   651
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   652
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   653
	movb        $0xdc, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   654
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   655
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   656
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   657
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   658
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   659
	movw        $0x6c, %ax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   660
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   661
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   662
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   663
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   664
	 * restore the rest of the registers
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   665
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   666
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   667
	movw    $KDS_SEL, %ax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   668
	movw    %ax, %ds
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   669
	movw    %ax, %es
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   670
	movw    %ax, %ss
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   671
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   672
	/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   673
	 * Before proceeding, enable usage of the page table NX bit if
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   674
	 * that's how the page tables are set up.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   675
	 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   676
	movl    x86_feature, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   677
	andl   	 $X86_NX, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   678
	jz      1f
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   679
	movl    $MSR_AMD_EFER, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   680
	rdmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   681
	orl     $AMD_EFER_NXE, %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   682
	wrmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   683
1:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   684
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   685
	movq	WC_CR4(%rbx), %rax	/ restore full cr4 (with Global Enable)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   686
	movq	%rax, %cr4
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   687
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   688
	lldt	WC_LDT(%rbx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   689
	movzwq	WC_TR(%rbx), %rax	/ clear TSS busy bit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   690
	addq	WC_GDT+2(%rbx), %rax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   691
	andl	$0xfffffdff, 4(%rax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   692
	movq	4(%rax), %rcx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   693
	ltr	WC_TR(%rbx)		
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   694
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   695
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   696
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   697
	movb        $0xdd, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   698
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   699
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   700
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   701
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   702
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   703
	movw        $0x6d, %ax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   704
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   705
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   706
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   707
/ restore %fsbase %gsbase %kgbase registers using wrmsr instruction
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   708
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   709
	movq    WC_FS(%rbx), %rcx	/ restore fs register
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   710
	movw    %cx, %fs
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   711
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   712
	movl    $MSR_AMD_FSBASE, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   713
	movl    WC_FSBASE(%rbx), %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   714
	movl    WC_FSBASE+4(%rbx), %edx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   715
	wrmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   716
	
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   717
	movq    WC_GS(%rbx), %rcx	/ restore gs register
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   718
	movw    %cx, %gs
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   719
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   720
	movl    $MSR_AMD_GSBASE, %ecx	/ restore gsbase msr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   721
	movl    WC_GSBASE(%rbx), %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   722
	movl    WC_GSBASE+4(%rbx), %edx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   723
	wrmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   724
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   725
	movl    $MSR_AMD_KGSBASE, %ecx	/ restore kgsbase msr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   726
	movl    WC_KGSBASE(%rbx), %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   727
	movl    WC_KGSBASE+4(%rbx), %edx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   728
	wrmsr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   729
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   730
	movq	WC_CR0(%rbx), %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   731
	movq	%rdx, %cr0
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   732
	movq	WC_CR3(%rbx), %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   733
	movq	%rdx, %cr3
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   734
	movq	WC_CR8(%rbx), %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   735
	movq	%rdx, %cr8
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   736
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   737
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   738
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   739
	movb        $0xde, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   740
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   741
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   742
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   743
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   744
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   745
	movb        $0x6e, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   746
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   747
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   748
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   749
	/*
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   750
	 * if we are not running on the boot CPU restore stack contents by
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   751
	 * calling i_cpr_restore_stack(curthread, save_stack);
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   752
	 */
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   753
	movq    %rsp, %rbp
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   754
	call	i_cpr_bootcpuid
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   755
	cmpl	%eax, WC_CPU_ID(%rbx)
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   756
	je	2f
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   757
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   758
	movq	%gs:CPU_THREAD, %rdi
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   759
	movq	WC_SAVED_STACK(%rbx), %rsi
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   760
	call	i_cpr_restore_stack
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   761
2:
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   762
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   763
	movq    WC_RSP(%rbx), %rsp	/ restore stack pointer
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   764
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   765
	/*
7362
0b07b96ed3bd 6734669 resume hangs on Toshiba M8/M9 with 64bit nondebug kernel
Guoli Shu<Kerry.Shu@Sun.COM>
parents: 6876
diff changeset
   766
	 * APIC initialization
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   767
	 */
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   768
	movq    %rsp, %rbp
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   769
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
   770
	/*
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
   771
	 * skip iff function pointer is NULL
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
   772
	 */
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
   773
	cmpq	$0, ap_mlsetup
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   774
	je	3f
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
   775
	call	*ap_mlsetup
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
   776
3:
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   777
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   778
	call    *cpr_start_cpu_func
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   779
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   780
/ restore %rbx to the value it ahd before we called the functions above
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   781
	movq    rm_platter_va, %rbx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   782
	addq	$WC_CPU, %rbx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   783
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   784
	movq    WC_R8(%rbx), %r8
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   785
	movq    WC_R9(%rbx), %r9
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   786
	movq    WC_R10(%rbx), %r10
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   787
	movq    WC_R11(%rbx), %r11
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   788
	movq    WC_R12(%rbx), %r12
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   789
	movq    WC_R13(%rbx), %r13
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   790
	movq    WC_R14(%rbx), %r14
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   791
	movq    WC_R15(%rbx), %r15
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   792
/	movq    WC_RAX(%rbx), %rax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   793
	movq    WC_RBP(%rbx), %rbp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   794
	movq    WC_RCX(%rbx), %rcx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   795
/	movq    WC_RDX(%rbx), %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   796
	movq    WC_RDI(%rbx), %rdi
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   797
	movq    WC_RSI(%rbx), %rsi
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   798
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   799
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   800
/ assume that %cs does not need to be restored
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   801
/ %ds, %es & %ss are ignored in 64bit mode
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   802
	movw	WC_SS(%rbx), %ss
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   803
	movw	WC_DS(%rbx), %ds
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   804
	movw	WC_ES(%rbx), %es
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   805
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   806
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   807
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   808
	movb        $0xdf, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   809
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   810
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   811
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   812
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   813
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   814
	movb        $0x6f, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   815
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   816
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   817
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   818
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   819
	movq    WC_RBP(%rbx), %rbp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   820
	movq    WC_RSP(%rbx), %rsp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   821
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   822
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   823
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   824
	movb        $0xe0, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   825
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   826
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   827
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   828
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   829
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   830
	movb        $0x70, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   831
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   832
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   833
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   834
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   835
	movq    WC_RCX(%rbx), %rcx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   836
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   837
	pushq	WC_EFLAGS(%rbx)			/ restore flags
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   838
	popfq
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   839
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   840
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   841
	movw        $WC_LED, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   842
	movb        $0xe1, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   843
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   844
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   845
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   846
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   847
	movw        $WC_COM, %dx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   848
	movb        $0x71, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   849
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   850
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   851
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   852
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   853
 * can not use outb after this point, because doing so would mean using
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   854
 * %dx which would modify %rdx which is restored here
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   855
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   856
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   857
	movq	%rbx, %rax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   858
	movq    WC_RDX(%rax), %rdx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   859
	movq    WC_RBX(%rax), %rbx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   860
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   861
	leave
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   862
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   863
	movq	WC_RETADDR(%rax), %rax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   864
	movq	%rax, (%rsp)		/ return to caller of wc_save_context
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   865
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   866
	xorl	%eax, %eax			/ at wakeup return 0
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   867
	ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   868
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   869
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   870
	SET_SIZE(wc_rm_start)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   871
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   872
	ENTRY_NP(asmspin)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   873
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   874
	movl	%edi, %ecx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   875
A1:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   876
	loop	A1
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   877
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   878
	SET_SIZE(asmspin)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   879
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   880
	.globl wc_rm_end
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   881
wc_rm_end:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   882
	nop
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   883
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   884
#elif defined(__i386)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   885
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   886
	ENTRY_NP(wc_rm_start)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   887
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   888
/entry:	jmp		entry			/ stop here for HDT
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   889
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   890
	cli
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   891
	movw		%cs, %ax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   892
	movw		%ax, %ds		/ establish ds ...
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   893
	movw		%ax, %ss		/ ... and ss:esp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   894
	D16 movl	$WC_STKSTART, %esp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   895
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   896
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   897
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   898
	D16 movb        $0xd1, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   899
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   900
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   901
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   902
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   903
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   904
	D16 movb        $0x61, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   905
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   906
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   907
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   908
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   909
	D16 call	vgainit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   910
	D16 call	kbdinit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   911
	D16 call	cominit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   912
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   913
#if     LED
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   914
	D16 movl        $WC_LED, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   915
	D16 movb        $0xd2, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   916
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   917
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   918
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   919
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   920
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   921
	D16 movb        $0x62, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   922
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   923
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   924
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   925
	D16 A16 movl	$WC_CPU, %ebx		/ base add of wc_cpu_t
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   926
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   927
#if     LED
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   928
	D16 movb        $0xd3, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   929
	outb    $WC_LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   930
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   931
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   932
#if     SERIAL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   933
	D16 movl        $WC_COM, %edx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   934
	D16 movb        $0x63, %al
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   935
	outb    (%dx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   936
#endif
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   937
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   938
	D16 A16 movl	%cs:WC_DS(%ebx), %edx	/ %ds post prot/paging transit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   939
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   940
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   941
	D16 movb        $0xd4, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   942
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   943
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   944
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   945
	D16 A16 lgdt	%cs:WC_GDT(%ebx)	/ restore gdt and idtr
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   946
	D16 A16 lidt	%cs:WC_IDT(%ebx)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   947
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   948
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   949
	D16 movb        $0xd5, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   950
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   951
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   952
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   953
	D16 A16 movl	%cs:WC_CR4(%ebx), %eax	/ restore cr4
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   954
	D16 andl	$-1!CR4_PGE, %eax	/ don't set Global Enable yet
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   955
	movl		%eax, %cr4
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   956
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   957
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   958
	D16 movb        $0xd6, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   959
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   960
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   961
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   962
	D16 A16 movl	%cs:WC_CR3(%ebx), %eax	/ set PDPT
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   963
	movl		%eax, %cr3
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   964
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   965
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   966
	D16 movb        $0xd7, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   967
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   968
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   969
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   970
	D16 A16 movl	%cs:WC_CR0(%ebx), %eax	/ enable prot/paging, etc.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   971
	movl		%eax, %cr0
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   972
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   973
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   974
	D16 movb        $0xd8, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   975
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   976
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   977
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   978
	D16 A16 movl	%cs:WC_VIRTADDR(%ebx), %ebx	/ virtaddr of wc_cpu_t
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   979
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   980
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   981
	D16 movb        $0xd9, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   982
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   983
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   984
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   985
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   986
	D16 movb        $0xda, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   987
	outb    $WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   988
#endif
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
   989
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   990
	jmp		flush			/ flush prefetch queue
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   991
flush:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   992
	D16 pushl	$KCS_SEL
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   993
	D16 pushl	$kernel_wc_code
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   994
	D16 lret				/ re-appear at kernel_wc_code
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   995
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   996
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   997
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   998
 * Support routine to re-initialize VGA subsystem
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
   999
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1000
vgainit:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1001
	D16 ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1002
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1003
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1004
 * Support routine to re-initialize keyboard (which is USB - help!)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1005
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1006
kbdinit:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1007
	D16 ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1008
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1009
/*
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1010
 * Support routine to re-initialize COM ports to something sane for debug output
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1011
 */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1012
cominit:
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1013
#if     DEBUG
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1014
/*
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1015
 * on debug kernels we need to initialize COM1 & COM2 here, so that
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1016
 * we can get debug output before the asy driver has resumed
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1017
 */
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1018
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1019
/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1020
	D16 movl	$[COM1+LCR], %edx
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1021
	D16 movb	$DLAB, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1022
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1023
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1024
	D16 movl	$[COM1+DLL], %edx	/ divisor latch lsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1025
	D16 movb	$B9600L, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1026
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1027
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1028
	D16 movl	$[COM1+DLH], %edx	/ divisor latch hsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1029
	D16 movb	$B9600H, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1030
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1031
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1032
	D16 movl	$[COM1+LCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1033
	D16 movb	$[STOP1|BITS8], %al	/ 1 stop bit, 8bit word len
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1034
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1035
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1036
	D16 movl	$[COM1+MCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1037
	D16 movb	$[RTS|DTR], %al		/ 1 stop bit, 8bit word len
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1038
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1039
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1040
/ select COM2
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1041
	D16 movl	$[COM2+LCR], %edx
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1042
	D16 movb	$DLAB, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1043
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1044
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1045
	D16 movl	$[COM2+DLL], %edx	/ divisor latch lsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1046
	D16 movb	$B9600L, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1047
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1048
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1049
	D16 movl	$[COM2+DLH], %edx	/ divisor latch hsb
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1050
	D16 movb	$B9600H, %al		/ divisor latch
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1051
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1052
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1053
	D16 movl	$[COM2+LCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1054
	D16 movb	$[STOP1|BITS8], %al	/ 1 stop bit, 8bit word len
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1055
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1056
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1057
	D16 movl	$[COM2+MCR], %edx	/ select COM1
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1058
	D16 movb	$[RTS|DTR], %al		/ 1 stop bit, 8bit word len
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1059
	outb	(%dx)
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1060
#endif	/*	DEBUG	*/
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1061
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1062
	D16 ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1063
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1064
	.globl wc_rm_end
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1065
wc_rm_end:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1066
	nop
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1067
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1068
	.globl	kernel_wc_code
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1069
kernel_wc_code:
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1070
	/ At this point we are with kernel's cs and proper eip.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1071
	/ We will be executing not from the copy in real mode platter,
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1072
	/ but from the original code where boot loaded us.
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1073
	/ By this time GDT and IDT are loaded as is cr0, cr3 and cr4. 
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1074
	/ %ebx is wc_cpu
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1075
	/ %dx is our ds
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1076
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1077
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1078
	D16 movb        $0xdb, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1079
	outb	$WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1080
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1081
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1082
/ got here OK
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1083
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1084
	movw	%dx, %ds		/ $KDS_SEL
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1085
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1086
#if     LED
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1087
	movb	$0xdc, %al
6876
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1088
	outb	$WC_LED
f2842fea385a 6701717 com1 and com2 incorrectly initialized during resume
jan
parents: 5817
diff changeset
  1089
#endif
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1090
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1091
	/*
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1092
	 * Before proceeding, enable usage of the page table NX bit if
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1093
	 * that's how the page tables are set up.
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1094
	 */
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1095
	movl    x86_feature, %ecx
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1096
	andl   	 $X86_NX, %ecx
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1097
	jz      1f
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1098
	movl    $MSR_AMD_EFER, %ecx
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1099
	rdmsr
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1100
	orl     $AMD_EFER_NXE, %eax
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1101
	wrmsr
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1102
1:
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1103
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1104
	movl	WC_CR4(%ebx), %eax	/ restore full cr4 (with Global Enable)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1105
	movl	%eax, %cr4
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1106
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1107
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1108
	lldt	WC_LDT(%ebx)		/ $LDT_SEL
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1109
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1110
	movzwl	WC_TR(%ebx), %eax	/ clear TSS busy bit
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1111
	addl	WC_GDT+2(%ebx), %eax
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1112
	andl	$-1!0x200, 4(%eax)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1113
	ltr	WC_TR(%ebx)		/ $UTSS_SEL
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1114
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1115
	movw	WC_SS(%ebx), %ss	/ restore segment registers
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1116
	movw	WC_ES(%ebx), %es
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1117
	movw	WC_FS(%ebx), %fs
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1118
	movw	WC_GS(%ebx), %gs
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1119
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1120
	/*
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1121
	 * set the stack pointer to point into the identity mapped page
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1122
	 * temporarily, so we can make function calls 
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1123
	 */
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1124
	.globl  rm_platter_va
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1125
	movl    rm_platter_va, %eax
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1126
	movl	$WC_STKSTART, %esp
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1127
	addl	%eax, %esp
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1128
	movl	%esp, %ebp
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1129
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1130
	/*
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1131
	 * if we are not running on the boot CPU restore stack contents by
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1132
	 * calling i_cpr_restore_stack(curthread, save_stack);
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1133
	 */
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1134
	call	i_cpr_bootcpuid
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1135
	cmpl	%eax, WC_CPU_ID(%ebx)
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1136
	je	2f
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1137
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1138
	pushl	WC_SAVED_STACK(%ebx)
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1139
	pushl	%gs:CPU_THREAD
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1140
	call	i_cpr_restore_stack
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1141
	addl	$0x10, %esp
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1142
2:
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1143
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1144
	movl	WC_ESP(%ebx), %esp
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1145
	movl	%esp, %ebp
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1146
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1147
	movl	WC_RETADDR(%ebx), %eax	/ return to caller of wc_save_context
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1148
	movl	%eax, (%esp)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1149
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1150
	/*
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1151
	 * APIC initialization, skip iff function pointer is NULL
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1152
	 */
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1153
	cmpl	$0, ap_mlsetup
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1154
	je	3f
5817
99b261e22ee4 6395227 Need to support s3 on MP machines
jan
parents: 5295
diff changeset
  1155
	call	*ap_mlsetup
9989
33d24b36e077 6814942 auxiliary CPUs needs to have their stacks saved and restored across suspend/resume
Joseph A Townsend <Joseph.Townsend@Sun.COM>
parents: 7362
diff changeset
  1156
3:
5295
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1157
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1158
	call    *cpr_start_cpu_func
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1159
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1160
	pushl	WC_EFLAGS(%ebx)		/ restore flags
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1161
	popfl
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1162
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1163
	movl	WC_EDI(%ebx), %edi	/ restore general registers
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1164
	movl	WC_ESI(%ebx), %esi
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1165
	movl	WC_EBP(%ebx), %ebp
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1166
	movl	WC_EBX(%ebx), %ebx
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1167
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1168
/exit:	jmp	exit			/ stop here for HDT
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1169
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1170
	xorl	%eax, %eax		/ at wakeup return 0
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1171
	ret
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1172
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1173
	SET_SIZE(wc_rm_start)
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1174
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1175
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1176
#endif	/* defined(__amd64) */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1177
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1178
#endif	/* !defined(__GNU_AS__) */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1179
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1180
#endif /* lint */
a21f2449e5f9 PSARC/2005/469 X86 Energy Star compliance
randyf
parents:
diff changeset
  1181