acpitable.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 107 行
JAVA
107 行
/*
* $Id: AcpiTable.java,v 1.1 2003/11/25 11:42:14 epr Exp $
*/
package org.jnode.driver.acpi;
import org.apache.log4j.Logger;
import org.jnode.system.MemoryResource;
import org.jnode.system.ResourceManager;
import org.jnode.system.ResourceNotFreeException;
import org.jnode.system.ResourceOwner;
import org.jnode.vm.Address;
/**
* ACPI abstract table.
*
* <p>
* Title:
* </p>
* <p>
* Description:
* </p>
* <p>
* Licence: GNU LGPL
* </p>
* <p>
* </p>
*
* @author Francois-Frederic Ozog
* @version 1.0
*/
public abstract class AcpiTable {
protected final Logger log = Logger.getLogger(getClass());
protected final ResourceManager rm;
protected final MemoryResource tableResource;
protected final byte[] table;
String signature;
public AcpiTable(ResourceManager rm, MemoryResource tableResource) {
this.rm = rm;
this.tableResource = tableResource;
table = new byte[(int) tableResource.getSize()];
tableResource.getBytes(0, table, 0, table.length);
signature = new String(this.table, 0, 4);
}
public int getInt(int offset) {
return tableResource.getInt(offset);
}
public int getShort(int offset) {
return ((tableResource.getByte(offset + 1) & 0xff) << 8) + (tableResource.getByte(offset) & 0xff);
}
public String getString(int offset, int length) {
return new String(table, offset, length);
}
public int getByte(int offset) {
return tableResource.getByte(offset) & 0xff;
}
public String toString() {
long start = Address.as64bit(tableResource.getAddress());
long size = tableResource.getSize();
return signature + " [" + Long.toHexString(start) + ":" + Long.toHexString((start + size)) + "]";
}
public void parse() throws ResourceNotFreeException {
}
public static AcpiTable getTable(ResourceOwner owner, ResourceManager rm, int start) throws ResourceNotFreeException {
Address ptr = Address.valueOf(start);
MemoryResource table;
try {
table = rm.claimMemoryResource(owner, ptr, 8, ResourceManager.MEMMODE_NORMAL);
//int signature=table.getInt(0);
int size = table.getInt(4);
table.release();
table = rm.claimMemoryResource(owner, ptr, size, ResourceManager.MEMMODE_NORMAL);
String tableSignature = "";
for (int i = 0; i < 4; i++)
tableSignature += (char) (table.getByte(i) & 0x0ff);
// log.debug("Table found: " + tableSignature);
if (tableSignature.equals("RSDT")) {
return new RootSystemDescriptionTable(rm, table);
} else if (tableSignature.equals("DSDT")) {
return new DifferentiatedSystemDescriptionTable(rm, table);
} else if (tableSignature.equals("FACS")) {
return new FirmwareAcpiControlStructure(rm, table);
} else if (tableSignature.equals("FACP")) {
return new FixedAcpiDescriptionTable(rm, table);
}
return null;
} catch (ResourceNotFreeException ex1) {
throw new ResourceNotFreeException("Could not get table header begining memory range: " + Integer.toHexString(start) + "(8 bytes)");
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?