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 + -
显示快捷键?