1/*
2 * Copyright 2018, J��r��me Duval, jerome.duval@gmail.com.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef VIRTIO_BALLOON_PRIVATE_H
6#define VIRTIO_BALLOON_PRIVATE_H
7
8
9#include <condition_variable.h>
10#include <lock.h>
11#include <virtio.h>
12#include <vm/vm_page.h>
13
14
15//#define TRACE_VIRTIO_BALLOON
16#ifdef TRACE_VIRTIO_BALLOON
17#	define TRACE(x...) dprintf("virtio_balloon: " x)
18#else
19#	define TRACE(x...) ;
20#endif
21#define ERROR(x...)			dprintf("\33[33mvirtio_rng:\33[0m " x)
22#define CALLED() 			TRACE("CALLED %s\n", __PRETTY_FUNCTION__)
23
24
25extern device_manager_info* gDeviceManager;
26
27
28#define PAGES_COUNT	256
29
30
31struct PageInfo : DoublyLinkedListLinkImpl<PageInfo> {
32	vm_page *page;
33};
34
35
36typedef DoublyLinkedList<PageInfo> PageInfoList;
37
38
39
40class VirtioBalloonDevice {
41public:
42								VirtioBalloonDevice(device_node* node);
43								~VirtioBalloonDevice();
44
45			status_t			InitCheck();
46
47private:
48	static	void				_ConfigCallback(void* driverCookie);
49	static	void				_QueueCallback(void* driverCookie,
50									void *cookie);
51
52	static	int32				_ThreadEntry(void *data);
53			int32				_Thread();
54
55			uint32				_DesiredSize();
56			status_t			_UpdateSize();
57
58			device_node*		fNode;
59
60			virtio_device_interface* fVirtio;
61			virtio_device*		fVirtioDevice;
62
63			status_t			fStatus;
64			uint64				fFeatures;
65			::virtio_queue		fVirtioQueues[2];
66
67			physical_entry 		fEntry;
68			uint32				fBuffer[PAGES_COUNT];
69
70			thread_id			fThread;
71			uint32				fDesiredSize;
72			uint32				fActualSize;
73
74			spinlock			fInterruptLock;
75			ConditionVariable	fQueueCondition;
76			ConditionVariable	fConfigCondition;
77			bool				fRunning;
78
79			PageInfoList		fPages;
80};
81
82
83#endif // VIRTIO_BALLOON_PRIVATE_H
84