/*++ Copyright (c) 1992, 1993 Digital Equipment Corporation Module: kxalpha.h Abstract: Contains alpha architecture constants and assembly macros. Author: Joe Notarangelo 31-March-1992 (based on Dave Cutler's kxmips.h) Revision History 16-July-1992 John DeRosa Removed fwcalpal.h hook. 8-July-1992 John DeRosa Added fwcalpal.h hooks, defined HALT call_pal. --*/ // // Define Sfw Interrupt Levels and masks // #define APC_INTERRUPT 0x1 #define DISPATCH_INTERRUPT 0x2 // // Define standard integer registers. // // N.B. `at' is `AT' so it doesn't conflict with the `.set at' pseudo-op. // #define v0 $0 // return value register #define t0 $1 // caller saved (temporary) registers #define t1 $2 // #define t2 $3 // #define t3 $4 // #define t4 $5 // #define t5 $6 // #define t6 $7 // #define t7 $8 // #define s0 $9 // callee saved (nonvolatile) registers #define s1 $10 // #define s2 $11 // #define s3 $12 // #define s4 $13 // #define s5 $14 // #define fp $15 // frame pointer register, or s6 #define a0 $16 // argument registers #define a1 $17 // #define a2 $18 // #define a3 $19 // #define a4 $20 // #define a5 $21 // #define t8 $22 // caller saved (temporary) registers #define t9 $23 // #define t10 $24 // #define t11 $25 // #define ra $26 // return address register #define t12 $27 // caller saved (temporary) registers #define AT $28 // assembler temporary register #define gp $29 // global pointer register #define sp $30 // stack pointer register #define zero $31 // zero register #ifndef PALCODE // // Define standard floating point registers. // #define f0 $f0 // return value register #define f1 $f1 // return value register #define f2 $f2 // callee saved (nonvolatile) registers #define f3 $f3 // #define f4 $f4 // #define f5 $f5 // #define f6 $f6 // #define f7 $f7 // #define f8 $f8 // #define f9 $f9 // #define f10 $f10 // caller saved (temporary) registers #define f11 $f11 // #define f12 $f12 // #define f13 $f13 // #define f14 $f14 // #define f15 $f15 // #define f16 $f16 // argument registers #define f17 $f17 // #define f18 $f18 // #define f19 $f19 // #define f20 $f20 // #define f21 $f21 // #define f22 $f22 // caller saved (temporary) registers #define f23 $f23 // #define f24 $f24 // #define f25 $f25 // #define f26 $f26 // #define f27 $f27 // #define f28 $f28 // #define f29 $f29 // #define f30 $f30 // #define f31 $f31 // floating zero register #define fzero $f31 // floating zero register (alias) #endif //!PALCODE // // Define procedure entry macros // #define ALTERNATE_ENTRY(Name) \ .globl Name; \ Name:; #define LEAF_ENTRY(Name) \ .text; \ .align 4; \ .globl Name; \ .ent Name, 0; \ Name:; \ .frame sp, 0, ra; \ .prologue 0; #define NESTED_ENTRY(Name, fsize, retrg) \ .text; \ .align 4; \ .globl Name; \ .ent Name, 0; \ Name:; \ .frame sp, fsize, retrg; // // Define global definition macros. // #define END_REGION(Name) \ .globl Name; \ Name:; #define START_REGION(Name) \ .globl Name; \ Name:; // // Define exception handling macros. // #define EXCEPTION_HANDLER(Handler) \ .edata 1, Handler; #define PROLOGUE_END .prologue 1; // // Define save and restore floating state macros. // #define SAVE_NONVOLATILE_FLOAT_STATE \ bsr ra, KiSaveNonVolatileFloatState // // Define interfaces to pcr and palcode // // The interfaces defined in the following macros will be PALcode // calls for some implemenations, but may be in-line code in others // (eg. uniprocessor vs multiprocessor). At the current time all of // the interfaces are PALcode calls. // // // Define interfaces for cache coherency // //++ // // IMB // // Macro Description: // // Issue the architecture-defined Instruction Memory Barrier. This // instruction will make the processor instruction stream coherent with // the system memory. // // Mode: // // Kernel and User. // // Arguments: // // None. // // Return Value: // // None. // // Registers Used: // // None. // //-- #define IMB call_pal imb // // Define PALcode Environment Transition Interfaces // //++ // // REBOOT // // Macro Description: // // Reboot the processor to return to firmware. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // Does not return. // // Registers Used: // // None. // //-- #define REBOOT call_pal reboot //++ // // RESTART // // Macro Description: // // Restart the processor with the processor state found in a // restart block. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies a pointer to an ARC restart block with an Alpha AXP // saved state area. // // Return Value: // // If successful the call does not return. Otherwise, any return // is considered a failure. // // Registers Used: // // None. // //-- #define RESTART call_pal restart //++ // // SWPPAL // // Macro Description: // // Swap the execution environment to a new PALcode image. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the physical address of the base of the new PALcode // image. // // a1 - a5 - Supply arguments to the new PALcode environment. // // Return Value: // // Does not return. // // Registers Used: // // None. // //-- #define SWPPAL call_pal swppal // // Define IRQL and interrupt interfaces // //++ // // DISABLE_INTERRUPTS // // Macro Description: // // Disable all interrupts for the current processor and return the // previous PSR. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // None. // // Registers Used: // // None. // //-- #define DISABLE_INTERRUPTS call_pal di //++ // // ENABLE_INTERRUPTS // // Macro Description: // // Enable interrupts according to the current PSR for the current // processor. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // None. // // Registers Used: // // None. // //-- #define ENABLE_INTERRUPTS call_pal ei //++ // // SWAP_IRQL // // Macro Description: // // Swap the IRQL level for the current processor. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the new IRQL level. // // Return Value: // // v0 = previous IRQL level. // // Registers Used: // // AT, a1 - a3. // //-- #define SWAP_IRQL call_pal swpirql //++ // // GET_CURRENT_IRQL // // Macro Description: // // Return the current processor Interrupt Request Level (IRQL). // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = current IRQL. // // Registers Used: // // AT. // //-- #define GET_CURRENT_IRQL call_pal rdirql // // Define interfaces for software interrupts // //++ // // DEASSERT_SOFTWARE_INTERRUPT // // Macro Description: // // Deassert the software interrupts indicated in a0 for the current // processor. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the mask for the software interrupt to be de-asserted. // a0<1> - Deassert DISPATCH software interrupt. // a0<0> - Deassert APC software interrupt. // // Return Value: // // None. // // Registers Used: // // AT, a1 - a3. // //-- #define DEASSERT_SOFTWARE_INTERRUPT call_pal csir //++ // // REQUEST_SOFTWARE_INTERRUPT // // Macro Description: // // Request software interrupts on the current processor according to // the mask supplied in a0. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the mask of software interrupts to be requested. // a0<1> - Request DISPATCH software interrupt. // a0<0> - Request APC software interrupt. // // Return Value: // // None. // // Registers Used: // // AT, a1 - a3. // //-- #define REQUEST_SOFTWARE_INTERRUPT call_pal ssir // // Define interfaces to Processor Status Register // //++ // // GET_CURRENT_PROCESSOR_STATUS_REGISTER // // Macro Description: // // Return the current Processor Status Register (PSR) for the current // processor. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = current PSR. // // Registers Used: // // AT. // //-- #define GET_CURRENT_PROCESSOR_STATUS_REGISTER call_pal rdpsr // // Define current thread interface // //++ // // GET_THREAD_ENVIRONMENT_BLOCK // // Macro Description: // // Return the base address of the current Thread Environment Block (TEB), // for the currently executing thread on the current processor. // // Mode; // // Kernel and User. // // Arguments: // // None. // // Return Value: // // v0 = TEB base address. // // Registers Used: // // None. // //-- #define GET_THREAD_ENVIRONMENT_BLOCK call_pal rdteb //++ // // GET_CURRENT_THREAD // // Macro Description: // // Return the thread object address for the currently executing thread // on the current processor. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = PCR base address. // // Registers Used: // // AT. // //-- #ifdef NT_UP // // If uni-processor, retrieve current thread address from the global // variable KiCurrentThread. // #define GET_CURRENT_THREAD \ lda v0, KiCurrentThread; \ ldl v0, 0(v0) #else // // If multi-processor, retrive per-processor current thread via a call pal. // #define GET_CURRENT_THREAD call_pal rdthread #endif //NT_UP // // Define per-processor data area routine interfaces // //++ // // GET_PROCESSOR_CONTROL_REGION_BASE // // Macro Description: // // Return the base address of the Process Control Region (PCR) // for the current processor. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = PCR base address. // // Registers Used: // // AT. // //-- #ifdef NT_UP // // Uni-processor, address of PCR is in global variable. // #define GET_PROCESSOR_CONTROL_REGION_BASE \ lda v0, KiPcrBaseAddress; \ ldl v0, 0(v0) #else // // Multi-processor, get per-processor value via call pal. // #define GET_PROCESSOR_CONTROL_REGION_BASE call_pal rdpcr #endif //NT_UP //++ // // GET_PROCESSOR_CONTROL_BLOCK_BASE // // Macro Description: // // Return the Processor Control Block base address. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = PRCB base address. // // Registers Used: // // AT. // //-- #define GET_PROCESSOR_CONTROL_BLOCK_BASE \ GET_PROCESSOR_CONTROL_REGION_BASE; \ ldl v0, PcPrcb(v0) // // Define kernel stack interfaces // //++ // // GET_INITIAL_KERNEL_STACK // // Macro Description: // // Return the initial kernel stack address for the current thread. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = initial kernel stack address. // // Registers Used: // // AT. // //-- #define GET_INITIAL_KERNEL_STACK call_pal rdksp //++ // // SET_INITIAL_KERNEL_STACK // // Macro Description: // // Set the initial kernel stack address for the current thread. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the new initial kernel stack address. // // Return Value: // // v0 - Previous initial kernel stack address. // // Registers Used: // // AT. // //-- #define SET_INITIAL_KERNEL_STACK call_pal swpksp // // Define initialization routine interfaces // //++ // // INITIALIZE_PAL // // Macro Description: // // Supply values to initialize the PALcode. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies initial PageDirectoryBase (32-bit superpage address). // a1 - Supplies PRCB Base Address (32-bit superpage address). // a2 - Supplies address of initial kernel thread object. // a3 - Supplies address of TEB for initial kernel thread object. // gp - Supplies kernel image global pointer. // sp - Supplies initial thread kernel stack pointer. // // Return Value: // // v0 = PAL base address in 32-bit super-page format (KSEG0). // // Registers Used: // // AT, a3. // //-- #define INITIALIZE_PAL call_pal initpal //++ // // WRITE_KERNEL_ENTRY_POINT // // Macro Description: // // Register the kernel entry point to receive control for a // class of exceptions. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the address of the kernel entry point. // a1 - Supplies the class of exception dispatched to this entry point. // 0 = bug check conditions // 1 = memory management faults // 2 = interrupts // 3 = system service calls // 4 = general exception traps // // Return Value: // // None. // // Registers Used: // // AT, a2-a3. // //-- #define WRITE_KERNEL_ENTRY_POINT call_pal wrentry // // Define entry point values for the wrentry callpal function // #define entryBugCheck 0 #define entryMM 1 #define entryInterrupt 2 #define entrySyscall 3 #define entryGeneral 4 //++ // // CACHE_PCR_VALUES // // Macro Description: // // Notify the PALcode that the PCR has been initialized by the // kernel and the HAL and that the PALcode may now read values // from the PCR and cache them inside the processor. // // N.B. - the PCR pointer must have already been established in // initpal // // N.B. - This interface is a processor-specific implementation // and cannot be assumed to be present on all processors. // Currently implemented for the following processors: // // DECchip 21064 // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // None. // // Registers Used: // // AT, a0 - a3. // //-- #define CACHE_PCR_VALUES call_pal initpcr // // Define transition interfaces // //++ // // RETURN_FROM_TRAP_OR_INTERRUPT // // Macro Description: // // Return to execution thread after processing a trap or // interrupt. Traps can be general exceptions (breakpoint, // arithmetic traps, etc.) or memory management faults. // This macro is also used to startup a thread of execution // for the first time. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the previous processor status register. // a1 - Supplies new software interrupt requests. // a1<1> - Request a DISPATCH Interrupt. // a1<0> - Request an APC Interrupt. // // Return Value: // // Does not return. // // Registers Used: // // None. // //-- #define RETURN_FROM_TRAP_OR_INTERRUPT call_pal rfe //++ // // RETURN_FROM_SYSTEM_CALL // // Macro Description: // // Return from a system service call. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the previous processor status register. // a1 - Supplies new software interrupt requests. // a1<1> - Request a DISPATCH Interrupt. // a1<0> - Request an APC Interrupt. // // Return Value: // // Does not return. // // Registers Used: // // All volatile registers. // //-- #define RETURN_FROM_SYSTEM_CALL call_pal retsys //++ // // SYSCALL // // Macro Description: // // Call a system service. // // Mode: // // Kernel and User. // // Arguments: // // v0 - Supplies the system service number. // [other arguments as per calling standard] // // Return Value: // // Will not return directly, returns via retsys, no return value. // // Registers Used: // // All volatile registers. // //-- #define SYSCALL call_pal callsys // // Define breakpoint interfaces // //++ // // BREAK // // Macro Description: // // Issue a user breakpoint which may be handled by a user-mode // debugger. // // Mode: // // Kernel and User. // // Arguments: // // None. // // Return Value: // // Will not return directly, returns via rti, no return value. // // Registers Used: // // None. // //-- #define BREAK call_pal bpt //++ // // BREAK_DEBUG_STOP // // Macro Description: // // Issue a stop breakpoint to the kernel debugger. // // Mode: // // Kernel and User. // // Arguments: // // None. // // Return Value: // // Will not return directly, returns via rti, no return value. // // Registers Used: // // AT, v0. // //-- #define BREAK_DEBUG_STOP \ ldil v0, DEBUG_STOP_BREAKPOINT; \ call_pal callkd //++ //++ // // BREAK_BREAKIN // // Macro Description: // // Issue a breakin breakpoint to the kernel debugger. // // Mode: // // Kernel and User. // // Arguments: // // None. // // Return Value: // // Will not return directly, returns via rti, no return value. // // Registers Used: // // AT, v0. // //-- #define BREAK_BREAKIN \ ldil v0, BREAKIN_BREAKPOINT; \ call_pal callkd //++ // // BREAK_DEBUG_LOAD_SYMBOLS // // Macro Description: // // Issue a load symbols breakpoint to the kernel debugger. // // Mode: // // Kernel and User. // // Arguments: // // None. // // Return Value: // // Will not return directly, returns via rti, no return value. // // Registers Used: // // AT, v0. // //-- #define BREAK_DEBUG_LOAD_SYMBOLS \ ldil v0, DEBUG_LOAD_SYMBOLS_BREAKPOINT; \ call_pal callkd //++ // // BREAK_DEBUG_UNLOAD_SYMBOLS // // Macro Description: // // Issue a unload symbols breakpoint to the kernel debugger. // // Mode: // // Kernel and User. // // Arguments: // // None. // // Return Value: // // Will not return directly, returns via rti, no return value. // // Registers Used: // // AT, v0. // //-- #define BREAK_DEBUG_UNLOAD_SYMBOLS \ ldil v0, DEBUG_UNLOAD_SYMBOLS_BREAKPOINT; \ call_pal callkd //++ // // BREAK_DEBUG_PRINT // // Macro Description: // // Cause a debug print breakpoint which will be interpreted by // the kernel debugger and will print a string to the kernel debugger // port. // // Mode: // // Kernel and User. // // Arguments: // // a0 - Supplies the address of ASCII string to print. // a1 - Supplies the length of the string to print. // // Return Value: // // Does not return directly, returns via rti, no return value. // // Registers Used: // // AT, v0. // //-- #define BREAK_DEBUG_PRINT \ ldil v0, DEBUG_PRINT_BREAKPOINT; \ call_pal callkd //++ // // BREAK_DEBUG_PROMPT // // Macro Description: // // Cause a debug print breakpoint which will be interpreted by // the kernel debugger and will receive a string from the kernel debugger // port after prompting for input. // // Mode: // // Kernel and User. // // Arguments: // // a0 - Supplies the address of ASCII string to print. // a1 - Supplies the length of the string to print. // a2 - Supplies the address of the buffer to receive the input string. // a3 - Supplies the maximum length of the input string. // // Return Value: // // Does not return directly, returns via rti, no return value. // // Registers Used: // // AT, v0. // //-- #define BREAK_DEBUG_PROMPT \ ldil v0, DEBUG_PROMPT_BREAKPOINT; \ call_pal callkd // // Define tb manipulation interfaces // //++ // // TB_INVALIDATE_ALL // // Macro Description: // // Invalidate all cached virtual address translations for the current // processor that are not fixed. // Some translations may be fixed in hardware and/or software and // these are not invalidated (eg. super-pages). // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // None. // // Registers Used: // // a0 - a3. // //-- #define TB_INVALIDATE_ALL call_pal tbia //++ // // TB_INVALIDATE_SINGLE // // Macro Description: // // Invalidate any cached virtual address translations for a single // virtual address. // // Note - it is legal for an implementation to invalidate more // translations that the single one specified. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the Virtual Address of the translation to invalidate. // // Return Value: // // None. // // Registers Used: // // a1 - a3. // //-- #define TB_INVALIDATE_SINGLE call_pal tbis //++ // // TB_INVALIDATE_MULTIPLE // // Macro Description: // // Invalidate any cached virtual address translations for the specified // set of virtual addresses. // // Note - it is legal for an implementation to invalidate more // translations than those specified. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies a pointer to the list of Virtual Addresses of the // translations to invalidate. // a1 - Supplies the count of Virtual Addresses in the list // // Return Value: // // None. // // Registers Used: // // a2. // //-- #define TB_INVALIDATE_MULTIPLE call_pal tbim //++ // // TB_INVALIDATE_SINGLE_ASN // // Macro Description: // // Invalidate any cached virtual address translations for a single // virtual address for the specified address space number. // // Note - it is legal for an implementation to invalidate more // translations that the single one specified. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the Virtual Address of the translation to invalidate. // // a1 - Supplies the Address Space Number of the translation to be // invalidated. // // Return Value: // // None. // // Registers Used: // // a1 - a3. // //-- #define TB_INVALIDATE_SINGLE_ASN call_pal tbisasn //++ // // TB_INVALIDATE_MULTIPLE_ASN // // Macro Description: // // Invalidate any cached virtual address translations for the specified // set of virtual addresses for the specified address space number. // // Note - it is legal for an implementation to invalidate more // translations than those specified. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies a pointer to the list of Virtual Addresses of the // translations to invalidate. // // a1 - Supplies the count of Virtual Addresses in the list // // a2 - Supplies the Address Space Number of the translation to be // invalidated. // // Return Value: // // None. // // Registers Used: // // a3. // //-- #define TB_INVALIDATE_MULTIPLE_ASN call_pal tbimasn //++ // // DATA_TB_INVALIDATE_SINGLE // // Macro Description: // // Invalidate data stream translations for a single virtual address. // // Note - it is legal for an implementation to invalidate more // translations that the single one specified. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the Virtual Address of the translation to invalidate. // // Return Value: // // None. // // Registers Used: // // a1 - a3. // //-- #define DATA_TB_INVALIDATE_SINGLE call_pal dtbis // // Define context switch interfaces // //++ // // SWAP_THREAD_CONTEXT // // Macro Description: // // // Change to a new thread context. This will mean a new kernel stack, // new current thread address and a new thread environment block. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the Virtual Address of new initial kernel stack. // a1 - Supplies the address of new thread object. // a2 - Supplies the address of new thread environment block. // a3 - Supplies the PFN of the new page directory if the process // is to be swapped, -1 otherwise. // a4 - Supplies the ASN of the new processor if the process is to // be swapped, undefined otherwise. // a5 - Supplies the ASN wrap indicator if the process is to be swapped, // undefined otherwise. // // Return Value: // // None. // // Registers Used: // // AT. // //-- #define SWAP_THREAD_CONTEXT call_pal swpctx //++ // // SWAP_PROCESS_CONTEXT // // Macro Description: // // Change from one process address space to another. // // Mode: // // Kernel only. // // Arguments: // // a0 - Supplies the Pfn of Page Directory for new address space. // a1 - Supplies the Address Space Number for new address space. // a2 - Supplies the ASN wrap indicator (0 = no wrap, non-zero = wrap). // // Return Value: // // None. // // Registers Used: // // AT, a3. // //-- #define SWAP_PROCESS_CONTEXT call_pal swpprocess // // Define access to DPC Active flag // //++ // // GET_DPC_ACTIVE_FLAG // // Macro Description: // // Return the DPC Active Flag for the current processor. // // Mode: // // Kernel only. // // Arguments: // // None. // // Return Value: // // v0 = DPC Active Flag // // Registers Used: // // AT. // //-- #ifdef NT_UP // // The DPC Active flag can be safely acquired from the PCR (there is only one). // #define GET_DPC_ACTIVE_FLAG \ GET_PROCESSOR_CONTROL_REGION_BASE; \ ldl v0, PcDpcRoutineActive(v0) #else // // Ensure that the DPC flag fetch is atomic. // #define GET_DPC_ACTIVE_FLAG \ DISABLE_INTERRUPTS; \ GET_PROCESSOR_CONTROL_REGION_BASE; \ ldl v0, PcDpcRoutineActive(v0); \ ENABLE_INTERRUPTS; #endif //NT_UP //++ // // SET_DPC_ACTIVE_FLAG // // Macro Description: // // Set the DPC Active Flag for the current processor. // // Mode: // // Kernel only. // // Arguments: // // a0 = Supplies the DPC Active Flag Value to set. // // Return Value: // // None. // // Registers Used: // // AT. // //-- #define SET_DPC_ACTIVE_FLAG \ .set noat; \ GET_PROCESSOR_CONTROL_REGION_BASE; \ stl a0, PcDpcRoutineActive(v0); \ .set at // // Define interfaces for generate trap // //++ // // GENERATE_TRAP // // Macro Description: // // Generate a trap. Code has discovered an exception condition // and wants to raise a trap to indicate the condition. Anticipated // for use by compilers for divide by zero, etc.. // // Mode: // // Kernel and User. // // Arguments: // // a0 = Supplies the trap number which identifies the exception. // // Return Value: // // Does not return, generates a trap to kernel mode, no return value. // // Registers Used: // // None. // //-- #define GENERATE_TRAP call_pal gentrap // // Define performance and debug interfaces. // //++ // // GET_INTERNAL_COUNTERS // // Macro Description: // // Read the internal processor event counters. The counter formats // and the events counted are processor implementation-dependent. // // N.B. - the counters will only be implemented for checked builds. // // Mode: // // Kernel. // // Arguments: // // a0 - Supplies the superpage 32 address of the buffer to receive // the counter data. The address must be quadword aligned. // // a1 - Supplies the length of the buffer allocated for the counters. // // Return Value: // // v0 - 0 is returned if the interface is not implemented. // If v0 <= a1 then v0 is the length of the data returned. // If v0 > a1 then v0 is the length of the processor implementation // counter record. // // Registers Used: // // AT, a2 - a3. // //-- #define GET_INTERNAL_COUNTERS call_pal rdcounters //++ // // GET_INTERNAL_PROCESSOR_STATE // // Macro Description: // // Read the internal processor state. The data values returned and // their format are processor implementation-dependent. // // Mode: // // Kernel. // // Arguments: // // a0 - Supplies the superpage 32 address of the buffer to receive // the processor state data. The address must be quadword aligned. // // a1 - Supplies the length of the buffer allocated for the state. // // Return Value: // // v0 - If v0 <= a1 then v0 is the length of the data returned. // If v0 > a1 then v0 is the length of the processor implementation // state record. // // Registers Used: // // AT, a2 - a3. // //-- #define GET_INTERNAL_PROCESSOR_STATE call_pal rdstate //++ // // WRITE_PERFORMANCE_COUNTERS // // Macro Description: // // Write the state of the internal processor performance counters. // The number of performance counters, the events they count, and their // usage is processor implementation-depedent. // // Mode: // // Kernel. // // Arguments: // // a0 - Supplies the number of the performance counter. // // a1 - Supplies a flag that indicates if the performance counter is // to be enabled or disabled (0 = disabled, non-zero = enabled). // // a2 - a5 - Supply processor implementation-dependent parameters. // // Return Value: // // v0 - 0 is returned if the operation is unsuccessful or the performance // counter does not exist. Otherwise, a non-zero value is returned. // // Registers Used: // // AT, a2 - a5. // //-- #define WRITE_PERFORMANCE_COUNTERS call_pal wrperfmon // // Define interfaces for controlling the state of machine checks. // //++ // // DRAIN_ABORTS // // Macro Description: // // Stall processor execution until all previous instructions have // executed to the point that any exceptions they may raise have been // signalled. // // Mode: // // Kernel. // // Arguments: // // None. // // Return Value: // // None. // // Registers Used: // // None. // //-- #define DRAIN_ABORTS call_pal draina //++ // // GET_MACHINE_CHECK_ERROR_SUMMARY // // Macro Description: // // Read the processor machine check error summary register. // // Mode: // // Kernel. // // Arguments: // // None. // // Return Value: // // v0 - The value of the MCES register. // // Registers Used: // // AT. // //-- #define GET_MACHINE_CHECK_ERROR_SUMMARY call_pal rdmces //++ // // WRITE_MACHINE_CHECK_ERROR_SUMMARY // // Macro Description: // // Write new values to the machine check error summary register. // // Mode: // // Kernel. // // Arguments: // // a0 - Supplies the values to write to the MCES register. // // Return Value: // // v0 - Previous value of the MCES register. // // Registers Used: // // AT, a1 - a3. // //-- #define WRITE_MACHINE_CHECK_ERROR_SUMMARY call_pal wrmces //++ // // LoadByte( // Register Value, // Offset(Register) Base // ) // // Macro Description: // // Loades the byte at the base address defined by the // offset + register expression Base into the register Value // // Arguments: // // Value - Supplies the string name of the destination register // // Base - Supplies the base address (as an offset(register) string) of // the source of the byte. // // Return Value: // // None. // // Registers Used: // // AT // //-- #define LoadByte( Value, Base ) \ .set noat; \ lda AT, Base; \ ldq_u Value, Base; \ extbl Value, AT, Value; \ .set at; //++ // // StoreByte( // Register Value, // Offset(Register) Base // ) // // Macro Description: // // Store the low byte of the register Value at the base address // defined by the offset + register expression Base. // // N.B. - This macro preserves longword granularity of accesses. // // Arguments: // // Value - Supplies the string name of the register containing the store // data. // // Base - Supplies the base address (as an offset(register) string) of // the destination of the store. // // Return Value: // // None. // // Registers Used: // // AT, t12. // //-- #define StoreByte( Value, Base ) \ .set noat; \ lda AT, Base; \ ldq_u t12, (AT); \ mskbl t12, AT, t12; \ insbl Value, AT, AT; \ bis t12, AT, t12; \ lda AT, Base; \ bic AT, 3, AT; \ extll t12, AT, t12; \ stl t12, 0(AT); \ .set at; //++ // // ZeroByte( // Offset(Register) Base // ) // // Macro Description: // // Zeroes the byte at the address defined by the offset + register // expression Base. // // N.B. - This macro preserves longword granularity of accesses. // // Arguments: // // Base - Supplies the base address (as an offset(register) string) of // the destination of the store. // // Return Value: // // None. // // Registers Used: // // AT, t12. // //-- #define ZeroByte( Base ) \ .set noat; \ lda AT, Base; \ ldq_u t12, (AT); \ mskbl t12, AT, t12; \ bic AT, 3, AT; \ extll t12, AT, t12; \ stl t12, (AT); \ .set at; //++ // // StoreByteAligned( // Register Value, // Offset(Register) Base // ) // // Macro Description: // // Store the low byte of the register Value at the base address // defined by the offset + register expression Base. This macro // is functionally equivalent to StoreByte, but it assumes that // Base is dword aligned and optimizes the generated code // based on the alignment of Offset. // // N.B. - This macro preserves longword granularity of accesses. // // Arguments: // // Value - Supplies the string name of the register containing the store // data. // // Base - Supplies the base address (as an offset(register) string) of // the destination of the store. // // Return Value: // // None. // // Registers Used: // // AT, t12. // //-- #define StoreByteAligned( Value, Offset, Base ) \ .set noat; \ ldl AT, Offset(Base); \ mskbl AT, 0, t12; \ bis t12, Value, AT; \ stl AT, Offset(Base); \ .set at; //++ // // ClearByteAligned( // Offset, // Base // ) // // Macro Description: // // Clears the byte at the location defined by the offset + register // expression Base. It assumes that Base is dword aligned and optimizes // the generated code based on the alignment of Offset. // // N.B. - This macro preserves longword granularity of accesses. // // Arguments: // // Offset - Supplies the offset of the destination of the store. // // Base - Supplies the base address of the destination of the store. // // Return Value: // // None. // // Registers Used: // // AT, t12. // //-- #define ZeroByteAligned( Offset, Base ) \ .set noat; \ ldl AT, Offset(Base); \ mskbl AT, 0, t12; \ stl t12, Offset(Base); \ .set at; //++ // // StoreWord( // Register Value, // Offset(Register) Base // ) // // Macro Description: // // Store the word of the register Value at the word aligned base address // defined by the offset + register expression Base. // // N.B. - This macro preserves longword granularity of accesses. // // N.B. - The destination must be word-aligned. // // Arguments: // // Value - Supplies the string name of the register containing the store // data. // // Base - Supplies the base address (as an offset(register) string) of // the destination of the store. // // Return Value: // // None. // // Registers Used: // // AT, t12. // //-- #define StoreWord( Value, Base ) \ .set noat; \ lda AT, Base; \ ldq_u t12, (AT); \ mskwl t12, AT, t12; \ inswl Value, AT, AT; \ bis t12, AT, t12; \ lda AT, Base; \ bic AT, 3, AT; \ extll t12, AT, t12; \ stl t12, 0(AT); \ .set at; // // Define subtitle macro // #define SBTTL(x) // // Define mnemonic for writing callpal in assembly language that will // fit in the opcode field. // #define callpal call_pal // // Define exception data section and align. // // Nearly all source files that include this header file need the following // few pseudo-ops and so, by default, they are placed once here rather than // repeated in every source file. If these pseudo-ops are not needed, then // define HEADER_FILE prior to including this file. // // Also the PALCODE environment uses this include file but cannot use // these definitions. // #if !defined(HEADER_FILE) && !defined(PALCODE) .edata 0 .align 2 .text #endif