|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved.
23: *
24: * File: architecture/i386/reg_help.h
25: * Author: Mike DeMoney, NeXT Computer, Inc.
26: * Modified for i386 by: Bruce Martin, NeXT Computer, Inc.
27: *
28: * This header file defines cpp macros useful for defining
29: * machine register and doing machine-level operations.
30: *
31: * HISTORY
32: * 10-Mar-92 Bruce Martin ([email protected])
33: * Adapted to i386
34: * 23-Jan-91 Mike DeMoney ([email protected])
35: * Created.
36: */
37:
38: #ifndef _ARCH_I386_REG_HELP_H_
39: #define _ARCH_I386_REG_HELP_H_
40:
41: /* Bitfield definition aid */
42: #define BITS_WIDTH(msb, lsb) ((msb)-(lsb)+1)
43: #define BIT_WIDTH(pos) (1) /* mostly to record the position */
44:
45: /* Mask creation */
46: #define MKMASK(width, offset) (((unsigned)-1)>>(32-(width))<<(offset))
47: #define BITSMASK(msb, lsb) MKMASK(BITS_WIDTH(msb, lsb), lsb & 0x1f)
48: #define BITMASK(pos) MKMASK(BIT_WIDTH(pos), pos & 0x1f)
49:
50: /* Register addresses */
51: #if __ASSEMBLER__
52: # define REG_ADDR(type, addr) (addr)
53: #else /* __ASSEMBLER__ */
54: # define REG_ADDR(type, addr) (*(volatile type *)(addr))
55: #endif /* __ASSEMBLER__ */
56:
57: /* Cast a register to be an unsigned */
58: #define CONTENTS(foo) (*(unsigned *) &(foo))
59:
60: /* Stack pointer must always be a multiple of 4 */
61: #define STACK_INCR 4
62: #define ROUND_FRAME(x) ((((unsigned)(x)) + STACK_INCR - 1) & ~(STACK_INCR-1))
63:
64: /* STRINGIFY -- perform all possible substitutions, then stringify */
65: #define __STR(x) #x /* just a helper macro */
66: #define STRINGIFY(x) __STR(x)
67:
68: /*
69: * REG_PAIR_DEF -- define a register pair
70: * Register pairs are appropriately aligned to allow access via
71: * ld.d and st.d.
72: *
73: * Usage:
74: * struct foo {
75: * REG_PAIR_DEF(
76: * bar_t *, barp,
77: * afu_t, afu
78: * );
79: * };
80: *
81: * Access to individual entries of the pair is via the REG_PAIR
82: * macro (below).
83: */
84: #define REG_PAIR_DEF(type0, name0, type1, name1) \
85: struct { \
86: type0 name0 __attribute__(( aligned(8) )); \
87: type1 name1; \
88: } name0##_##name1
89:
90: /*
91: * REG_PAIR -- Macro to define names for accessing individual registers
92: * of register pairs.
93: *
94: * Usage:
95: * arg0 is first element of pair
96: * arg1 is second element of pair
97: * arg2 is desired element of pair
98: * eg:
99: * #define foo_barp REG_PAIR(barp, afu, afu)
100: */
101: #define REG_PAIR(name0, name1, the_name) \
102: name0##_##name1.the_name
103:
104: #endif /* _ARCH_I386_REG_HELP_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.