You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
4.6 KiB

// Copyright 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <inttypes.h>
extern "C" {
struct AddressSpaceHwFuncs;
typedef uint32_t (*address_space_device_gen_handle_t)(void);
typedef void (*address_space_device_destroy_handle_t)(uint32_t);
typedef void (*address_space_device_tell_ping_info_t)(uint32_t handle, uint64_t gpa);
typedef void (*address_space_device_ping_t)(uint32_t handle);
typedef int (*address_space_device_add_memory_mapping_t)(uint64_t gpa, void *ptr, uint64_t size);
typedef int (*address_space_device_remove_memory_mapping_t)(uint64_t gpa, void *ptr, uint64_t size);
typedef void* (*address_space_device_get_host_ptr_t)(uint64_t gpa);
typedef void* (*address_space_device_handle_to_context_t)(uint32_t handle);
typedef void (*address_space_device_clear_t)(void);
// virtio-gpu-next
typedef uint64_t (*address_space_device_hostmem_register_t)(uint64_t hva, uint64_t size, uint32_t register_fixed, uint64_t fixed_id);
typedef void (*address_space_device_hostmem_unregister_t)(uint64_t id);
typedef void (*address_space_device_ping_at_hva_t)(uint32_t handle, void* hva);
// deallocation callbacks
typedef void (*address_space_device_deallocation_callback_t)(void* context, uint64_t gpa);
typedef void (*address_space_device_register_deallocation_callback_t)(void* context, uint64_t gpa, address_space_device_deallocation_callback_t);
typedef void (*address_space_device_run_deallocation_callbacks_t)(uint64_t gpa);
typedef const struct AddressSpaceHwFuncs* (*address_space_device_control_get_hw_funcs_t)(void);
struct address_space_device_control_ops {
address_space_device_gen_handle_t gen_handle;
address_space_device_destroy_handle_t destroy_handle;
address_space_device_tell_ping_info_t tell_ping_info;
address_space_device_ping_t ping;
address_space_device_add_memory_mapping_t add_memory_mapping;
address_space_device_remove_memory_mapping_t remove_memory_mapping;
address_space_device_get_host_ptr_t get_host_ptr;
address_space_device_handle_to_context_t handle_to_context;
address_space_device_clear_t clear;
address_space_device_hostmem_register_t hostmem_register;
address_space_device_hostmem_unregister_t hostmem_unregister;
address_space_device_ping_at_hva_t ping_at_hva;
address_space_device_register_deallocation_callback_t register_deallocation_callback;
address_space_device_run_deallocation_callbacks_t run_deallocation_callbacks;
address_space_device_control_get_hw_funcs_t control_get_hw_funcs;
};
struct address_space_device_control_ops*
get_address_space_device_control_ops(void);
struct QAndroidVmOperations;
void address_space_set_vm_operations(const QAndroidVmOperations* vmops);
struct AddressSpaceHwFuncs {
/* Called by the host to reserve a shared region. Guest users can then
* suballocate into this region. This saves us a lot of KVM slots.
* Returns the relative offset to the starting phys addr in |offset|
* and returns 0 if successful, -errno otherwise. */
int (*allocSharedHostRegion)(uint64_t page_aligned_size, uint64_t* offset);
/* Called by the host to free a shared region. Only useful on teardown
* or when loading a snapshot while the emulator is running.
* Returns 0 if successful, -errno otherwise. */
int (*freeSharedHostRegion)(uint64_t offset);
/* Versions of the above but when the state is already locked. */
int (*allocSharedHostRegionLocked)(uint64_t page_aligned_size, uint64_t* offset);
int (*freeSharedHostRegionLocked)(uint64_t offset);
/* Obtains the starting physical address for which the resulting offsets
* are relative to. */
uint64_t (*getPhysAddrStart)(void);
uint64_t (*getPhysAddrStartLocked)(void);
/* Version of allocSharedHostRegionLocked but for a fixed offset */
int (*allocSharedHostRegionFixedLocked)(uint64_t page_aligned_size, uint64_t offset);
};
extern const struct AddressSpaceHwFuncs* address_space_set_hw_funcs(
const struct AddressSpaceHwFuncs* hwFuncs);
const struct AddressSpaceHwFuncs* get_address_space_device_hw_funcs(void);
} // extern "C"