1*5d9d9091SRichard Lowe/* 2*5d9d9091SRichard Lowe * CDDL HEADER START 3*5d9d9091SRichard Lowe * 4*5d9d9091SRichard Lowe * The contents of this file are subject to the terms of the 5*5d9d9091SRichard Lowe * Common Development and Distribution License (the "License"). 6*5d9d9091SRichard Lowe * You may not use this file except in compliance with the License. 7*5d9d9091SRichard Lowe * 8*5d9d9091SRichard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5d9d9091SRichard Lowe * or http://www.opensolaris.org/os/licensing. 10*5d9d9091SRichard Lowe * See the License for the specific language governing permissions 11*5d9d9091SRichard Lowe * and limitations under the License. 12*5d9d9091SRichard Lowe * 13*5d9d9091SRichard Lowe * When distributing Covered Code, include this CDDL HEADER in each 14*5d9d9091SRichard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5d9d9091SRichard Lowe * If applicable, add the following below this CDDL HEADER, with the 16*5d9d9091SRichard Lowe * fields enclosed by brackets "[]" replaced with your own identifying 17*5d9d9091SRichard Lowe * information: Portions Copyright [yyyy] [name of copyright owner] 18*5d9d9091SRichard Lowe * 19*5d9d9091SRichard Lowe * CDDL HEADER END 20*5d9d9091SRichard Lowe */ 21*5d9d9091SRichard Lowe/* 22*5d9d9091SRichard Lowe * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23*5d9d9091SRichard Lowe */ 24*5d9d9091SRichard Lowe 25*5d9d9091SRichard Lowe/* 26*5d9d9091SRichard Lowe * General machine architecture & implementation specific 27*5d9d9091SRichard Lowe * assembly language routines. 28*5d9d9091SRichard Lowe */ 29*5d9d9091SRichard Lowe#include "assym.h" 30*5d9d9091SRichard Lowe 31*5d9d9091SRichard Lowe#define CPU_MODULE /* need it for NSEC_SHIFT used by NATIVE_TIME_TO_NSEC() */ 32*5d9d9091SRichard Lowe 33*5d9d9091SRichard Lowe#include <sys/asm_linkage.h> 34*5d9d9091SRichard Lowe#include <sys/machsystm.h> 35*5d9d9091SRichard Lowe#include <sys/machthread.h> 36*5d9d9091SRichard Lowe#include <sys/machclock.h> 37*5d9d9091SRichard Lowe#include <sys/privregs.h> 38*5d9d9091SRichard Lowe#include <sys/cmpregs.h> 39*5d9d9091SRichard Lowe#include <sys/clock.h> 40*5d9d9091SRichard Lowe#include <sys/fpras.h> 41*5d9d9091SRichard Lowe#include <sys/soft_state.h> 42*5d9d9091SRichard Lowe 43*5d9d9091SRichard Lowe/* 44*5d9d9091SRichard Lowe * This isn't the routine you're looking for. 45*5d9d9091SRichard Lowe * 46*5d9d9091SRichard Lowe * The routine simply returns the value of %tick on the *current* processor. 47*5d9d9091SRichard Lowe * Most of the time, gettick() [which in turn maps to %stick on platforms 48*5d9d9091SRichard Lowe * that have different CPU %tick rates] is what you want. 49*5d9d9091SRichard Lowe */ 50*5d9d9091SRichard Lowe 51*5d9d9091SRichard Lowe ENTRY(ultra_gettick) 52*5d9d9091SRichard Lowe RD_TICK(%o0,%o1,%o2,__LINE__) 53*5d9d9091SRichard Lowe retl 54*5d9d9091SRichard Lowe nop 55*5d9d9091SRichard Lowe SET_SIZE(ultra_gettick) 56*5d9d9091SRichard Lowe 57*5d9d9091SRichard Lowe ENTRY(set_mmfsa_scratchpad) 58*5d9d9091SRichard Lowe stxa %o0, [%g0]ASI_SCRATCHPAD 59*5d9d9091SRichard Lowe retl 60*5d9d9091SRichard Lowe nop 61*5d9d9091SRichard Lowe SET_SIZE(set_mmfsa_scratchpad) 62*5d9d9091SRichard Lowe 63*5d9d9091SRichard Lowe ENTRY(get_mmfsa_scratchpad) 64*5d9d9091SRichard Lowe ldxa [%g0]ASI_SCRATCHPAD, %o0 65*5d9d9091SRichard Lowe retl 66*5d9d9091SRichard Lowe nop 67*5d9d9091SRichard Lowe SET_SIZE(get_mmfsa_scratchpad) 68*5d9d9091SRichard Lowe 69*5d9d9091SRichard Lowe 70*5d9d9091SRichard Lowe 71*5d9d9091SRichard Lowe/* 72*5d9d9091SRichard Lowe * Called from a x-trap at tl1 must use %g1 as arg 73*5d9d9091SRichard Lowe * and save/restore %o0-%o5 after hypervisor calls 74*5d9d9091SRichard Lowe */ 75*5d9d9091SRichard Lowe 76*5d9d9091SRichard Lowe ENTRY(cpu_intrq_unregister_powerdown) 77*5d9d9091SRichard Lowe 78*5d9d9091SRichard Lowe CPU_ADDR(%g2, %g3) 79*5d9d9091SRichard Lowe add %g2, CPU_MCPU, %g2 80*5d9d9091SRichard Lowe /* 81*5d9d9091SRichard Lowe * Save %o regs 82*5d9d9091SRichard Lowe */ 83*5d9d9091SRichard Lowe mov %o0, %g3 84*5d9d9091SRichard Lowe mov %o1, %g4 85*5d9d9091SRichard Lowe mov %o2, %g5 86*5d9d9091SRichard Lowe mov %o5, %g6 87*5d9d9091SRichard Lowe 88*5d9d9091SRichard Lowe ldx [%g2 + MCPU_CPU_Q_BASE], %o1 89*5d9d9091SRichard Lowe mov INTR_CPU_Q, %o0 90*5d9d9091SRichard Lowe call hv_cpu_qconf 91*5d9d9091SRichard Lowe mov %g0, %o2 92*5d9d9091SRichard Lowe 93*5d9d9091SRichard Lowe ldx [%g2 + MCPU_DEV_Q_BASE], %o1 94*5d9d9091SRichard Lowe mov INTR_DEV_Q, %o0 95*5d9d9091SRichard Lowe call hv_cpu_qconf 96*5d9d9091SRichard Lowe mov %g0, %o2 97*5d9d9091SRichard Lowe 98*5d9d9091SRichard Lowe ldx [%g2 + MCPU_RQ_BASE], %o1 99*5d9d9091SRichard Lowe mov CPU_RQ, %o0 100*5d9d9091SRichard Lowe call hv_cpu_qconf 101*5d9d9091SRichard Lowe mov %g0, %o2 102*5d9d9091SRichard Lowe 103*5d9d9091SRichard Lowe ldx [%g2 + MCPU_NRQ_BASE], %o1 104*5d9d9091SRichard Lowe mov CPU_NRQ, %o0 105*5d9d9091SRichard Lowe call hv_cpu_qconf 106*5d9d9091SRichard Lowe mov %g0, %o2 107*5d9d9091SRichard Lowe 108*5d9d9091SRichard Lowe /* 109*5d9d9091SRichard Lowe * set done flag to 0 110*5d9d9091SRichard Lowe */ 111*5d9d9091SRichard Lowe stub %g0, [%g1] 112*5d9d9091SRichard Lowe 113*5d9d9091SRichard Lowe /* 114*5d9d9091SRichard Lowe * Restore %o regs 115*5d9d9091SRichard Lowe */ 116*5d9d9091SRichard Lowe mov %g3, %o0 117*5d9d9091SRichard Lowe mov %g4, %o1 118*5d9d9091SRichard Lowe mov %g5, %o2 119*5d9d9091SRichard Lowe mov %g6, %o5 120*5d9d9091SRichard Lowe 121*5d9d9091SRichard Lowe /* 122*5d9d9091SRichard Lowe * This CPU is on its way out. Spin here 123*5d9d9091SRichard Lowe * until the DR unconfigure code stops it. 124*5d9d9091SRichard Lowe * Returning would put it back in the OS 125*5d9d9091SRichard Lowe * where it might grab resources like locks, 126*5d9d9091SRichard Lowe * causing some nastiness to occur. 127*5d9d9091SRichard Lowe */ 128*5d9d9091SRichard Lowe0: 129*5d9d9091SRichard Lowe ba,a 0b 130*5d9d9091SRichard Lowe 131*5d9d9091SRichard Lowe SET_SIZE(cpu_intrq_unregister_powerdown) 132*5d9d9091SRichard Lowe 133*5d9d9091SRichard Lowe 134*5d9d9091SRichard Lowe/* 135*5d9d9091SRichard Lowe * Get the processor ID. 136*5d9d9091SRichard Lowe * === MID reg as specified in 15dec89 sun4u spec, sec 5.4.3 137*5d9d9091SRichard Lowe */ 138*5d9d9091SRichard Lowe 139*5d9d9091SRichard Lowe ENTRY(getprocessorid) 140*5d9d9091SRichard Lowe CPU_INDEX(%o0, %o1) 141*5d9d9091SRichard Lowe retl 142*5d9d9091SRichard Lowe nop 143*5d9d9091SRichard Lowe SET_SIZE(getprocessorid) 144*5d9d9091SRichard Lowe 145*5d9d9091SRichard Lowe ENTRY_NP(tick2ns) 146*5d9d9091SRichard Lowe ! 147*5d9d9091SRichard Lowe ! Use nsec_scale for sun4v which is based on %stick 148*5d9d9091SRichard Lowe ! 149*5d9d9091SRichard Lowe NATIVE_TIME_TO_NSEC(%o0, %o2, %o3) 150*5d9d9091SRichard Lowe retl 151*5d9d9091SRichard Lowe nop 152*5d9d9091SRichard Lowe SET_SIZE(tick2ns) 153*5d9d9091SRichard Lowe 154*5d9d9091SRichard Lowe ENTRY(set_cmp_error_steering) 155*5d9d9091SRichard Lowe retl 156*5d9d9091SRichard Lowe nop 157*5d9d9091SRichard Lowe SET_SIZE(set_cmp_error_steering) 158*5d9d9091SRichard Lowe 159*5d9d9091SRichard Lowe ENTRY(ultra_getver) 160*5d9d9091SRichard Lowe retl 161*5d9d9091SRichard Lowe mov -1, %o0 ! XXXQ no version available 162*5d9d9091SRichard Lowe SET_SIZE(ultra_getver) 163*5d9d9091SRichard Lowe 164*5d9d9091SRichard Lowe /* 165*5d9d9091SRichard Lowe * Check instructions using just the AX pipelines, designed by 166*5d9d9091SRichard Lowe * C.B. Liaw of PNP. 167*5d9d9091SRichard Lowe * 168*5d9d9091SRichard Lowe * This function must match a struct fpras_chkfn and must be 169*5d9d9091SRichard Lowe * block aligned. A zero return means all was well. These 170*5d9d9091SRichard Lowe * instructions are chosen to be sensitive to bit corruptions 171*5d9d9091SRichard Lowe * on the fpras rewrite, so if a bit corruption still produces 172*5d9d9091SRichard Lowe * a valid instruction we should still get an incorrect result 173*5d9d9091SRichard Lowe * here. This function is never called directly - it is copied 174*5d9d9091SRichard Lowe * into per-cpu and per-operation buffers; it must therefore 175*5d9d9091SRichard Lowe * be absolutely position independent. If an illegal instruction 176*5d9d9091SRichard Lowe * is encountered then the trap handler trampolines to the final 177*5d9d9091SRichard Lowe * three instructions of this function. 178*5d9d9091SRichard Lowe * 179*5d9d9091SRichard Lowe * We want two instructions that are complements of one another, 180*5d9d9091SRichard Lowe * and which can perform a calculation with a known result. 181*5d9d9091SRichard Lowe * 182*5d9d9091SRichard Lowe * SETHI: 183*5d9d9091SRichard Lowe * 184*5d9d9091SRichard Lowe * | 0 0 | rd | 1 0 0 | imm22 | 185*5d9d9091SRichard Lowe * 31 30 29 25 24 22 21 0 186*5d9d9091SRichard Lowe * 187*5d9d9091SRichard Lowe * ADDCCC with two source registers: 188*5d9d9091SRichard Lowe * 189*5d9d9091SRichard Lowe * | 1 0 | rd | 0 1 1 0 0 0 | rs1 | 0 | - | rs2 | 190*5d9d9091SRichard Lowe * 31 30 29 25 24 19 18 14 13 12 5 4 0 191*5d9d9091SRichard Lowe * 192*5d9d9091SRichard Lowe * We can choose rd and imm2 of the SETHI and rd, rs1 and rs2 of 193*5d9d9091SRichard Lowe * the ADDCCC to obtain instructions that are complements in all but 194*5d9d9091SRichard Lowe * bit 30. 195*5d9d9091SRichard Lowe * 196*5d9d9091SRichard Lowe * Registers are numbered as follows: 197*5d9d9091SRichard Lowe * 198*5d9d9091SRichard Lowe * r[31] %i7 199*5d9d9091SRichard Lowe * r[30] %i6 200*5d9d9091SRichard Lowe * r[29] %i5 201*5d9d9091SRichard Lowe * r[28] %i4 202*5d9d9091SRichard Lowe * r[27] %i3 203*5d9d9091SRichard Lowe * r[26] %i2 204*5d9d9091SRichard Lowe * r[25] %i1 205*5d9d9091SRichard Lowe * r[24] %i0 206*5d9d9091SRichard Lowe * r[23] %l7 207*5d9d9091SRichard Lowe * r[22] %l6 208*5d9d9091SRichard Lowe * r[21] %l5 209*5d9d9091SRichard Lowe * r[20] %l4 210*5d9d9091SRichard Lowe * r[19] %l3 211*5d9d9091SRichard Lowe * r[18] %l2 212*5d9d9091SRichard Lowe * r[17] %l1 213*5d9d9091SRichard Lowe * r[16] %l0 214*5d9d9091SRichard Lowe * r[15] %o7 215*5d9d9091SRichard Lowe * r[14] %o6 216*5d9d9091SRichard Lowe * r[13] %o5 217*5d9d9091SRichard Lowe * r[12] %o4 218*5d9d9091SRichard Lowe * r[11] %o3 219*5d9d9091SRichard Lowe * r[10] %o2 220*5d9d9091SRichard Lowe * r[9] %o1 221*5d9d9091SRichard Lowe * r[8] %o0 222*5d9d9091SRichard Lowe * r[7] %g7 223*5d9d9091SRichard Lowe * r[6] %g6 224*5d9d9091SRichard Lowe * r[5] %g5 225*5d9d9091SRichard Lowe * r[4] %g4 226*5d9d9091SRichard Lowe * r[3] %g3 227*5d9d9091SRichard Lowe * r[2] %g2 228*5d9d9091SRichard Lowe * r[1] %g1 229*5d9d9091SRichard Lowe * r[0] %g0 230*5d9d9091SRichard Lowe * 231*5d9d9091SRichard Lowe * For register r[n], register r[31-n] is the complement. We must 232*5d9d9091SRichard Lowe * avoid use of %i6/%i7 and %o6/%o7 as well as %g7. Clearly we need 233*5d9d9091SRichard Lowe * to use a local or input register as one half of the pair, which 234*5d9d9091SRichard Lowe * requires us to obtain our own register window or take steps 235*5d9d9091SRichard Lowe * to preserve any local or input we choose to use. We choose 236*5d9d9091SRichard Lowe * %o1 as rd for the SETHI, so rd of the ADDCCC must be %l6. 237*5d9d9091SRichard Lowe * We'll use %o1 as rs1 and %l6 as rs2 of the ADDCCC, which then 238*5d9d9091SRichard Lowe * requires that imm22 be 0b111 10110 1 11111111 01001 or 0x3dbfe9, 239*5d9d9091SRichard Lowe * or %hi(0xf6ffa400). This determines the value of the constant 240*5d9d9091SRichard Lowe * CBV2 below. 241*5d9d9091SRichard Lowe * 242*5d9d9091SRichard Lowe * The constant CBV1 is chosen such that an initial subcc %g0, CBV1 243*5d9d9091SRichard Lowe * will set the carry bit and every addccc thereafter will continue 244*5d9d9091SRichard Lowe * to generate a carry. Other values are possible for CBV1 - this 245*5d9d9091SRichard Lowe * is just one that works this way. 246*5d9d9091SRichard Lowe * 247*5d9d9091SRichard Lowe * Finally CBV3 is the expected answer when we perform our repeated 248*5d9d9091SRichard Lowe * calculations on CBV1 and CBV2 - it is not otherwise specially 249*5d9d9091SRichard Lowe * derived. If this result is not obtained then a corruption has 250*5d9d9091SRichard Lowe * occured during the FPRAS_REWRITE of one of the two blocks of 251*5d9d9091SRichard Lowe * 16 instructions. A corruption could also result in an illegal 252*5d9d9091SRichard Lowe * instruction or other unexpected trap - we catch illegal 253*5d9d9091SRichard Lowe * instruction traps in the PC range and trampoline to the 254*5d9d9091SRichard Lowe * last instructions of the function to return a failure indication. 255*5d9d9091SRichard Lowe * 256*5d9d9091SRichard Lowe */ 257*5d9d9091SRichard Lowe 258*5d9d9091SRichard Lowe#define CBV1 0xc11 259*5d9d9091SRichard Lowe#define CBV2 0xf6ffa400 260*5d9d9091SRichard Lowe#define CBV3 0x66f9d800 261*5d9d9091SRichard Lowe#define CBR1 %o1 262*5d9d9091SRichard Lowe#define CBR2 %l6 263*5d9d9091SRichard Lowe#define CBO2 %o2 264*5d9d9091SRichard Lowe#define SETHI_CBV2_CBR1 sethi %hi(CBV2), CBR1 265*5d9d9091SRichard Lowe#define ADDCCC_CBR1_CBR2_CBR2 addccc CBR1, CBR2, CBR2 266*5d9d9091SRichard Lowe 267*5d9d9091SRichard Lowe .align 64 268*5d9d9091SRichard Lowe ENTRY_NP(fpras_chkfn_type1) 269*5d9d9091SRichard Lowe mov CBR2, CBO2 ! 1, preserve CBR2 of (callers) window 270*5d9d9091SRichard Lowe mov FPRAS_OK, %o0 ! 2, default return value 271*5d9d9091SRichard Lowe ba,pt %icc, 1f ! 3 272*5d9d9091SRichard Lowe subcc %g0, CBV1, CBR2 ! 4 273*5d9d9091SRichard Lowe ! 5 - 16 274*5d9d9091SRichard Lowe .align 64 275*5d9d9091SRichard Lowe1: SETHI_CBV2_CBR1 ! 1 276*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 2 277*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 3 278*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 4 279*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 5 280*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 6 281*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 7 282*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 8 283*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 9 284*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 10 285*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 11 286*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 12 287*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 13 288*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 14 289*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 15 290*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 16 291*5d9d9091SRichard Lowe 292*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 1 293*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 2 294*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 3 295*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 4 296*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 5 297*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 6 298*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 7 299*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 8 300*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 9 301*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 10 302*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 11 303*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 12 304*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 13 305*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 14 306*5d9d9091SRichard Lowe ADDCCC_CBR1_CBR2_CBR2 ! 15 307*5d9d9091SRichard Lowe SETHI_CBV2_CBR1 ! 16 308*5d9d9091SRichard Lowe 309*5d9d9091SRichard Lowe addc CBR1, CBR2, CBR2 ! 1 310*5d9d9091SRichard Lowe sethi %hi(CBV3), CBR1 ! 2 311*5d9d9091SRichard Lowe cmp CBR1, CBR2 ! 3 312*5d9d9091SRichard Lowe movnz %icc, FPRAS_BADCALC, %o0! 4, how detected 313*5d9d9091SRichard Lowe retl ! 5 314*5d9d9091SRichard Lowe mov CBO2, CBR2 ! 6, restore borrowed register 315*5d9d9091SRichard Lowe .skip 4*(13-7+1) ! 7 - 13 316*5d9d9091SRichard Lowe ! 317*5d9d9091SRichard Lowe ! illegal instr'n trap comes here 318*5d9d9091SRichard Lowe ! 319*5d9d9091SRichard Lowe mov CBO2, CBR2 ! 14, restore borrowed register 320*5d9d9091SRichard Lowe retl ! 15 321*5d9d9091SRichard Lowe mov FPRAS_BADTRAP, %o0 ! 16, how detected 322*5d9d9091SRichard Lowe SET_SIZE(fpras_chkfn_type1) 323*5d9d9091SRichard Lowe 324*5d9d9091SRichard Lowe .seg ".data" 325*5d9d9091SRichard Lowe .global soft_state_message_strings 326*5d9d9091SRichard Lowe 327*5d9d9091SRichard Lowe .align SSM_SIZE 328*5d9d9091SRichard Lowesoft_state_message_strings: 329*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_BOOT_MSG_STR 330*5d9d9091SRichard Lowe .align SSM_SIZE 331*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_RUN_MSG_STR 332*5d9d9091SRichard Lowe .align SSM_SIZE 333*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_HALT_MSG_STR 334*5d9d9091SRichard Lowe .align SSM_SIZE 335*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_POWER_MSG_STR 336*5d9d9091SRichard Lowe .align SSM_SIZE 337*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_PANIC_MSG_STR 338*5d9d9091SRichard Lowe .align SSM_SIZE 339*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_REBOOT_MSG_STR 340*5d9d9091SRichard Lowe .align SSM_SIZE 341*5d9d9091SRichard Lowe .asciz SOLARIS_SOFT_STATE_DEBUG_MSG_STR 342*5d9d9091SRichard Lowe .align SSM_SIZE 343*5d9d9091SRichard Lowe .skip SSM_SIZE /* saved message */ 344*5d9d9091SRichard Lowe .nword 0 345*5d9d9091SRichard Lowe 346*5d9d9091SRichard Lowe .seg ".text" 347