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)
77 *------------------------------------------------------------------------------
81 * Grabs the given lock.
89 *------------------------------------------------------------------------------
93 vmci_grab_lock(vmci_lock *lock)
100 *------------------------------------------------------------------------------
104 * Releases the given lock.
110 * A thread blocked on this lock may wake up.
112 *------------------------------------------------------------------------------
116 vmci_release_lock(vmci_lock *lock)
123 *------------------------------------------------------------------------------
127 * Grabs the given lock.
135 *------------------------------------------------------------------------------
139 vmci_grab_lock_bh(vmci_lock *lock)
146 *------------------------------------------------------------------------------
148 * vmci_release_lock_bh
150 * Releases the given lock.
158 *------------------------------------------------------------------------------
162 vmci_release_lock_bh(vmci_lock *lock)
169 *------------------------------------------------------------------------------
171 * vmci_alloc_kernel_mem
173 * Allocate physically contiguous memory for the VMCI driver.
176 * The address allocated or NULL on error.
180 * Memory may be allocated.
182 *------------------------------------------------------------------------------
186 vmci_alloc_kernel_mem(size_t size, int flags)
190 if ((flags & VMCI_MEMORY_ATOMIC) != 0)
191 ptr = contigmalloc(size, M_DEVBUF, M_NOWAIT, 0, 0xFFFFFFFF,
194 ptr = contigmalloc(size, M_DEVBUF, M_WAITOK, 0, 0xFFFFFFFF,
201 *------------------------------------------------------------------------------
203 * vmci_free_kernel_mem
205 * Free kernel memory allocated for the VMCI driver.
213 *------------------------------------------------------------------------------
217 vmci_free_kernel_mem(void *ptr, size_t size)
220 contigfree(ptr, size, M_DEVBUF);
224 *------------------------------------------------------------------------------
226 * vmci_can_schedule_delayed_work --
228 * Checks to see if the given platform supports delayed work callbacks.
231 * true if it does. false otherwise.
236 *------------------------------------------------------------------------------
240 vmci_can_schedule_delayed_work(void)
247 *------------------------------------------------------------------------------
249 * vmci_schedule_delayed_work --
251 * Schedule the specified callback.
254 * Zero on success, error code otherwise.
259 *------------------------------------------------------------------------------
263 vmci_schedule_delayed_work(vmci_work_fn *work_fn, void *data)
266 return (vmci_schedule_delayed_work_fn(work_fn, data));
270 *------------------------------------------------------------------------------
272 * vmci_create_event --
280 *------------------------------------------------------------------------------
284 vmci_create_event(vmci_event *event)
287 sema_init(event, 0, "vmci_event");
291 *------------------------------------------------------------------------------
293 * vmci_destroy_event --
301 *------------------------------------------------------------------------------
305 vmci_destroy_event(vmci_event *event)
308 if (mtx_owned(&event->sema_mtx))
313 *------------------------------------------------------------------------------
315 * vmci_signal_event --
323 *------------------------------------------------------------------------------
327 vmci_signal_event(vmci_event *event)
334 *------------------------------------------------------------------------------
336 * vmci_wait_on_event --
344 *------------------------------------------------------------------------------
348 vmci_wait_on_event(vmci_event *event, vmci_event_release_cb release_cb,
352 release_cb(client_data);
357 *------------------------------------------------------------------------------
361 * Initializes the mutex. Must be called before use.
369 *------------------------------------------------------------------------------
373 vmci_mutex_init(vmci_mutex *mutex, char *name)
376 mtx_init(mutex, name, NULL, MTX_DEF | MTX_NOWITNESS);
377 return (VMCI_SUCCESS);
381 *------------------------------------------------------------------------------
383 * vmci_mutex_destroy --
385 * Destroys the mutex.
393 *------------------------------------------------------------------------------
397 vmci_mutex_destroy(vmci_mutex *mutex)
404 *------------------------------------------------------------------------------
406 * vmci_mutex_acquire --
408 * Acquires the mutex.
416 *------------------------------------------------------------------------------
420 vmci_mutex_acquire(vmci_mutex *mutex)
427 *------------------------------------------------------------------------------
429 * vmci_mutex_release --
431 * Releases the mutex.
437 * May wake up the thread blocking on this mutex.
439 *------------------------------------------------------------------------------
443 vmci_mutex_release(vmci_mutex *mutex)
450 *------------------------------------------------------------------------------
452 * vmci_alloc_queue --
454 * Allocates kernel queue pages of specified size with IOMMU mappings, plus
455 * space for the queue structure/kernel interface and the queue header.
458 * Pointer to the queue on success, NULL otherwise.
461 * Memory is allocated.
463 *------------------------------------------------------------------------------
467 vmci_alloc_queue(uint64_t size, uint32_t flags)
469 struct vmci_queue *queue;
471 const size_t num_pages = CEILING(size, PAGE_SIZE) + 1;
472 const size_t dmas_size = num_pages * sizeof(struct vmci_dma_alloc);
473 const size_t queue_size =
474 sizeof(*queue) + sizeof(*(queue->kernel_if)) + dmas_size;
476 /* Size should be enforced by vmci_qpair_alloc(), double-check here. */
477 if (size > VMCI_MAX_GUEST_QP_MEMORY) {
482 queue = malloc(queue_size, M_DEVBUF, M_NOWAIT);
486 queue->q_header = NULL;
487 queue->saved_header = NULL;
488 queue->kernel_if = (struct vmci_queue_kernel_if *)(queue + 1);
489 queue->kernel_if->num_pages = num_pages;
490 queue->kernel_if->dmas = (struct vmci_dma_alloc *)(queue->kernel_if +
492 for (i = 0; i < num_pages; i++) {
493 vmci_dma_malloc(PAGE_SIZE, 1, &queue->kernel_if->dmas[i]);
494 if (!queue->kernel_if->dmas[i].dma_vaddr) {
495 /* Size excl. the header. */
496 vmci_free_queue(queue, i * PAGE_SIZE);
501 /* Queue header is the first page. */
502 queue->q_header = (void *)queue->kernel_if->dmas[0].dma_vaddr;
504 return ((void *)queue);
508 *------------------------------------------------------------------------------
512 * Frees kernel VA space for a given queue and its queue header, and frees
513 * physical data pages.
521 *------------------------------------------------------------------------------
525 vmci_free_queue(void *q, uint64_t size)
527 struct vmci_queue *queue = q;
530 const size_t num_pages = CEILING(size, PAGE_SIZE) + 1;
533 /* Given size doesn't include header, so add in a page here. */
534 for (i = 0; i < num_pages; i++)
535 vmci_dma_free(&queue->kernel_if->dmas[i]);
536 free(queue, M_DEVBUF);
541 *------------------------------------------------------------------------------
543 * vmci_alloc_ppn_set --
545 * Allocates two list of PPNs --- one for the pages in the produce queue,
546 * and the other for the pages in the consume queue. Intializes the list of
547 * PPNs with the page frame numbers of the KVA for the two queues (and the
551 * Success or failure.
554 * Memory may be allocated.
556 *-----------------------------------------------------------------------------
560 vmci_alloc_ppn_set(void *prod_q, uint64_t num_produce_pages, void *cons_q,
561 uint64_t num_consume_pages, struct ppn_set *ppn_set)
563 struct vmci_queue *consume_q = cons_q;
564 struct vmci_queue *produce_q = prod_q;
565 vmci_ppn_list consume_ppns;
566 vmci_ppn_list produce_ppns;
569 if (!produce_q || !num_produce_pages || !consume_q ||
570 !num_consume_pages || !ppn_set)
571 return (VMCI_ERROR_INVALID_ARGS);
573 if (ppn_set->initialized)
574 return (VMCI_ERROR_ALREADY_EXISTS);
577 vmci_alloc_kernel_mem(num_produce_pages * sizeof(*produce_ppns),
580 return (VMCI_ERROR_NO_MEM);
583 vmci_alloc_kernel_mem(num_consume_pages * sizeof(*consume_ppns),
586 vmci_free_kernel_mem(produce_ppns,
587 num_produce_pages * sizeof(*produce_ppns));
588 return (VMCI_ERROR_NO_MEM);
591 for (i = 0; i < num_produce_pages; i++) {
595 pfn = produce_q->kernel_if->dmas[i].dma_paddr >> PAGE_SHIFT;
598 * Fail allocation if PFN isn't supported by hypervisor.
602 sizeof(*produce_ppns) && pfn != produce_ppns[i])
605 for (i = 0; i < num_consume_pages; i++) {
609 pfn = consume_q->kernel_if->dmas[i].dma_paddr >> PAGE_SHIFT;
612 * Fail allocation if PFN isn't supported by hypervisor.
616 sizeof(*consume_ppns) && pfn != consume_ppns[i])
621 ppn_set->num_produce_pages = num_produce_pages;
622 ppn_set->num_consume_pages = num_consume_pages;
623 ppn_set->produce_ppns = produce_ppns;
624 ppn_set->consume_ppns = consume_ppns;
625 ppn_set->initialized = true;
626 return (VMCI_SUCCESS);
629 vmci_free_kernel_mem(produce_ppns, num_produce_pages *
630 sizeof(*produce_ppns));
631 vmci_free_kernel_mem(consume_ppns, num_consume_pages *
632 sizeof(*consume_ppns));
633 return (VMCI_ERROR_INVALID_ARGS);
637 *------------------------------------------------------------------------------
639 * vmci_free_ppn_set --
641 * Frees the two list of PPNs for a queue pair.
649 *------------------------------------------------------------------------------
653 vmci_free_ppn_set(struct ppn_set *ppn_set)
657 if (ppn_set->initialized) {
658 /* Do not call these functions on NULL inputs. */
659 ASSERT(ppn_set->produce_ppns && ppn_set->consume_ppns);
660 vmci_free_kernel_mem(ppn_set->produce_ppns,
661 ppn_set->num_produce_pages *
662 sizeof(*ppn_set->produce_ppns));
663 vmci_free_kernel_mem(ppn_set->consume_ppns,
664 ppn_set->num_consume_pages *
665 sizeof(*ppn_set->consume_ppns));
667 memset(ppn_set, 0, sizeof(*ppn_set));
671 *------------------------------------------------------------------------------
673 * vmci_populate_ppn_list --
675 * Populates the list of PPNs in the hypercall structure with the PPNS
676 * of the produce queue and the consume queue.
684 *------------------------------------------------------------------------------
688 vmci_populate_ppn_list(uint8_t *call_buf, const struct ppn_set *ppn_set)
691 ASSERT(call_buf && ppn_set && ppn_set->initialized);
692 memcpy(call_buf, ppn_set->produce_ppns,
693 ppn_set->num_produce_pages * sizeof(*ppn_set->produce_ppns));
694 memcpy(call_buf + ppn_set->num_produce_pages *
695 sizeof(*ppn_set->produce_ppns), ppn_set->consume_ppns,
696 ppn_set->num_consume_pages * sizeof(*ppn_set->consume_ppns));
698 return (VMCI_SUCCESS);
702 *------------------------------------------------------------------------------
704 * vmci_memcpy_{to,from}iovec --
706 * These helper routines will copy the specified bytes to/from memory that's
707 * specified as a struct iovec. The routines can not verify the correctness
708 * of the struct iovec's contents.
716 *------------------------------------------------------------------------------
720 vmci_memcpy_toiovec(struct iovec *iov, uint8_t *src, size_t len)
725 size_t to_copy = MIN(iov->iov_len, len);
726 memcpy(iov->iov_base, src, to_copy);
729 iov->iov_base = (void *)((uintptr_t) iov->iov_base +
731 iov->iov_len -= to_copy;
738 vmci_memcpy_fromiovec(uint8_t *dst, struct iovec *iov, size_t len)
743 size_t to_copy = MIN(iov->iov_len, len);
744 memcpy(dst, iov->iov_base, to_copy);
747 iov->iov_base = (void *)((uintptr_t) iov->iov_base +
749 iov->iov_len -= to_copy;
756 *------------------------------------------------------------------------------
758 * __vmci_memcpy_to_queue --
760 * Copies from a given buffer or iovector to a VMCI Queue. Assumes that
761 * offset + size does not wrap around in the queue.
764 * Zero on success, negative error code on failure.
769 *------------------------------------------------------------------------------
772 #pragma GCC diagnostic ignored "-Wcast-qual"
774 __vmci_memcpy_to_queue(struct vmci_queue *queue, uint64_t queue_offset,
775 const void *src, size_t size, bool is_iovec)
777 struct vmci_queue_kernel_if *kernel_if = queue->kernel_if;
778 size_t bytes_copied = 0;
780 while (bytes_copied < size) {
781 const uint64_t page_index =
782 (queue_offset + bytes_copied) / PAGE_SIZE;
783 const size_t page_offset =
784 (queue_offset + bytes_copied) & (PAGE_SIZE - 1);
789 va = (void *)kernel_if->dmas[page_index + 1].dma_vaddr;
793 * Fill up the page if we have enough payload, or else
794 * copy the remaining bytes.
796 to_copy = MIN(PAGE_SIZE - page_offset, size - bytes_copied);
799 struct iovec *iov = (struct iovec *)src;
801 /* The iovec will track bytes_copied internally. */
802 vmci_memcpy_fromiovec((uint8_t *)va + page_offset,
805 memcpy((uint8_t *)va + page_offset,
806 (uint8_t *)src + bytes_copied, to_copy);
807 bytes_copied += to_copy;
810 return (VMCI_SUCCESS);
814 *------------------------------------------------------------------------------
816 * __vmci_memcpy_from_queue --
818 * Copies to a given buffer or iovector from a VMCI Queue. Assumes that
819 * offset + size does not wrap around in the queue.
822 * Zero on success, negative error code on failure.
827 *------------------------------------------------------------------------------
831 __vmci_memcpy_from_queue(void *dest, const struct vmci_queue *queue,
832 uint64_t queue_offset, size_t size, bool is_iovec)
834 struct vmci_queue_kernel_if *kernel_if = queue->kernel_if;
835 size_t bytes_copied = 0;
837 while (bytes_copied < size) {
838 const uint64_t page_index =
839 (queue_offset + bytes_copied) / PAGE_SIZE;
840 const size_t page_offset =
841 (queue_offset + bytes_copied) & (PAGE_SIZE - 1);
846 va = (void *)kernel_if->dmas[page_index + 1].dma_vaddr;
850 * Fill up the page if we have enough payload, or else
851 * copy the remaining bytes.
853 to_copy = MIN(PAGE_SIZE - page_offset, size - bytes_copied);
856 struct iovec *iov = (struct iovec *)dest;
858 /* The iovec will track bytesCopied internally. */
859 vmci_memcpy_toiovec(iov, (uint8_t *)va +
860 page_offset, to_copy);
862 memcpy((uint8_t *)dest + bytes_copied,
863 (uint8_t *)va + page_offset, to_copy);
865 bytes_copied += to_copy;
868 return (VMCI_SUCCESS);
872 *------------------------------------------------------------------------------
874 * vmci_memcpy_to_queue --
876 * Copies from a given buffer to a VMCI Queue.
879 * Zero on success, negative error code on failure.
884 *------------------------------------------------------------------------------
888 vmci_memcpy_to_queue(struct vmci_queue *queue, uint64_t queue_offset,
889 const void *src, size_t src_offset, size_t size, int buf_type,
895 return (__vmci_memcpy_to_queue(queue, queue_offset,
896 (uint8_t *)src + src_offset, size, false));
900 *------------------------------------------------------------------------------
902 * vmci_memcpy_from_queue --
904 * Copies to a given buffer from a VMCI Queue.
907 * Zero on success, negative error code on failure.
912 *------------------------------------------------------------------------------
916 vmci_memcpy_from_queue(void *dest, size_t dest_offset,
917 const struct vmci_queue *queue, uint64_t queue_offset, size_t size,
918 int buf_type, bool can_block)
923 return (__vmci_memcpy_from_queue((uint8_t *)dest + dest_offset,
924 queue, queue_offset, size, false));
928 *------------------------------------------------------------------------------
930 * vmci_memcpy_to_queue_local --
932 * Copies from a given buffer to a local VMCI queue. This is the
933 * same as a regular copy.
936 * Zero on success, negative error code on failure.
941 *------------------------------------------------------------------------------
945 vmci_memcpy_to_queue_local(struct vmci_queue *queue, uint64_t queue_offset,
946 const void *src, size_t src_offset, size_t size, int buf_type,
952 return (__vmci_memcpy_to_queue(queue, queue_offset,
953 (uint8_t *)src + src_offset, size, false));
957 *------------------------------------------------------------------------------
959 * vmci_memcpy_from_queue_local --
961 * Copies to a given buffer from a VMCI Queue.
964 * Zero on success, negative error code on failure.
969 *------------------------------------------------------------------------------
973 vmci_memcpy_from_queue_local(void *dest, size_t dest_offset,
974 const struct vmci_queue *queue, uint64_t queue_offset, size_t size,
975 int buf_type, bool can_block)
980 return (__vmci_memcpy_from_queue((uint8_t *)dest + dest_offset,
981 queue, queue_offset, size, false));
984 /*------------------------------------------------------------------------------
986 * vmci_memcpy_to_queue_v --
988 * Copies from a given iovec from a VMCI Queue.
991 * Zero on success, negative error code on failure.
996 *------------------------------------------------------------------------------
1000 vmci_memcpy_to_queue_v(struct vmci_queue *queue, uint64_t queue_offset,
1001 const void *src, size_t src_offset, size_t size, int buf_type,
1008 * We ignore src_offset because src is really a struct iovec * and will
1009 * maintain offset internally.
1011 return (__vmci_memcpy_to_queue(queue, queue_offset, src, size,
1016 *------------------------------------------------------------------------------
1018 * vmci_memcpy_from_queue_v --
1020 * Copies to a given iovec from a VMCI Queue.
1023 * Zero on success, negative error code on failure.
1028 *------------------------------------------------------------------------------
1032 vmci_memcpy_from_queue_v(void *dest, size_t dest_offset,
1033 const struct vmci_queue *queue, uint64_t queue_offset, size_t size,
1034 int buf_type, bool can_block)
1040 * We ignore dest_offset because dest is really a struct iovec * and
1041 * will maintain offset internally.
1043 return (__vmci_memcpy_from_queue(dest, queue, queue_offset, size,
1048 *------------------------------------------------------------------------------
1050 * vmci_read_port_bytes --
1052 * Copy memory from an I/O port to kernel memory.
1060 *------------------------------------------------------------------------------
1064 vmci_read_port_bytes(vmci_io_handle handle, vmci_io_port port, uint8_t *buffer,
1065 size_t buffer_length)
1068 insb(port, buffer, buffer_length);