diff options
-rw-r--r-- | Makefile | 22 | ||||
-rw-r--r-- | Makefile.target | 4 | ||||
-rw-r--r-- | aes.c | 2 | ||||
-rw-r--r-- | block-bochs.c | 2 | ||||
-rw-r--r-- | block-cloop.c | 2 | ||||
-rw-r--r-- | block-cow.c | 2 | ||||
-rw-r--r-- | block-dmg.c | 2 | ||||
-rw-r--r-- | block-parallels.c | 2 | ||||
-rw-r--r-- | block-qcow.c | 2 | ||||
-rw-r--r-- | block-qcow2.c | 2 | ||||
-rw-r--r-- | block-raw.c | 35 | ||||
-rw-r--r-- | block-vmdk.c | 2 | ||||
-rw-r--r-- | block-vpc.c | 2 | ||||
-rw-r--r-- | block-vvfat.c | 2 | ||||
-rw-r--r-- | block.c | 12 | ||||
-rw-r--r-- | block.h | 157 | ||||
-rw-r--r-- | block_int.h | 4 | ||||
-rw-r--r-- | cutils.c | 2 | ||||
-rw-r--r-- | qemu-common.h | 83 | ||||
-rw-r--r-- | qemu-img.c | 2 | ||||
-rw-r--r-- | vl.h | 235 |
21 files changed, 307 insertions, 271 deletions
@@ -13,7 +13,6 @@ BASE_LDFLAGS += $(OS_LDFLAGS) $(ARCH_LDFLAGS) CPPFLAGS += -I. -I$(SRC_PATH) -MMD -MP CPPFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -CPPFLAGS += -DQEMU_TOOL LIBS= ifdef CONFIG_STATIC BASE_LDFLAGS += -static @@ -33,15 +32,23 @@ subdir-%: dyngen$(EXESUF) libqemu_common.a recurse-all: $(patsubst %,subdir-%, $(TARGET_DIRS)) +####################################################################### +# BLOCK_OBJS is code used by both qemu system emulation and qemu-img + +BLOCK_OBJS=cutils.o +BLOCK_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o +BLOCK_OBJS+=block-dmg.o block-bochs.o block-vpc.o block-vvfat.o +BLOCK_OBJS+=block-qcow2.o block-parallels.o + ###################################################################### -# libqemu_common.a: target indepedent part of system emulation. The +# libqemu_common.a: Target indepedent part of system emulation. The # long term path is to suppress *all* target specific code in case of # system emulation, i.e. a single QEMU executable should support all # CPUs and machines. -OBJS+=cutils.o readline.o console.o -#OBJS+=block.o block-raw.o -OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o block-dmg.o block-bochs.o block-vpc.o block-vvfat.o block-qcow2.o block-parallels.o +OBJS=$(BLOCK_OBJS) +OBJS+=readline.o console.o +OBJS+=block.o ifdef CONFIG_WIN32 OBJS+=tap-win32.o @@ -105,9 +112,12 @@ libqemu_common.a: $(OBJS) ###################################################################### -qemu-img$(EXESUF): qemu-img.o block.o block-raw.o libqemu_common.a +qemu-img$(EXESUF): qemu-img.o qemu-img-block.o qemu-img-block-raw.o $(BLOCK_OBJS) $(CC) $(LDFLAGS) $(BASE_LDFLAGS) -o $@ $^ -lz $(LIBS) +qemu-img-%.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_IMG $(BASE_CFLAGS) -c -o $@ $< + %.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(BASE_CFLAGS) -c -o $@ $< diff --git a/Makefile.target b/Makefile.target index a1de14bc48..33cf23bec1 100644 --- a/Makefile.target +++ b/Makefile.target @@ -24,7 +24,7 @@ TARGET_BASE_ARCH:=sparc endif TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH) VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw -CPPFLAGS=-I. -I.. -I$(TARGET_PATH) -I$(SRC_PATH) -MMD -MP +CPPFLAGS=-I. -I.. -I$(TARGET_PATH) -I$(SRC_PATH) -MMD -MP -DNEED_CPU_H ifdef CONFIG_DARWIN_USER VPATH+=:$(SRC_PATH)/darwin-user CPPFLAGS+=-I$(SRC_PATH)/darwin-user -I$(SRC_PATH)/darwin-user/$(TARGET_ARCH) @@ -398,7 +398,7 @@ endif # must use static linking to avoid leaving stuff in virtual address space VL_OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o # XXX: suppress QEMU_TOOL tests -VL_OBJS+=block.o block-raw.o +VL_OBJS+=block-raw.o VL_OBJS+=irq.o ifdef CONFIG_ALSA @@ -27,7 +27,7 @@ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "vl.h" +#include "qemu-common.h" #include "aes.h" #define NDEBUG diff --git a/block-bochs.c b/block-bochs.c index 9baea9b6f1..b167e0bbfd 100644 --- a/block-bochs.c +++ b/block-bochs.c @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" /**************************************************************/ diff --git a/block-cloop.c b/block-cloop.c index 0c9ddb3814..43d380127d 100644 --- a/block-cloop.c +++ b/block-cloop.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #include <zlib.h> diff --git a/block-cow.c b/block-cow.c index 47a91e5ac9..9e7b64602f 100644 --- a/block-cow.c +++ b/block-cow.c @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #ifndef _WIN32 -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #include <sys/mman.h> diff --git a/block-dmg.c b/block-dmg.c index 681f4dc717..62117c97ae 100644 --- a/block-dmg.c +++ b/block-dmg.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #include "bswap.h" #include <zlib.h> diff --git a/block-parallels.c b/block-parallels.c index b0fb99cee2..4654b07b15 100644 --- a/block-parallels.c +++ b/block-parallels.c @@ -23,7 +23,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" /**************************************************************/ diff --git a/block-qcow.c b/block-qcow.c index 9a0bca0e75..730ae67ed8 100644 --- a/block-qcow.c +++ b/block-qcow.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #include <zlib.h> #include "aes.h" diff --git a/block-qcow2.c b/block-qcow2.c index b74fe348ef..577210b21a 100644 --- a/block-qcow2.c +++ b/block-qcow2.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #include <zlib.h> #include "aes.h" diff --git a/block-raw.c b/block-raw.c index 1e5e5d15ed..8286681573 100644 --- a/block-raw.c +++ b/block-raw.c @@ -21,16 +21,16 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifdef QEMU_IMG +#include "qemu-common.h" +#else #include "vl.h" +#endif #include "block_int.h" #include <assert.h> #ifndef _WIN32 #include <aio.h> -#ifndef QEMU_TOOL -#include "exec-all.h" -#endif - #ifdef CONFIG_COCOA #include <paths.h> #include <sys/param.h> @@ -59,8 +59,9 @@ //#define DEBUG_FLOPPY -#define DEBUG_BLOCK -#if defined(DEBUG_BLOCK) && !defined(QEMU_TOOL) +//#define DEBUG_BLOCK +#if defined(DEBUG_BLOCK) && !defined(QEMU_IMG) +#include "exec-all.h" #define DEBUG_BLOCK_PRINT(formatCstr, args...) do { if (loglevel != 0) \ { fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0) #else @@ -242,7 +243,7 @@ static int aio_initialized = 0; static void aio_signal_handler(int signum) { -#ifndef QEMU_TOOL +#ifndef QEMU_IMG CPUState *env = cpu_single_env; if (env) { /* stop the currently executing cpu because a timer occured */ @@ -352,7 +353,7 @@ void qemu_aio_wait(void) sigset_t set; int nb_sigs; -#ifndef QEMU_TOOL +#ifndef QEMU_IMG if (qemu_bh_poll()) return; #endif @@ -693,7 +694,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) return 0; } -#if defined(__linux__) && !defined(QEMU_TOOL) +#if defined(__linux__) && !defined(QEMU_IMG) /* Note: we do not have a reliable method to detect if the floppy is present. The current method is to try to open the floppy at every @@ -976,7 +977,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) } else { create_flags = OPEN_EXISTING; } -#ifdef QEMU_TOOL +#ifdef QEMU_IMG overlapped = FILE_ATTRIBUTE_NORMAL; #else overlapped = FILE_FLAG_OVERLAPPED; @@ -1039,7 +1040,7 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset, } #if 0 -#ifndef QEMU_TOOL +#ifndef QEMU_IMG static void raw_aio_cb(void *opaque) { RawAIOCB *acb = opaque; @@ -1078,7 +1079,7 @@ static RawAIOCB *raw_aio_setup(BlockDriverState *bs, acb->ov.OffsetHigh = offset >> 32; acb->ov.hEvent = acb->hEvent; acb->count = nb_sectors * 512; -#ifndef QEMU_TOOL +#ifndef QEMU_IMG qemu_add_wait_object(acb->ov.hEvent, raw_aio_cb, acb); #endif return acb; @@ -1100,7 +1101,7 @@ static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs, qemu_aio_release(acb); return NULL; } -#ifdef QEMU_TOOL +#ifdef QEMU_IMG qemu_aio_release(acb); #endif return (BlockDriverAIOCB *)acb; @@ -1122,7 +1123,7 @@ static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs, qemu_aio_release(acb); return NULL; } -#ifdef QEMU_TOOL +#ifdef QEMU_IMG qemu_aio_release(acb); #endif return (BlockDriverAIOCB *)acb; @@ -1130,7 +1131,7 @@ static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs, static void raw_aio_cancel(BlockDriverAIOCB *blockacb) { -#ifndef QEMU_TOOL +#ifndef QEMU_IMG RawAIOCB *acb = (RawAIOCB *)blockacb; BlockDriverState *bs = acb->common.bs; BDRVRawState *s = bs->opaque; @@ -1238,7 +1239,7 @@ void qemu_aio_wait_start(void) void qemu_aio_wait(void) { -#ifndef QEMU_TOOL +#ifndef QEMU_IMG qemu_bh_poll(); #endif } @@ -1344,7 +1345,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) } create_flags = OPEN_EXISTING; -#ifdef QEMU_TOOL +#ifdef QEMU_IMG overlapped = FILE_ATTRIBUTE_NORMAL; #else overlapped = FILE_FLAG_OVERLAPPED; diff --git a/block-vmdk.c b/block-vmdk.c index ad22700346..af979a1e8e 100644 --- a/block-vmdk.c +++ b/block-vmdk.c @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D') diff --git a/block-vpc.c b/block-vpc.c index be74c290d1..87b9d69a64 100644 --- a/block-vpc.c +++ b/block-vpc.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" /**************************************************************/ diff --git a/block-vvfat.c b/block-vvfat.c index 3237c266c4..43004e5348 100644 --- a/block-vvfat.c +++ b/block-vvfat.c @@ -25,7 +25,7 @@ #include <sys/stat.h> #include <dirent.h> #include <assert.h> -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #ifndef S_IWGRP @@ -21,7 +21,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#ifdef QEMU_IMG +#include "qemu-common.h" +#else #include "vl.h" +#endif #include "block_int.h" #ifdef _BSD @@ -53,7 +57,7 @@ static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, const uint8_t *buf, int nb_sectors); -static BlockDriverState *bdrv_first; +BlockDriverState *bdrv_first; static BlockDriver *first_drv; int path_is_absolute(const char *path) @@ -859,6 +863,7 @@ void bdrv_flush(BlockDriverState *bs) bdrv_flush(bs->backing_hd); } +#ifndef QEMU_IMG void bdrv_info(void) { BlockDriverState *bs; @@ -898,6 +903,7 @@ void bdrv_info(void) term_printf("\n"); } } +#endif void bdrv_get_backing_filename(BlockDriverState *bs, char *filename, int filename_size) @@ -1102,7 +1108,7 @@ void bdrv_aio_cancel(BlockDriverAIOCB *acb) /**************************************************************/ /* async block device emulation */ -#ifdef QEMU_TOOL +#ifdef QEMU_IMG static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs, int64_t sector_num, uint8_t *buf, int nb_sectors, BlockDriverCompletionFunc *cb, void *opaque) @@ -1172,7 +1178,7 @@ static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb) qemu_bh_cancel(acb->bh); qemu_aio_release(acb); } -#endif /* !QEMU_TOOL */ +#endif /* !QEMU_IMG */ /**************************************************************/ /* sync block device emulation */ diff --git a/block.h b/block.h new file mode 100644 index 0000000000..42baf11f4f --- /dev/null +++ b/block.h @@ -0,0 +1,157 @@ +#ifndef BLOCK_H +#define BLOCK_H + +/* block.c */ +typedef struct BlockDriverState BlockDriverState; +typedef struct BlockDriver BlockDriver; + +extern BlockDriver bdrv_raw; +extern BlockDriver bdrv_host_device; +extern BlockDriver bdrv_cow; +extern BlockDriver bdrv_qcow; +extern BlockDriver bdrv_vmdk; +extern BlockDriver bdrv_cloop; +extern BlockDriver bdrv_dmg; +extern BlockDriver bdrv_bochs; +extern BlockDriver bdrv_vpc; +extern BlockDriver bdrv_vvfat; +extern BlockDriver bdrv_qcow2; +extern BlockDriver bdrv_parallels; + +typedef struct BlockDriverInfo { + /* in bytes, 0 if irrelevant */ + int cluster_size; + /* offset at which the VM state can be saved (0 if not possible) */ + int64_t vm_state_offset; +} BlockDriverInfo; + +typedef struct QEMUSnapshotInfo { + char id_str[128]; /* unique snapshot id */ + /* the following fields are informative. They are not needed for + the consistency of the snapshot */ + char name[256]; /* user choosen name */ + uint32_t vm_state_size; /* VM state info size */ + uint32_t date_sec; /* UTC date of the snapshot */ + uint32_t date_nsec; + uint64_t vm_clock_nsec; /* VM clock relative to boot */ +} QEMUSnapshotInfo; + +#define BDRV_O_RDONLY 0x0000 +#define BDRV_O_RDWR 0x0002 +#define BDRV_O_ACCESS 0x0003 +#define BDRV_O_CREAT 0x0004 /* create an empty file */ +#define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */ +#define BDRV_O_FILE 0x0010 /* open as a raw file (do not try to + use a disk image format on top of + it (default for + bdrv_file_open()) */ + +#ifndef QEMU_IMG +void bdrv_info(void); +#endif + +void bdrv_init(void); +BlockDriver *bdrv_find_format(const char *format_name); +int bdrv_create(BlockDriver *drv, + const char *filename, int64_t size_in_sectors, + const char *backing_file, int flags); +BlockDriverState *bdrv_new(const char *device_name); +void bdrv_delete(BlockDriverState *bs); +int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags); +int bdrv_open(BlockDriverState *bs, const char *filename, int flags); +int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, + BlockDriver *drv); +void bdrv_close(BlockDriverState *bs); +int bdrv_read(BlockDriverState *bs, int64_t sector_num, + uint8_t *buf, int nb_sectors); +int bdrv_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors); +int bdrv_pread(BlockDriverState *bs, int64_t offset, + void *buf, int count); +int bdrv_pwrite(BlockDriverState *bs, int64_t offset, + const void *buf, int count); +int bdrv_truncate(BlockDriverState *bs, int64_t offset); +int64_t bdrv_getlength(BlockDriverState *bs); +void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr); +int bdrv_commit(BlockDriverState *bs); +void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size); +/* async block I/O */ +typedef struct BlockDriverAIOCB BlockDriverAIOCB; +typedef void BlockDriverCompletionFunc(void *opaque, int ret); + +BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, + uint8_t *buf, int nb_sectors, + BlockDriverCompletionFunc *cb, void *opaque); +BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors, + BlockDriverCompletionFunc *cb, void *opaque); +void bdrv_aio_cancel(BlockDriverAIOCB *acb); + +void qemu_aio_init(void); +void qemu_aio_poll(void); +void qemu_aio_flush(void); +void qemu_aio_wait_start(void); +void qemu_aio_wait(void); +void qemu_aio_wait_end(void); + +int qemu_key_check(BlockDriverState *bs, const char *name); + +/* Ensure contents are flushed to disk. */ +void bdrv_flush(BlockDriverState *bs); + +#define BDRV_TYPE_HD 0 +#define BDRV_TYPE_CDROM 1 +#define BDRV_TYPE_FLOPPY 2 +#define BIOS_ATA_TRANSLATION_AUTO 0 +#define BIOS_ATA_TRANSLATION_NONE 1 +#define BIOS_ATA_TRANSLATION_LBA 2 +#define BIOS_ATA_TRANSLATION_LARGE 3 +#define BIOS_ATA_TRANSLATION_RECHS 4 + +void bdrv_set_geometry_hint(BlockDriverState *bs, + int cyls, int heads, int secs); +void bdrv_set_type_hint(BlockDriverState *bs, int type); +void bdrv_set_translation_hint(BlockDriverState *bs, int translation); +void bdrv_get_geometry_hint(BlockDriverState *bs, + int *pcyls, int *pheads, int *psecs); +int bdrv_get_type_hint(BlockDriverState *bs); +int bdrv_get_translation_hint(BlockDriverState *bs); +int bdrv_is_removable(BlockDriverState *bs); +int bdrv_is_read_only(BlockDriverState *bs); +int bdrv_is_inserted(BlockDriverState *bs); +int bdrv_media_changed(BlockDriverState *bs); +int bdrv_is_locked(BlockDriverState *bs); +void bdrv_set_locked(BlockDriverState *bs, int locked); +void bdrv_eject(BlockDriverState *bs, int eject_flag); +void bdrv_set_change_cb(BlockDriverState *bs, + void (*change_cb)(void *opaque), void *opaque); +void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size); +BlockDriverState *bdrv_find(const char *name); +void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque); +int bdrv_is_encrypted(BlockDriverState *bs); +int bdrv_set_key(BlockDriverState *bs, const char *key); +void bdrv_iterate_format(void (*it)(void *opaque, const char *name), + void *opaque); +const char *bdrv_get_device_name(BlockDriverState *bs); +int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors); +int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi); + +void bdrv_get_backing_filename(BlockDriverState *bs, + char *filename, int filename_size); +int bdrv_snapshot_create(BlockDriverState *bs, + QEMUSnapshotInfo *sn_info); +int bdrv_snapshot_goto(BlockDriverState *bs, + const char *snapshot_id); +int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id); +int bdrv_snapshot_list(BlockDriverState *bs, + QEMUSnapshotInfo **psn_info); +char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn); + +char *get_human_readable_size(char *buf, int buf_size, int64_t size); +int path_is_absolute(const char *path); +void path_combine(char *dest, int dest_size, + const char *base_path, + const char *filename); + +#endif diff --git a/block_int.h b/block_int.h index b034023e05..2c5f168f6e 100644 --- a/block_int.h +++ b/block_int.h @@ -24,6 +24,8 @@ #ifndef BLOCK_INT_H #define BLOCK_INT_H +#include "block.h" + #define BLOCK_FLAG_ENCRYPT 1 #define BLOCK_FLAG_COMPRESS 2 #define BLOCK_FLAG_COMPAT6 4 @@ -133,4 +135,6 @@ void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb, void *opaque); void qemu_aio_release(void *p); +BlockDriverState *bdrv_first; + #endif /* BLOCK_INT_H */ @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" void pstrcpy(char *buf, int buf_size, const char *str) { diff --git a/qemu-common.h b/qemu-common.h new file mode 100644 index 0000000000..64f4e78aeb --- /dev/null +++ b/qemu-common.h @@ -0,0 +1,83 @@ +/* Common header file that is included by all of qemu. */ +#ifndef QEMU_COMMON_H +#define QEMU_COMMON_H + +/* we put basic includes here to avoid repeating them in device drivers */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <limits.h> +#include <time.h> +#include <ctype.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> + +#ifndef O_LARGEFILE +#define O_LARGEFILE 0 +#endif +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifndef ENOMEDIUM +#define ENOMEDIUM ENODEV +#endif + +#ifdef _WIN32 +#include <windows.h> +#define fsync _commit +#define lseek _lseeki64 +#define ENOTSUP 4096 +extern int qemu_ftruncate64(int, int64_t); +#define ftruncate qemu_ftruncate64 + + +static inline char *realpath(const char *path, char *resolved_path) +{ + _fullpath(resolved_path, path, _MAX_PATH); + return resolved_path; +} + +#define PRId64 "I64d" +#define PRIx64 "I64x" +#define PRIu64 "I64u" +#define PRIo64 "I64o" +#endif + +/* FIXME: Remove NEED_CPU_H. */ +#ifndef NEED_CPU_H + +#include "config-host.h" +#include <setjmp.h> +#include "osdep.h" +#include "bswap.h" + +#else + +#include "cpu.h" + +#endif /* !defined(NEED_CPU_H) */ + +/* bottom halves */ +typedef struct QEMUBH QEMUBH; + +typedef void QEMUBHFunc(void *opaque); + +QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque); +void qemu_bh_schedule(QEMUBH *bh); +void qemu_bh_cancel(QEMUBH *bh); +void qemu_bh_delete(QEMUBH *bh); +int qemu_bh_poll(void); + +/* cutils.c */ +void pstrcpy(char *buf, int buf_size, const char *str); +char *pstrcat(char *buf, int buf_size, const char *s); +int strstart(const char *str, const char *val, const char **ptr); +int stristart(const char *str, const char *val, const char **ptr); +time_t mktimegm(struct tm *tm); + +#endif diff --git a/qemu-img.c b/qemu-img.c index 8ebc4ba313..095a59338b 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vl.h" +#include "qemu-common.h" #include "block_int.h" #include <assert.h> @@ -24,66 +24,10 @@ #ifndef VL_H #define VL_H -/* we put basic includes here to avoid repeating them in device drivers */ -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include <string.h> -#include <inttypes.h> -#include <limits.h> -#include <time.h> -#include <ctype.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/stat.h> - -#ifndef O_LARGEFILE -#define O_LARGEFILE 0 -#endif -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#ifndef ENOMEDIUM -#define ENOMEDIUM ENODEV -#endif - -#ifdef _WIN32 -#include <windows.h> -#define fsync _commit -#define lseek _lseeki64 -#define ENOTSUP 4096 -extern int qemu_ftruncate64(int, int64_t); -#define ftruncate qemu_ftruncate64 - - -static inline char *realpath(const char *path, char *resolved_path) -{ - _fullpath(resolved_path, path, _MAX_PATH); - return resolved_path; -} - -#define PRId64 "I64d" -#define PRIx64 "I64x" -#define PRIu64 "I64u" -#define PRIo64 "I64o" -#endif - -#ifdef QEMU_TOOL - -/* we use QEMU_TOOL on code which does not depend on the target CPU - type */ -#include "config-host.h" -#include <setjmp.h> -#include "osdep.h" -#include "bswap.h" - -#else - -#include "cpu.h" +#include "qemu-common.h" -#endif /* !defined(QEMU_TOOL) */ +/* FIXME: Remove this. */ +#include "block.h" #ifndef glue #define xglue(x, y) x ## y @@ -118,13 +62,6 @@ static inline char *realpath(const char *path, char *resolved_path) #include "audio/audio.h" -/* cutils.c */ -void pstrcpy(char *buf, int buf_size, const char *str); -char *pstrcat(char *buf, int buf_size, const char *s); -int strstart(const char *str, const char *val, const char **ptr); -int stristart(const char *str, const char *val, const char **ptr); -time_t mktimegm(struct tm *tm); - /* vl.c */ uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c); @@ -297,8 +234,6 @@ int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); #endif -typedef struct QEMUBH QEMUBH; - /* character device */ #define CHR_EVENT_BREAK 0 /* serial break char */ @@ -604,166 +539,6 @@ void do_loadvm(const char *name); void do_delvm(const char *name); void do_info_snapshots(void); -/* bottom halves */ -typedef void QEMUBHFunc(void *opaque); - -QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque); -void qemu_bh_schedule(QEMUBH *bh); -void qemu_bh_cancel(QEMUBH *bh); -void qemu_bh_delete(QEMUBH *bh); -int qemu_bh_poll(void); - -/* block.c */ -typedef struct BlockDriverState BlockDriverState; -typedef struct BlockDriver BlockDriver; - -extern BlockDriver bdrv_raw; -extern BlockDriver bdrv_host_device; -extern BlockDriver bdrv_cow; -extern BlockDriver bdrv_qcow; -extern BlockDriver bdrv_vmdk; -extern BlockDriver bdrv_cloop; -extern BlockDriver bdrv_dmg; -extern BlockDriver bdrv_bochs; -extern BlockDriver bdrv_vpc; -extern BlockDriver bdrv_vvfat; -extern BlockDriver bdrv_qcow2; -extern BlockDriver bdrv_parallels; - -typedef struct BlockDriverInfo { - /* in bytes, 0 if irrelevant */ - int cluster_size; - /* offset at which the VM state can be saved (0 if not possible) */ - int64_t vm_state_offset; -} BlockDriverInfo; - -typedef struct QEMUSnapshotInfo { - char id_str[128]; /* unique snapshot id */ - /* the following fields are informative. They are not needed for - the consistency of the snapshot */ - char name[256]; /* user choosen name */ - uint32_t vm_state_size; /* VM state info size */ - uint32_t date_sec; /* UTC date of the snapshot */ - uint32_t date_nsec; - uint64_t vm_clock_nsec; /* VM clock relative to boot */ -} QEMUSnapshotInfo; - -#define BDRV_O_RDONLY 0x0000 -#define BDRV_O_RDWR 0x0002 -#define BDRV_O_ACCESS 0x0003 -#define BDRV_O_CREAT 0x0004 /* create an empty file */ -#define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */ -#define BDRV_O_FILE 0x0010 /* open as a raw file (do not try to - use a disk image format on top of - it (default for - bdrv_file_open()) */ - -void bdrv_init(void); -BlockDriver *bdrv_find_format(const char *format_name); -int bdrv_create(BlockDriver *drv, - const char *filename, int64_t size_in_sectors, - const char *backing_file, int flags); -BlockDriverState *bdrv_new(const char *device_name); -void bdrv_delete(BlockDriverState *bs); -int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags); -int bdrv_open(BlockDriverState *bs, const char *filename, int flags); -int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, - BlockDriver *drv); -void bdrv_close(BlockDriverState *bs); -int bdrv_read(BlockDriverState *bs, int64_t sector_num, - uint8_t *buf, int nb_sectors); -int bdrv_write(BlockDriverState *bs, int64_t sector_num, - const uint8_t *buf, int nb_sectors); -int bdrv_pread(BlockDriverState *bs, int64_t offset, - void *buf, int count); -int bdrv_pwrite(BlockDriverState *bs, int64_t offset, - const void *buf, int count); -int bdrv_truncate(BlockDriverState *bs, int64_t offset); -int64_t bdrv_getlength(BlockDriverState *bs); -void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr); -int bdrv_commit(BlockDriverState *bs); -void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size); -/* async block I/O */ -typedef struct BlockDriverAIOCB BlockDriverAIOCB; -typedef void BlockDriverCompletionFunc(void *opaque, int ret); - -BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, - uint8_t *buf, int nb_sectors, - BlockDriverCompletionFunc *cb, void *opaque); -BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, - const uint8_t *buf, int nb_sectors, - BlockDriverCompletionFunc *cb, void *opaque); -void bdrv_aio_cancel(BlockDriverAIOCB *acb); - -void qemu_aio_init(void); -void qemu_aio_poll(void); -void qemu_aio_flush(void); -void qemu_aio_wait_start(void); -void qemu_aio_wait(void); -void qemu_aio_wait_end(void); - -int qemu_key_check(BlockDriverState *bs, const char *name); - -/* Ensure contents are flushed to disk. */ -void bdrv_flush(BlockDriverState *bs); - -#define BDRV_TYPE_HD 0 -#define BDRV_TYPE_CDROM 1 -#define BDRV_TYPE_FLOPPY 2 -#define BIOS_ATA_TRANSLATION_AUTO 0 -#define BIOS_ATA_TRANSLATION_NONE 1 -#define BIOS_ATA_TRANSLATION_LBA 2 -#define BIOS_ATA_TRANSLATION_LARGE 3 -#define BIOS_ATA_TRANSLATION_RECHS 4 - -void bdrv_set_geometry_hint(BlockDriverState *bs, - int cyls, int heads, int secs); -void bdrv_set_type_hint(BlockDriverState *bs, int type); -void bdrv_set_translation_hint(BlockDriverState *bs, int translation); -void bdrv_get_geometry_hint(BlockDriverState *bs, - int *pcyls, int *pheads, int *psecs); -int bdrv_get_type_hint(BlockDriverState *bs); -int bdrv_get_translation_hint(BlockDriverState *bs); -int bdrv_is_removable(BlockDriverState *bs); -int bdrv_is_read_only(BlockDriverState *bs); -int bdrv_is_inserted(BlockDriverState *bs); -int bdrv_media_changed(BlockDriverState *bs); -int bdrv_is_locked(BlockDriverState *bs); -void bdrv_set_locked(BlockDriverState *bs, int locked); -void bdrv_eject(BlockDriverState *bs, int eject_flag); -void bdrv_set_change_cb(BlockDriverState *bs, - void (*change_cb)(void *opaque), void *opaque); -void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size); -void bdrv_info(void); -BlockDriverState *bdrv_find(const char *name); -void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque); -int bdrv_is_encrypted(BlockDriverState *bs); -int bdrv_set_key(BlockDriverState *bs, const char *key); -void bdrv_iterate_format(void (*it)(void *opaque, const char *name), - void *opaque); -const char *bdrv_get_device_name(BlockDriverState *bs); -int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num, - const uint8_t *buf, int nb_sectors); -int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi); - -void bdrv_get_backing_filename(BlockDriverState *bs, - char *filename, int filename_size); -int bdrv_snapshot_create(BlockDriverState *bs, - QEMUSnapshotInfo *sn_info); -int bdrv_snapshot_goto(BlockDriverState *bs, - const char *snapshot_id); -int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id); -int bdrv_snapshot_list(BlockDriverState *bs, - QEMUSnapshotInfo **psn_info); -char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn); - -char *get_human_readable_size(char *buf, int buf_size, int64_t size); -int path_is_absolute(const char *path); -void path_combine(char *dest, int dest_size, - const char *base_path, - const char *filename); - - /* monitor.c */ void monitor_init(CharDriverState *hd, int show_banner); void term_puts(const char *str); @@ -804,7 +579,7 @@ void do_info_vnc(void); /* x_keymap.c */ extern uint8_t _translate_keycode(const int key); -#ifndef QEMU_TOOL +#ifdef NEED_CPU_H typedef void QEMUMachineInitFunc(int ram_size, int vga_ram_size, const char *boot_device, @@ -1759,5 +1534,5 @@ extern QEMUMachine dummy_m68k_machine; #include "gdbstub.h" -#endif /* defined(QEMU_TOOL) */ +#endif /* defined(NEED_CPU_H) */ #endif /* VL_H */ |