|
|
1.1.1.2 ! root 1: /* 1.1 root 2: * Mach Operating System 3: * Copyright (c) 1991,1990 Carnegie Mellon University 4: * All Rights Reserved. 1.1.1.2 ! root 5: * 1.1 root 6: * Permission to use, copy, modify and distribute this software and its 7: * documentation is hereby granted, provided that both the copyright 8: * notice and this permission notice appear in all copies of the 9: * software, derivative works or modified versions, and any portions 10: * thereof, and that both notices appear in supporting documentation. 1.1.1.2 ! root 11: * 1.1 root 12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 1.1.1.2 ! root 15: * 1.1 root 16: * Carnegie Mellon requests users of this software to return to 1.1.1.2 ! root 17: * 1.1 root 18: * Software Distribution Coordinator or [email protected] 19: * School of Computer Science 20: * Carnegie Mellon University 21: * Pittsburgh PA 15213-3890 1.1.1.2 ! root 22: * 1.1 root 23: * any improvements or extensions that they make and grant Carnegie Mellon 24: * the rights to redistribute these changes. 25: */ 26: /* 27: * Author: David B. Golub, Carnegie Mellon University 28: * Date: 7/90 29: */ 30: #include "mach_kdb.h" 31: #if MACH_KDB 32: 33: #include <mach/boolean.h> 34: #include <machine/db_machdep.h> 35: #include <ddb/db_lex.h> 36: #include <ddb/db_access.h> 37: #include <ddb/db_command.h> 38: #include <kern/task.h> 39: 40: 41: boolean_t 42: db_term(valuep) 43: db_expr_t *valuep; 44: { 45: int t; 46: 47: switch(t = db_read_token()) { 48: case tIDENT: 49: if (!db_value_of_name(db_tok_string, valuep)) { 50: db_printf("Symbol \"%s\" not found\n", db_tok_string); 51: db_error(0); 52: /*NOTREACHED*/ 53: } 54: return (TRUE); 55: case tNUMBER: 56: *valuep = db_tok_number; 57: return (TRUE); 58: case tDOT: 59: *valuep = (db_expr_t)db_dot; 60: return (TRUE); 61: case tDOTDOT: 62: *valuep = (db_expr_t)db_prev; 63: return (TRUE); 64: case tPLUS: 65: *valuep = (db_expr_t) db_next; 66: return (TRUE); 67: case tQUOTE: 68: *valuep = (db_expr_t)db_last_addr; 69: return (TRUE); 70: case tDOLLAR: 71: if (!db_get_variable(valuep)) 72: return (FALSE); 73: return (TRUE); 74: case tLPAREN: 75: if (!db_expression(valuep)) { 76: db_error("Unmached ()s\n"); 77: /*NOTREACHED*/ 78: } 79: t = db_read_token(); 80: if (t != tRPAREN) { 81: db_printf("')' expected at \"%s...\"\n", db_tok_string); 82: db_error(0); 83: /*NOTREACHED*/ 84: } 85: return (TRUE); 86: default: 87: db_unread_token(t); 88: return (FALSE); 89: } 90: } 91: 92: int 93: db_size_option(modif, u_option, t_option) 94: char *modif; 95: boolean_t *u_option; 96: boolean_t *t_option; 97: { 98: register char *p; 99: int size = sizeof(int); 100: 101: *u_option = FALSE; 102: *t_option = FALSE; 103: for (p = modif; *p; p++) { 104: switch(*p) { 105: case 'b': 106: size = sizeof(char); 107: break; 108: case 'h': 109: size = sizeof(short); 110: break; 111: case 'l': 112: size = sizeof(long); 113: break; 114: case 'u': 115: *u_option = TRUE; 116: break; 117: case 't': 118: *t_option = TRUE; 119: break; 120: } 121: } 122: return(size); 123: } 124: 125: boolean_t 126: db_unary(valuep) 127: db_expr_t *valuep; 128: { 129: int t; 130: int size; 131: boolean_t u_opt, t_opt; 132: task_t task; 133: extern task_t db_default_task; 134: 135: t = db_read_token(); 136: if (t == tMINUS) { 137: if (!db_unary(valuep)) { 138: db_error("Expression syntax error after '-'\n"); 139: /*NOTREACHED*/ 140: } 141: *valuep = -*valuep; 142: return (TRUE); 143: } 144: if (t == tSTAR) { 145: /* indirection */ 146: if (!db_unary(valuep)) { 147: db_error("Expression syntax error after '*'\n"); 148: /*NOTREACHED*/ 149: } 150: task = TASK_NULL; 151: size = sizeof(db_addr_t); 152: u_opt = FALSE; 153: t = db_read_token(); 154: if (t == tIDENT && db_tok_string[0] == ':') { 155: size = db_size_option(&db_tok_string[1], &u_opt, &t_opt); 156: if (t_opt) 157: task = db_default_task; 158: } else 159: db_unread_token(t); 160: *valuep = db_get_task_value((db_addr_t)*valuep, size, !u_opt, task); 161: return (TRUE); 162: } 163: if (t == tEXCL) { 164: if (!db_unary(valuep)) { 165: db_error("Expression syntax error after '!'\n"); 166: /*NOTREACHED*/ 167: } 168: *valuep = (!(*valuep)); 169: return (TRUE); 170: } 171: db_unread_token(t); 172: return (db_term(valuep)); 173: } 174: 175: boolean_t 176: db_mult_expr(valuep) 177: db_expr_t *valuep; 178: { 179: db_expr_t lhs, rhs; 180: int t; 181: char c; 182: 183: if (!db_unary(&lhs)) 184: return (FALSE); 185: 186: t = db_read_token(); 187: while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH 188: || t == tBIT_AND) { 189: c = db_tok_string[0]; 190: if (!db_term(&rhs)) { 191: db_printf("Expression syntax error after '%c'\n", c); 192: db_error(0); 193: /*NOTREACHED*/ 194: } 195: switch(t) { 196: case tSTAR: 197: lhs *= rhs; 198: break; 199: case tBIT_AND: 200: lhs &= rhs; 201: break; 202: default: 203: if (rhs == 0) { 204: db_error("Divide by 0\n"); 205: /*NOTREACHED*/ 206: } 207: if (t == tSLASH) 208: lhs /= rhs; 209: else if (t == tPCT) 210: lhs %= rhs; 211: else 212: lhs = ((lhs+rhs-1)/rhs)*rhs; 213: } 214: t = db_read_token(); 215: } 216: db_unread_token(t); 217: *valuep = lhs; 218: return (TRUE); 219: } 220: 221: boolean_t 222: db_add_expr(valuep) 223: db_expr_t *valuep; 224: { 225: db_expr_t lhs, rhs; 226: int t; 227: char c; 228: 229: if (!db_mult_expr(&lhs)) 230: return (FALSE); 231: 232: t = db_read_token(); 233: while (t == tPLUS || t == tMINUS || t == tBIT_OR) { 234: c = db_tok_string[0]; 235: if (!db_mult_expr(&rhs)) { 236: db_printf("Expression syntax error after '%c'\n", c); 237: db_error(0); 238: /*NOTREACHED*/ 239: } 240: if (t == tPLUS) 241: lhs += rhs; 242: else if (t == tMINUS) 243: lhs -= rhs; 244: else 245: lhs |= rhs; 246: t = db_read_token(); 247: } 248: db_unread_token(t); 249: *valuep = lhs; 250: return (TRUE); 251: } 252: 253: boolean_t 254: db_shift_expr(valuep) 255: db_expr_t *valuep; 256: { 257: db_expr_t lhs, rhs; 258: int t; 259: 260: if (!db_add_expr(&lhs)) 261: return (FALSE); 262: 263: t = db_read_token(); 264: while (t == tSHIFT_L || t == tSHIFT_R) { 265: if (!db_add_expr(&rhs)) { 266: db_printf("Expression syntax error after \"%s\"\n", 267: (t == tSHIFT_L)? "<<": ">>"); 268: db_error(0); 269: /*NOTREACHED*/ 270: } 271: if (rhs < 0) { 272: db_error("Negative shift amount\n"); 273: /*NOTREACHED*/ 274: } 275: if (t == tSHIFT_L) 276: lhs <<= rhs; 277: else { 278: /* Shift right is unsigned */ 279: lhs = (natural_t) lhs >> rhs; 280: } 281: t = db_read_token(); 282: } 283: db_unread_token(t); 284: *valuep = lhs; 285: return (TRUE); 286: } 287: 288: boolean_t 289: db_logical_relation_expr(valuep) 290: db_expr_t *valuep; 291: { 292: db_expr_t lhs, rhs; 293: int t; 294: char op[3]; 295: 296: if (!db_shift_expr(&lhs)) 297: return(FALSE); 298: 299: t = db_read_token(); 300: while (t == tLOG_EQ || t == tLOG_NOT_EQ 301: || t == tGREATER || t == tGREATER_EQ 302: || t == tLESS || t == tLESS_EQ) { 303: op[0] = db_tok_string[0]; 304: op[1] = db_tok_string[1]; 305: op[2] = 0; 306: if (!db_shift_expr(&rhs)) { 307: db_printf("Expression syntax error after \"%s\"\n", op); 308: db_error(0); 309: /*NOTREACHED*/ 310: } 311: switch(t) { 312: case tLOG_EQ: 313: lhs = (lhs == rhs); 314: break; 315: case tLOG_NOT_EQ: 316: lhs = (lhs != rhs); 317: break; 318: case tGREATER: 319: lhs = (lhs > rhs); 320: break; 321: case tGREATER_EQ: 322: lhs = (lhs >= rhs); 323: break; 324: case tLESS: 325: lhs = (lhs < rhs); 326: break; 327: case tLESS_EQ: 328: lhs = (lhs <= rhs); 329: break; 330: } 331: t = db_read_token(); 332: } 333: db_unread_token(t); 334: *valuep = lhs; 335: return (TRUE); 336: } 337: 338: boolean_t 339: db_logical_and_expr(valuep) 340: db_expr_t *valuep; 341: { 342: db_expr_t lhs, rhs; 343: int t; 344: 345: if (!db_logical_relation_expr(&lhs)) 346: return(FALSE); 347: 348: t = db_read_token(); 349: while (t == tLOG_AND) { 350: if (!db_logical_relation_expr(&rhs)) { 351: db_error("Expression syntax error after \"&&\"\n"); 352: /*NOTREACHED*/ 353: } 354: lhs = (lhs && rhs); 355: } 356: db_unread_token(t); 357: *valuep = lhs; 358: return (TRUE); 359: } 360: 361: boolean_t 362: db_logical_or_expr(valuep) 363: db_expr_t *valuep; 364: { 365: db_expr_t lhs, rhs; 366: int t; 367: 368: if (!db_logical_and_expr(&lhs)) 369: return(FALSE); 370: 371: t = db_read_token(); 372: while (t == tLOG_OR) { 373: if (!db_logical_and_expr(&rhs)) { 374: db_error("Expression syntax error after \"||\"\n"); 375: /*NOTREACHED*/ 376: } 377: lhs = (lhs || rhs); 378: } 379: db_unread_token(t); 380: *valuep = lhs; 381: return (TRUE); 382: } 383: 384: int 385: db_expression(valuep) 386: db_expr_t *valuep; 387: { 388: return (db_logical_or_expr(valuep)); 389: } 390: 1.1.1.2 ! root 391: #endif /* MACH_KDB */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.