* Read address at location and return updated location. */
(loc, short_addr, rex, regmodrm, addrp)
| 1045 | * Read address at location and return updated location. |
| 1046 | */ |
| 1047 | static db_addr_t |
| 1048 | db_read_address(loc, short_addr, rex, regmodrm, addrp) |
| 1049 | db_addr_t loc; |
| 1050 | int short_addr; |
| 1051 | int rex; |
| 1052 | int regmodrm; |
| 1053 | struct i_addr * addrp; /* out */ |
| 1054 | { |
| 1055 | int mod, rm, sib, index, disp, size, have_sib; |
| 1056 | |
| 1057 | mod = f_mod(rex, regmodrm); |
| 1058 | rm = f_rm(rex, regmodrm); |
| 1059 | |
| 1060 | if (mod == 3) { |
| 1061 | addrp->is_reg = TRUE; |
| 1062 | addrp->disp = rm; |
| 1063 | return (loc); |
| 1064 | } |
| 1065 | addrp->is_reg = FALSE; |
| 1066 | addrp->index = NULL; |
| 1067 | |
| 1068 | if (short_addr) |
| 1069 | size = LONG; |
| 1070 | else |
| 1071 | size = QUAD; |
| 1072 | |
| 1073 | if ((rm & 0x7) == 4) { |
| 1074 | get_value_inc(sib, loc, 1, FALSE); |
| 1075 | rm = sib_base(rex, sib); |
| 1076 | index = sib_index(rex, sib); |
| 1077 | if (index != 4) |
| 1078 | addrp->index = db_reg[1][size][index]; |
| 1079 | addrp->ss = sib_ss(rex, sib); |
| 1080 | have_sib = 1; |
| 1081 | } else |
| 1082 | have_sib = 0; |
| 1083 | |
| 1084 | switch (mod) { |
| 1085 | case 0: |
| 1086 | if (rm == 5) { |
| 1087 | get_value_inc(addrp->disp, loc, 4, FALSE); |
| 1088 | if (have_sib) |
| 1089 | addrp->base = NULL; |
| 1090 | else if (short_addr) |
| 1091 | addrp->base = "%eip"; |
| 1092 | else |
| 1093 | addrp->base = "%rip"; |
| 1094 | } else { |
| 1095 | addrp->disp = 0; |
| 1096 | addrp->base = db_reg[1][size][rm]; |
| 1097 | } |
| 1098 | break; |
| 1099 | |
| 1100 | case 1: |
| 1101 | get_value_inc(disp, loc, 1, TRUE); |
| 1102 | addrp->disp = disp; |
| 1103 | addrp->base = db_reg[1][size][rm]; |
| 1104 | break; |
no outgoing calls
no test coverage detected