2 * Copyright (c) 2018 VMware, Inc.
4 * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
7 /* This file implements defines and helper functions. */
10 __FBSDID("$FreeBSD$");
12 #include <sys/malloc.h>
16 #include <machine/bus.h>
19 #include "vmci_defs.h"
20 #include "vmci_kernel_defs.h"
21 #include "vmci_kernel_if.h"
22 #include "vmci_queue.h"
24 struct vmci_queue_kernel_if {
25 size_t num_pages; /* Num pages incl. header. */
26 struct vmci_dma_alloc *dmas; /* For dma alloc. */
30 *------------------------------------------------------------------------------
34 * Initializes the lock. Must be called before use.
37 * Always VMCI_SUCCESS.
42 *------------------------------------------------------------------------------
46 vmci_init_lock(vmci_lock *lock, char *name)
49 mtx_init(lock, name, NULL, MTX_DEF | MTX_NOWITNESS);
50 return (VMCI_SUCCESS);
54 *------------------------------------------------------------------------------
58 * Cleanup the lock. Must be called before deallocating lock.
64 * Deletes kernel lock state
66 *------------------------------------------------------------------------------
70 vmci_cleanup_lock(vmci_lock *lock)
73 if mtx_initialized(lock)
78 *------------------------------------------------------------------------------
82 * Grabs the given lock.
90 *------------------------------------------------------------------------------
94 vmci_grab_lock(vmci_lock *lock)
101 *------------------------------------------------------------------------------
105 * Releases the given lock.
111 * A thread blocked on this lock may wake up.
113 *------------------------------------------------------------------------------
117 vmci_release_lock(vmci_lock *lock)
124 *------------------------------------------------------------------------------
128 * Grabs the given lock.
136 *------------------------------------------------------------------------------
140 vmci_grab_lock_bh(vmci_lock *lock)
147 *------------------------------------------------------------------------------
149 * vmci_release_lock_bh
151 * Releases the given lock.
159 *------------------------------------------------------------------------------
163 vmci_release_lock_bh(vmci_lock *lock)
170 *------------------------------------------------------------------------------
172 * vmci_initialized_lock
174 * Returns whether a lock has been initialized.
177 * Return 1 if initialized or 0 if unininitialized.
182 *------------------------------------------------------------------------------
186 vmci_initialized_lock(vmci_lock *lock)
189 return mtx_initialized(lock);
193 *------------------------------------------------------------------------------
195 * vmci_alloc_kernel_mem
197 * Allocate physically contiguous memory for the VMCI driver.
200 * The address allocated or NULL on error.
204 * Memory may be allocated.
206 *------------------------------------------------------------------------------
210 vmci_alloc_kernel_mem(size_t size, int flags)
214 if ((flags & VMCI_MEMORY_ATOMIC) != 0)
215 ptr = contigmalloc(size, M_DEVBUF, M_NOWAIT, 0, 0xFFFFFFFF,
218 ptr = contigmalloc(size, M_DEVBUF, M_WAITOK, 0, 0xFFFFFFFF,
225 *------------------------------------------------------------------------------
227 * vmci_free_kernel_mem
229 * Free kernel memory allocated for the VMCI driver.
237 *------------------------------------------------------------------------------
241 vmci_free_kernel_mem(void *ptr, size_t size)
244 contigfree(ptr, size, M_DEVBUF);
248 *------------------------------------------------------------------------------
250 * vmci_can_schedule_delayed_work --
252 * Checks to see if the given platform supports delayed work callbacks.
255 * true if it does. false otherwise.
260 *------------------------------------------------------------------------------
264 vmci_can_schedule_delayed_work(void)
271 *------------------------------------------------------------------------------
273 * vmci_schedule_delayed_work --
275 * Schedule the specified callback.
278 * Zero on success, error code otherwise.
283 *------------------------------------------------------------------------------
287 vmci_schedule_delayed_work(vmci_work_fn *work_fn, void *data)
290 return (vmci_schedule_delayed_work_fn(work_fn, data));
294 *------------------------------------------------------------------------------
296 * vmci_create_event --
304 *------------------------------------------------------------------------------
308 vmci_create_event(vmci_event *event)
311 sema_init(event, 0, "vmci_event");
315 *------------------------------------------------------------------------------
317 * vmci_destroy_event --
325 *------------------------------------------------------------------------------
329 vmci_destroy_event(vmci_event *event)
332 if (mtx_owned(&event->sema_mtx))
337 *------------------------------------------------------------------------------
339 * vmci_signal_event --
347 *------------------------------------------------------------------------------
351 vmci_signal_event(vmci_event *event)
358 *------------------------------------------------------------------------------
360 * vmci_wait_on_event --
368 *------------------------------------------------------------------------------
372 vmci_wait_on_event(vmci_event *event, vmci_event_release_cb release_cb,
376 release_cb(client_data);
381 *------------------------------------------------------------------------------
385 * Initializes the mutex. Must be called before use.
393 *------------------------------------------------------------------------------
397 vmci_mutex_init(vmci_mutex *mutex, char *name)
400 mtx_init(mutex, name, NULL, MTX_DEF | MTX_NOWITNESS);
401 return (VMCI_SUCCESS);
405 *------------------------------------------------------------------------------
407 * vmci_mutex_destroy --
409 * Destroys the mutex.
417 *------------------------------------------------------------------------------
421 vmci_mutex_destroy(vmci_mutex *mutex)
428 *------------------------------------------------------------------------------
430 * vmci_mutex_acquire --
432 * Acquires the mutex.
440 *------------------------------------------------------------------------------
444 vmci_mutex_acquire(vmci_mutex *mutex)
451 *------------------------------------------------------------------------------
453 * vmci_mutex_release --
455 * Releases the mutex.
461 * May wake up the thread blocking on this mutex.
463 *------------------------------------------------------------------------------
467 vmci_mutex_release(vmci_mutex *mutex)
474 *------------------------------------------------------------------------------
476 * vmci_mutex_initialized
478 * Returns whether a mutex has been initialized.
481 * Return 1 if initialized or 0 if unininitialized.
486 *------------------------------------------------------------------------------
490 vmci_mutex_initialized(vmci_mutex *mutex)
493 return mtx_initialized(mutex);
496 *------------------------------------------------------------------------------
498 * vmci_alloc_queue --
500 * Allocates kernel queue pages of specified size with IOMMU mappings, plus
501 * space for the queue structure/kernel interface and the queue header.
504 * Pointer to the queue on success, NULL otherwise.
507 * Memory is allocated.
509 *------------------------------------------------------------------------------
513 vmci_alloc_queue(uint64_t size, uint32_t flags)
515 struct vmci_queue *queue;
517 const size_t num_pages = CEILING(size, PAGE_SIZE) + 1;
518 const size_t dmas_size = num_pages * sizeof(struct vmci_dma_alloc);
519 const size_t queue_size =
520 sizeof(*queue) + sizeof(*(queue->kernel_if)) + dmas_size;
522 /* Size should be enforced by vmci_qpair_alloc(), double-check here. */
523 if (size > VMCI_MAX_GUEST_QP_MEMORY) {
528 queue = malloc(queue_size, M_DEVBUF, M_NOWAIT);
532 queue->q_header = NULL;
533 queue->saved_header = NULL;
534 queue->kernel_if = (struct vmci_queue_kernel_if *)(queue + 1);
535 queue->kernel_if->num_pages = num_pages;
536 queue->kernel_if->dmas = (struct vmci_dma_alloc *)(queue->kernel_if +
538 for (i = 0; i < num_pages; i++) {
539 vmci_dma_malloc(PAGE_SIZE, 1, &queue->kernel_if->dmas[i]);
540 if (!queue->kernel_if->dmas[i].dma_vaddr) {
541 /* Size excl. the header. */
542 vmci_free_queue(queue, i * PAGE_SIZE);
547 /* Queue header is the first page. */
548 queue->q_header = (void *)queue->kernel_if->dmas[0].dma_vaddr;
550 return ((void *)queue);
554 *------------------------------------------------------------------------------
558 * Frees kernel VA space for a given queue and its queue header, and frees
559 * physical data pages.
567 *------------------------------------------------------------------------------
571 vmci_free_queue(void *q, uint64_t size)
573 struct vmci_queue *queue = q;
576 const size_t num_pages = CEILING(size, PAGE_SIZE) + 1;
579 /* Given size doesn't include header, so add in a page here. */
580 for (i = 0; i < num_pages; i++)
581 vmci_dma_free(&queue->kernel_if->dmas[i]);
582 free(queue, M_DEVBUF);
587 *------------------------------------------------------------------------------
589 * vmci_alloc_ppn_set --
591 * Allocates two list of PPNs --- one for the pages in the produce queue,
592 * and the other for the pages in the consume queue. Intializes the list of
593 * PPNs with the page frame numbers of the KVA for the two queues (and the
597 * Success or failure.
600 * Memory may be allocated.
602 *-----------------------------------------------------------------------------
606 vmci_alloc_ppn_set(void *prod_q, uint64_t num_produce_pages, void *cons_q,
607 uint64_t num_consume_pages, struct ppn_set *ppn_set)
609 struct vmci_queue *consume_q = cons_q;
610 struct vmci_queue *produce_q = prod_q;
611 vmci_ppn_list consume_ppns;
612 vmci_ppn_list produce_ppns;
615 if (!produce_q || !num_produce_pages || !consume_q ||
616 !num_consume_pages || !ppn_set)
617 return (VMCI_ERROR_INVALID_ARGS);
619 if (ppn_set->initialized)
620 return (VMCI_ERROR_ALREADY_EXISTS);
623 vmci_alloc_kernel_mem(num_produce_pages * sizeof(*produce_ppns),
626 return (VMCI_ERROR_NO_MEM);
629 vmci_alloc_kernel_mem(num_consume_pages * sizeof(*consume_ppns),
632 vmci_free_kernel_mem(produce_ppns,
633 num_produce_pages * sizeof(*produce_ppns));
634 return (VMCI_ERROR_NO_MEM);
637 for (i = 0; i < num_produce_pages; i++) {
641 pfn = produce_q->kernel_if->dmas[i].dma_paddr >> PAGE_SHIFT;
644 * Fail allocation if PFN isn't supported by hypervisor.
648 sizeof(*produce_ppns) && pfn != produce_ppns[i])
651 for (i = 0; i < num_consume_pages; i++) {
655 pfn = consume_q->kernel_if->dmas[i].dma_paddr >> PAGE_SHIFT;
658 * Fail allocation if PFN isn't supported by hypervisor.
662 sizeof(*consume_ppns) && pfn != consume_ppns[i])
667 ppn_set->num_produce_pages = num_produce_pages;
668 ppn_set->num_consume_pages = num_consume_pages;
669 ppn_set->produce_ppns = produce_ppns;
670 ppn_set->consume_ppns = consume_ppns;
671 ppn_set->initialized = true;
672 return (VMCI_SUCCESS);
675 vmci_free_kernel_mem(produce_ppns, num_produce_pages *
676 sizeof(*produce_ppns));
677 vmci_free_kernel_mem(consume_ppns, num_consume_pages *
678 sizeof(*consume_ppns));
679 return (VMCI_ERROR_INVALID_ARGS);
683 *------------------------------------------------------------------------------
685 * vmci_free_ppn_set --
687 * Frees the two list of PPNs for a queue pair.
695 *------------------------------------------------------------------------------
699 vmci_free_ppn_set(struct ppn_set *ppn_set)
703 if (ppn_set->initialized) {
704 /* Do not call these functions on NULL inputs. */
705 ASSERT(ppn_set->produce_ppns && ppn_set->consume_ppns);
706 vmci_free_kernel_mem(ppn_set->produce_ppns,
707 ppn_set->num_produce_pages *
708 sizeof(*ppn_set->produce_ppns));
709 vmci_free_kernel_mem(ppn_set->consume_ppns,
710 ppn_set->num_consume_pages *
711 sizeof(*ppn_set->consume_ppns));
713 memset(ppn_set, 0, sizeof(*ppn_set));
717 *------------------------------------------------------------------------------
719 * vmci_populate_ppn_list --
721 * Populates the list of PPNs in the hypercall structure with the PPNS
722 * of the produce queue and the consume queue.
730 *------------------------------------------------------------------------------
734 vmci_populate_ppn_list(uint8_t *call_buf, const struct ppn_set *ppn_set)
737 ASSERT(call_buf && ppn_set && ppn_set->initialized);
738 memcpy(call_buf, ppn_set->produce_ppns,
739 ppn_set->num_produce_pages * sizeof(*ppn_set->produce_ppns));
740 memcpy(call_buf + ppn_set->num_produce_pages *
741 sizeof(*ppn_set->produce_ppns), ppn_set->consume_ppns,
742 ppn_set->num_consume_pages * sizeof(*ppn_set->consume_ppns));
744 return (VMCI_SUCCESS);
748 *------------------------------------------------------------------------------
750 * vmci_memcpy_{to,from}iovec --
752 * These helper routines will copy the specified bytes to/from memory that's
753 * specified as a struct iovec. The routines can not verify the correctness
754 * of the struct iovec's contents.
762 *------------------------------------------------------------------------------
766 vmci_memcpy_toiovec(struct iovec *iov, uint8_t *src, size_t len)
771 size_t to_copy = MIN(iov->iov_len, len);
772 memcpy(iov->iov_base, src, to_copy);
775 iov->iov_base = (void *)((uintptr_t) iov->iov_base +
777 iov->iov_len -= to_copy;
784 vmci_memcpy_fromiovec(uint8_t *dst, struct iovec *iov, size_t len)
789 size_t to_copy = MIN(iov->iov_len, len);
790 memcpy(dst, iov->iov_base, to_copy);
793 iov->iov_base = (void *)((uintptr_t) iov->iov_base +
795 iov->iov_len -= to_copy;
802 *------------------------------------------------------------------------------
804 * __vmci_memcpy_to_queue --
806 * Copies from a given buffer or iovector to a VMCI Queue. Assumes that
807 * offset + size does not wrap around in the queue.
810 * Zero on success, negative error code on failure.
815 *------------------------------------------------------------------------------
818 #pragma GCC diagnostic ignored "-Wcast-qual"
820 __vmci_memcpy_to_queue(struct vmci_queue *queue, uint64_t queue_offset,
821 const void *src, size_t size, bool is_iovec)
823 struct vmci_queue_kernel_if *kernel_if = queue->kernel_if;
824 size_t bytes_copied = 0;
826 while (bytes_copied < size) {
827 const uint64_t page_index =
828 (queue_offset + bytes_copied) / PAGE_SIZE;
829 const size_t page_offset =
830 (queue_offset + bytes_copied) & (PAGE_SIZE - 1);
835 va = (void *)kernel_if->dmas[page_index + 1].dma_vaddr;
839 * Fill up the page if we have enough payload, or else
840 * copy the remaining bytes.
842 to_copy = MIN(PAGE_SIZE - page_offset, size - bytes_copied);
845 struct iovec *iov = (struct iovec *)src;
847 /* The iovec will track bytes_copied internally. */
848 vmci_memcpy_fromiovec((uint8_t *)va + page_offset,
851 memcpy((uint8_t *)va + page_offset,
852 (uint8_t *)src + bytes_copied, to_copy);
853 bytes_copied += to_copy;
856 return (VMCI_SUCCESS);
860 *------------------------------------------------------------------------------
862 * __vmci_memcpy_from_queue --
864 * Copies to a given buffer or iovector from a VMCI Queue. Assumes that
865 * offset + size does not wrap around in the queue.
868 * Zero on success, negative error code on failure.
873 *------------------------------------------------------------------------------
877 __vmci_memcpy_from_queue(void *dest, const struct vmci_queue *queue,
878 uint64_t queue_offset, size_t size, bool is_iovec)
880 struct vmci_queue_kernel_if *kernel_if = queue->kernel_if;
881 size_t bytes_copied = 0;
883 while (bytes_copied < size) {
884 const uint64_t page_index =
885 (queue_offset + bytes_copied) / PAGE_SIZE;
886 const size_t page_offset =
887 (queue_offset + bytes_copied) & (PAGE_SIZE - 1);
892 va = (void *)kernel_if->dmas[page_index + 1].dma_vaddr;
896 * Fill up the page if we have enough payload, or else
897 * copy the remaining bytes.
899 to_copy = MIN(PAGE_SIZE - page_offset, size - bytes_copied);
902 struct iovec *iov = (struct iovec *)dest;
904 /* The iovec will track bytesCopied internally. */
905 vmci_memcpy_toiovec(iov, (uint8_t *)va +
906 page_offset, to_copy);
908 memcpy((uint8_t *)dest + bytes_copied,
909 (uint8_t *)va + page_offset, to_copy);
911 bytes_copied += to_copy;
914 return (VMCI_SUCCESS);
918 *------------------------------------------------------------------------------
920 * vmci_memcpy_to_queue --
922 * Copies from a given buffer to a VMCI Queue.
925 * Zero on success, negative error code on failure.
930 *------------------------------------------------------------------------------
934 vmci_memcpy_to_queue(struct vmci_queue *queue, uint64_t queue_offset,
935 const void *src, size_t src_offset, size_t size, int buf_type,
941 return (__vmci_memcpy_to_queue(queue, queue_offset,
942 (uint8_t *)src + src_offset, size, false));
946 *------------------------------------------------------------------------------
948 * vmci_memcpy_from_queue --
950 * Copies to a given buffer from a VMCI Queue.
953 * Zero on success, negative error code on failure.
958 *------------------------------------------------------------------------------
962 vmci_memcpy_from_queue(void *dest, size_t dest_offset,
963 const struct vmci_queue *queue, uint64_t queue_offset, size_t size,
964 int buf_type, bool can_block)
969 return (__vmci_memcpy_from_queue((uint8_t *)dest + dest_offset,
970 queue, queue_offset, size, false));
974 *------------------------------------------------------------------------------
976 * vmci_memcpy_to_queue_local --
978 * Copies from a given buffer to a local VMCI queue. This is the
979 * same as a regular copy.
982 * Zero on success, negative error code on failure.
987 *------------------------------------------------------------------------------
991 vmci_memcpy_to_queue_local(struct vmci_queue *queue, uint64_t queue_offset,
992 const void *src, size_t src_offset, size_t size, int buf_type,
998 return (__vmci_memcpy_to_queue(queue, queue_offset,
999 (uint8_t *)src + src_offset, size, false));
1003 *------------------------------------------------------------------------------
1005 * vmci_memcpy_from_queue_local --
1007 * Copies to a given buffer from a VMCI Queue.
1010 * Zero on success, negative error code on failure.
1015 *------------------------------------------------------------------------------
1019 vmci_memcpy_from_queue_local(void *dest, size_t dest_offset,
1020 const struct vmci_queue *queue, uint64_t queue_offset, size_t size,
1021 int buf_type, bool can_block)
1026 return (__vmci_memcpy_from_queue((uint8_t *)dest + dest_offset,
1027 queue, queue_offset, size, false));
1030 /*------------------------------------------------------------------------------
1032 * vmci_memcpy_to_queue_v --
1034 * Copies from a given iovec from a VMCI Queue.
1037 * Zero on success, negative error code on failure.
1042 *------------------------------------------------------------------------------
1046 vmci_memcpy_to_queue_v(struct vmci_queue *queue, uint64_t queue_offset,
1047 const void *src, size_t src_offset, size_t size, int buf_type,
1054 * We ignore src_offset because src is really a struct iovec * and will
1055 * maintain offset internally.
1057 return (__vmci_memcpy_to_queue(queue, queue_offset, src, size,
1062 *------------------------------------------------------------------------------
1064 * vmci_memcpy_from_queue_v --
1066 * Copies to a given iovec from a VMCI Queue.
1069 * Zero on success, negative error code on failure.
1074 *------------------------------------------------------------------------------
1078 vmci_memcpy_from_queue_v(void *dest, size_t dest_offset,
1079 const struct vmci_queue *queue, uint64_t queue_offset, size_t size,
1080 int buf_type, bool can_block)
1086 * We ignore dest_offset because dest is really a struct iovec * and
1087 * will maintain offset internally.
1089 return (__vmci_memcpy_from_queue(dest, queue, queue_offset, size,
1094 *------------------------------------------------------------------------------
1096 * vmci_read_port_bytes --
1098 * Copy memory from an I/O port to kernel memory.
1106 *------------------------------------------------------------------------------
1110 vmci_read_port_bytes(vmci_io_handle handle, vmci_io_port port, uint8_t *buffer,
1111 size_t buffer_length)
1114 insb(port, buffer, buffer_length);