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