ProcAddress.java revision 9883:903a2e023ffb
1132451Sroberto/* 2132451Sroberto * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. 3200576Sroberto * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4132451Sroberto * 5200576Sroberto * This code is free software; you can redistribute it and/or modify it 6200576Sroberto * under the terms of the GNU General Public License version 2 only, as 7200576Sroberto * published by the Free Software Foundation. 8200576Sroberto * 9200576Sroberto * This code is distributed in the hope that it will be useful, but WITHOUT 10200576Sroberto * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11132451Sroberto * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12132451Sroberto * version 2 for more details (a copy is included in the LICENSE file that 13200576Sroberto * accompanied this code). 14200576Sroberto * 15200576Sroberto * You should have received a copy of the GNU General Public License version 16132451Sroberto * 2 along with this work; if not, write to the Free Software Foundation, 17200576Sroberto * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18200576Sroberto * 19200576Sroberto * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20132451Sroberto * or visit www.oracle.com if you need additional information or have any 21132451Sroberto * questions. 22200576Sroberto * 23132451Sroberto */ 24132451Sroberto 25200576Srobertopackage sun.jvm.hotspot.debugger.proc; 26200576Sroberto 27200576Srobertoimport sun.jvm.hotspot.debugger.*; 28200576Sroberto 29200576Srobertoclass ProcAddress implements Address { 30200576Sroberto protected ProcDebugger debugger; 31200576Sroberto protected long addr; 32200576Sroberto 33132451Sroberto ProcAddress(ProcDebugger debugger, long addr) { 34132451Sroberto this.debugger = debugger; 35200576Sroberto this.addr = addr; 36200576Sroberto } 37200576Sroberto 38200576Sroberto // 39200576Sroberto // Basic Java routines 40200576Sroberto // 41200576Sroberto 42200576Sroberto public boolean equals(Object arg) { 43200576Sroberto if (arg == null) { 44200576Sroberto return false; 45200576Sroberto } 46200576Sroberto 47200576Sroberto if (!(arg instanceof ProcAddress)) { 48200576Sroberto return false; 49200576Sroberto } 50200576Sroberto 51200576Sroberto return (addr == ((ProcAddress) arg).addr); 52132451Sroberto } 53200576Sroberto 54200576Sroberto public int hashCode() { 55200576Sroberto // FIXME: suggestions on a better hash code? 56200576Sroberto return (int) addr; 57200576Sroberto } 58200576Sroberto 59200576Sroberto public String toString() { 60200576Sroberto return debugger.addressValueToString(addr); 61200576Sroberto } 62200576Sroberto 63200576Sroberto // 64200576Sroberto // C/C++-related routines 65200576Sroberto // 66200576Sroberto 67200576Sroberto public long getCIntegerAt(long offset, long numBytes, boolean isUnsigned) throws UnalignedAddressException, UnmappedAddressException { 68200576Sroberto return debugger.readCInteger(addr + offset, numBytes, isUnsigned); 69200576Sroberto } 70200576Sroberto 71200576Sroberto public Address getAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 72132451Sroberto return debugger.readAddress(addr + offset); 73132451Sroberto } 74200576Sroberto 75200576Sroberto public Address getCompOopAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 76200576Sroberto return debugger.readCompOopAddress(addr + offset); 77200576Sroberto } 78200576Sroberto 79200576Sroberto public Address getCompKlassAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 80200576Sroberto return debugger.readCompKlassAddress(addr + offset); 81200576Sroberto } 82132451Sroberto 83200576Sroberto // 84200576Sroberto // Java-related routines 85200576Sroberto // 86200576Sroberto 87200576Sroberto public boolean getJBooleanAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 88200576Sroberto return debugger.readJBoolean(addr + offset); 89200576Sroberto } 90200576Sroberto 91200576Sroberto public byte getJByteAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 92200576Sroberto return debugger.readJByte(addr + offset); 93200576Sroberto } 94200576Sroberto 95200576Sroberto public char getJCharAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 96200576Sroberto return debugger.readJChar(addr + offset); 97200576Sroberto } 98200576Sroberto 99200576Sroberto public double getJDoubleAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 100200576Sroberto return debugger.readJDouble(addr + offset); 101200576Sroberto } 102200576Sroberto 103200576Sroberto public float getJFloatAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 104200576Sroberto return debugger.readJFloat(addr + offset); 105200576Sroberto } 106200576Sroberto 107200576Sroberto public int getJIntAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 108200576Sroberto return debugger.readJInt(addr + offset); 109200576Sroberto } 110200576Sroberto 111200576Sroberto public long getJLongAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 112200576Sroberto return debugger.readJLong(addr + offset); 113200576Sroberto } 114200576Sroberto 115200576Sroberto public short getJShortAt(long offset) throws UnalignedAddressException, UnmappedAddressException { 116200576Sroberto return debugger.readJShort(addr + offset); 117200576Sroberto } 118200576Sroberto 119200576Sroberto public OopHandle getOopHandleAt(long offset) 120200576Sroberto throws UnalignedAddressException, UnmappedAddressException, NotInHeapException { 121200576Sroberto return debugger.readOopHandle(addr + offset); 122200576Sroberto } 123132451Sroberto public OopHandle getCompOopHandleAt(long offset) 124132451Sroberto throws UnalignedAddressException, UnmappedAddressException, NotInHeapException { 125132451Sroberto return debugger.readCompOopHandle(addr + offset); 126132451Sroberto } 127132451Sroberto 128200576Sroberto // Mutators -- not implemented for now (FIXME) 129200576Sroberto public void setCIntegerAt(long offset, long numBytes, long value) { 130200576Sroberto throw new DebuggerException("Unimplemented"); 131200576Sroberto } 132200576Sroberto public void setAddressAt(long offset, Address value) { 133200576Sroberto throw new DebuggerException("Unimplemented"); 134200576Sroberto } 135200576Sroberto public void setJBooleanAt (long offset, boolean value) 136200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 137200576Sroberto throw new DebuggerException("Unimplemented"); 138200576Sroberto } 139200576Sroberto public void setJByteAt (long offset, byte value) 140200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 141200576Sroberto throw new DebuggerException("Unimplemented"); 142200576Sroberto } 143200576Sroberto public void setJCharAt (long offset, char value) 144200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 145200576Sroberto throw new DebuggerException("Unimplemented"); 146200576Sroberto } 147200576Sroberto public void setJDoubleAt (long offset, double value) 148200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 149200576Sroberto throw new DebuggerException("Unimplemented"); 150200576Sroberto } 151200576Sroberto public void setJFloatAt (long offset, float value) 152200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 153200576Sroberto throw new DebuggerException("Unimplemented"); 154200576Sroberto } 155200576Sroberto public void setJIntAt (long offset, int value) 156200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 157200576Sroberto throw new DebuggerException("Unimplemented"); 158200576Sroberto } 159200576Sroberto public void setJLongAt (long offset, long value) 160200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 161200576Sroberto throw new DebuggerException("Unimplemented"); 162200576Sroberto } 163200576Sroberto public void setJShortAt (long offset, short value) 164200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 165200576Sroberto throw new DebuggerException("Unimplemented"); 166200576Sroberto } 167200576Sroberto public void setOopHandleAt (long offset, OopHandle value) 168200576Sroberto throws UnmappedAddressException, UnalignedAddressException { 169200576Sroberto throw new DebuggerException("Unimplemented"); 170200576Sroberto } 171200576Sroberto 172200576Sroberto // 173200576Sroberto // Arithmetic operations -- necessary evil. 174200576Sroberto // 175200576Sroberto 176200576Sroberto public Address addOffsetTo (long offset) throws UnsupportedOperationException { 177200576Sroberto long value = addr + offset; 178200576Sroberto if (value == 0) { 179200576Sroberto return null; 180200576Sroberto } 181200576Sroberto return new ProcAddress(debugger, value); 182200576Sroberto } 183200576Sroberto 184200576Sroberto public OopHandle addOffsetToAsOopHandle(long offset) throws UnsupportedOperationException { 185200576Sroberto long value = addr + offset; 186132451Sroberto if (value == 0) { 187200576Sroberto return null; 188200576Sroberto } 189200576Sroberto return new ProcOopHandle(debugger, value); 190200576Sroberto } 191200576Sroberto 192200576Sroberto /** (FIXME: any signed/unsigned issues? Should this work for 193200576Sroberto OopHandles?) */ 194200576Sroberto public long minus(Address arg) { 195200576Sroberto if (arg == null) { 196200576Sroberto return addr; 197200576Sroberto } 198200576Sroberto return addr - ((ProcAddress) arg).addr; 199200576Sroberto } 200200576Sroberto 201200576Sroberto // Two's complement representation. 202200576Sroberto // All negative numbers are larger than positive numbers. 203200576Sroberto // Numbers with the same sign can be compared normally. 204200576Sroberto // Test harness is below in main(). 205200576Sroberto 206200576Sroberto public boolean lessThan (Address arg) { 207200576Sroberto if (arg == null) { 208200576Sroberto return false; 209200576Sroberto } 210200576Sroberto ProcAddress dbxArg = (ProcAddress) arg; 211200576Sroberto if ((addr >= 0) && (dbxArg.addr < 0)) { 212200576Sroberto return true; 213200576Sroberto } 214200576Sroberto if ((addr < 0) && (dbxArg.addr >= 0)) { 215200576Sroberto return false; 216200576Sroberto } 217200576Sroberto return (addr < dbxArg.addr); 218200576Sroberto } 219200576Sroberto 220200576Sroberto public boolean lessThanOrEqual (Address arg) { 221200576Sroberto if (arg == null) { 222200576Sroberto return false; 223200576Sroberto } 224200576Sroberto ProcAddress dbxArg = (ProcAddress) arg; 225200576Sroberto if ((addr >= 0) && (dbxArg.addr < 0)) { 226200576Sroberto return true; 227200576Sroberto } 228200576Sroberto if ((addr < 0) && (dbxArg.addr >= 0)) { 229200576Sroberto return false; 230132451Sroberto } 231200576Sroberto return (addr <= dbxArg.addr); 232200576Sroberto } 233200576Sroberto 234200576Sroberto public boolean greaterThan (Address arg) { 235132451Sroberto if (arg == null) { 236200576Sroberto return true; 237200576Sroberto } 238200576Sroberto ProcAddress dbxArg = (ProcAddress) arg; 239200576Sroberto if ((addr >= 0) && (dbxArg.addr < 0)) { 240200576Sroberto return false; 241200576Sroberto } 242200576Sroberto if ((addr < 0) && (dbxArg.addr >= 0)) { 243200576Sroberto return true; 244200576Sroberto } 245132451Sroberto return (addr > dbxArg.addr); 246200576Sroberto } 247200576Sroberto 248200576Sroberto public boolean greaterThanOrEqual(Address arg) { 249200576Sroberto if (arg == null) { 250200576Sroberto return true; 251200576Sroberto } 252200576Sroberto ProcAddress dbxArg = (ProcAddress) arg; 253200576Sroberto if ((addr >= 0) && (dbxArg.addr < 0)) { 254200576Sroberto return false; 255200576Sroberto } 256200576Sroberto if ((addr < 0) && (dbxArg.addr >= 0)) { 257200576Sroberto return true; 258200576Sroberto } 259200576Sroberto return (addr >= dbxArg.addr); 260200576Sroberto } 261200576Sroberto 262200576Sroberto public Address andWithMask(long mask) throws UnsupportedOperationException { 263200576Sroberto long value = addr & mask; 264200576Sroberto if (value == 0) { 265200576Sroberto return null; 266200576Sroberto } 267200576Sroberto return new ProcAddress(debugger, value); 268200576Sroberto } 269200576Sroberto 270200576Sroberto public Address orWithMask(long mask) throws UnsupportedOperationException { 271200576Sroberto long value = addr | mask; 272200576Sroberto if (value == 0) { 273200576Sroberto return null; 274200576Sroberto } 275200576Sroberto return new ProcAddress(debugger, value); 276200576Sroberto } 277200576Sroberto 278200576Sroberto public Address xorWithMask(long mask) throws UnsupportedOperationException { 279200576Sroberto long value = addr ^ mask; 280200576Sroberto if (value == 0) { 281200576Sroberto return null; 282200576Sroberto } 283200576Sroberto return new ProcAddress(debugger, value); 284200576Sroberto } 285200576Sroberto 286200576Sroberto public long asLongValue() { return addr; } 287200576Sroberto //-------------------------------------------------------------------------------- 288200576Sroberto // Internals only below this point 289200576Sroberto // 290200576Sroberto 291200576Sroberto long getValue() { 292200576Sroberto return addr; 293200576Sroberto } 294200576Sroberto 295200576Sroberto 296200576Sroberto private static void check(boolean arg, String failMessage) { 297200576Sroberto if (!arg) { 298200576Sroberto System.err.println(failMessage + ": FAILED"); 299200576Sroberto System.exit(1); 300200576Sroberto } 301200576Sroberto } 302200576Sroberto 303200576Sroberto // Test harness 304200576Sroberto public static void main(String[] args) { 305200576Sroberto // p/n indicates whether the interior address is really positive 306200576Sroberto // or negative. In unsigned terms, p1 < p2 < n1 < n2. 307200576Sroberto 308200576Sroberto ProcAddress p1 = new ProcAddress(null, 0x7FFFFFFFFFFFFFF0L); 309200576Sroberto ProcAddress p2 = (ProcAddress) p1.addOffsetTo(10); 310200576Sroberto ProcAddress n1 = (ProcAddress) p2.addOffsetTo(10); 311200576Sroberto ProcAddress n2 = (ProcAddress) n1.addOffsetTo(10); 312200576Sroberto 313200576Sroberto // lessThan positive tests 314200576Sroberto check(p1.lessThan(p2), "lessThan 1"); 315200576Sroberto check(p1.lessThan(n1), "lessThan 2"); 316200576Sroberto check(p1.lessThan(n2), "lessThan 3"); 317200576Sroberto check(p2.lessThan(n1), "lessThan 4"); 318200576Sroberto check(p2.lessThan(n2), "lessThan 5"); 319200576Sroberto check(n1.lessThan(n2), "lessThan 6"); 320200576Sroberto 321200576Sroberto // lessThan negative tests 322200576Sroberto check(!p1.lessThan(p1), "lessThan 7"); 323200576Sroberto check(!p2.lessThan(p2), "lessThan 8"); 324200576Sroberto check(!n1.lessThan(n1), "lessThan 9"); 325200576Sroberto check(!n2.lessThan(n2), "lessThan 10"); 326200576Sroberto 327200576Sroberto check(!p2.lessThan(p1), "lessThan 11"); 328200576Sroberto check(!n1.lessThan(p1), "lessThan 12"); 329200576Sroberto check(!n2.lessThan(p1), "lessThan 13"); 330200576Sroberto check(!n1.lessThan(p2), "lessThan 14"); 331200576Sroberto check(!n2.lessThan(p2), "lessThan 15"); 332200576Sroberto check(!n2.lessThan(n1), "lessThan 16"); 333200576Sroberto 334200576Sroberto // lessThanOrEqual positive tests 335200576Sroberto check(p1.lessThanOrEqual(p1), "lessThanOrEqual 1"); 336200576Sroberto check(p2.lessThanOrEqual(p2), "lessThanOrEqual 2"); 337200576Sroberto check(n1.lessThanOrEqual(n1), "lessThanOrEqual 3"); 338200576Sroberto check(n2.lessThanOrEqual(n2), "lessThanOrEqual 4"); 339200576Sroberto 340200576Sroberto check(p1.lessThanOrEqual(p2), "lessThanOrEqual 5"); 341200576Sroberto check(p1.lessThanOrEqual(n1), "lessThanOrEqual 6"); 342200576Sroberto check(p1.lessThanOrEqual(n2), "lessThanOrEqual 7"); 343200576Sroberto check(p2.lessThanOrEqual(n1), "lessThanOrEqual 8"); 344200576Sroberto check(p2.lessThanOrEqual(n2), "lessThanOrEqual 9"); 345200576Sroberto check(n1.lessThanOrEqual(n2), "lessThanOrEqual 10"); 346200576Sroberto 347200576Sroberto // lessThanOrEqual negative tests 348200576Sroberto check(!p2.lessThanOrEqual(p1), "lessThanOrEqual 11"); 349200576Sroberto check(!n1.lessThanOrEqual(p1), "lessThanOrEqual 12"); 350200576Sroberto check(!n2.lessThanOrEqual(p1), "lessThanOrEqual 13"); 351200576Sroberto check(!n1.lessThanOrEqual(p2), "lessThanOrEqual 14"); 352200576Sroberto check(!n2.lessThanOrEqual(p2), "lessThanOrEqual 15"); 353200576Sroberto check(!n2.lessThanOrEqual(n1), "lessThanOrEqual 16"); 354200576Sroberto 355200576Sroberto // greaterThan positive tests 356200576Sroberto check(n2.greaterThan(p1), "greaterThan 1"); 357200576Sroberto check(n2.greaterThan(p2), "greaterThan 2"); 358200576Sroberto check(n2.greaterThan(n1), "greaterThan 3"); 359200576Sroberto check(n1.greaterThan(p1), "greaterThan 4"); 360200576Sroberto check(n1.greaterThan(p2), "greaterThan 5"); 361200576Sroberto check(p2.greaterThan(p1), "greaterThan 6"); 362200576Sroberto 363200576Sroberto // greaterThan negative tests 364200576Sroberto check(!p1.greaterThan(p1), "greaterThan 7"); 365200576Sroberto check(!p2.greaterThan(p2), "greaterThan 8"); 366200576Sroberto check(!n1.greaterThan(n1), "greaterThan 9"); 367200576Sroberto check(!n2.greaterThan(n2), "greaterThan 10"); 368200576Sroberto 369200576Sroberto check(!p1.greaterThan(n2), "greaterThan 11"); 370200576Sroberto check(!p2.greaterThan(n2), "greaterThan 12"); 371200576Sroberto check(!n1.greaterThan(n2), "greaterThan 13"); 372200576Sroberto check(!p1.greaterThan(n1), "greaterThan 14"); 373200576Sroberto check(!p2.greaterThan(n1), "greaterThan 15"); 374200576Sroberto check(!p1.greaterThan(p2), "greaterThan 16"); 375200576Sroberto 376200576Sroberto // greaterThanOrEqual positive tests 377132451Sroberto check(p1.greaterThanOrEqual(p1), "greaterThanOrEqual 1"); 378132451Sroberto check(p2.greaterThanOrEqual(p2), "greaterThanOrEqual 2"); 379132451Sroberto check(n1.greaterThanOrEqual(n1), "greaterThanOrEqual 3"); 380132451Sroberto check(n2.greaterThanOrEqual(n2), "greaterThanOrEqual 4"); 381132451Sroberto 382200576Sroberto check(n2.greaterThanOrEqual(p1), "greaterThanOrEqual 5"); 383132451Sroberto check(n2.greaterThanOrEqual(p2), "greaterThanOrEqual 6"); 384132451Sroberto check(n2.greaterThanOrEqual(n1), "greaterThanOrEqual 7"); 385132451Sroberto check(n1.greaterThanOrEqual(p1), "greaterThanOrEqual 8"); 386132451Sroberto check(n1.greaterThanOrEqual(p2), "greaterThanOrEqual 9"); 387132451Sroberto check(p2.greaterThanOrEqual(p1), "greaterThanOrEqual 10"); 388200576Sroberto 389200576Sroberto // greaterThanOrEqual negative tests 390200576Sroberto check(!p1.greaterThanOrEqual(n2), "greaterThanOrEqual 11"); 391200576Sroberto check(!p2.greaterThanOrEqual(n2), "greaterThanOrEqual 12"); 392200576Sroberto check(!n1.greaterThanOrEqual(n2), "greaterThanOrEqual 13"); 393132451Sroberto check(!p1.greaterThanOrEqual(n1), "greaterThanOrEqual 14"); 394200576Sroberto check(!p2.greaterThanOrEqual(n1), "greaterThanOrEqual 15"); 395132451Sroberto check(!p1.greaterThanOrEqual(p2), "greaterThanOrEqual 16"); 396132451Sroberto 397200576Sroberto System.err.println("ProcAddress: all tests passed successfully."); 398200576Sroberto } 399200576Sroberto} 400200576Sroberto