1*7f9241d8SStefan Hajnoczi /*
2*7f9241d8SStefan Hajnoczi * BlockBackend RAM Registrar
3*7f9241d8SStefan Hajnoczi *
4*7f9241d8SStefan Hajnoczi * SPDX-License-Identifier: GPL-2.0-or-later
5*7f9241d8SStefan Hajnoczi */
6*7f9241d8SStefan Hajnoczi
7*7f9241d8SStefan Hajnoczi #include "qemu/osdep.h"
8*7f9241d8SStefan Hajnoczi #include "sysemu/block-backend.h"
9*7f9241d8SStefan Hajnoczi #include "sysemu/block-ram-registrar.h"
10*7f9241d8SStefan Hajnoczi #include "qapi/error.h"
11*7f9241d8SStefan Hajnoczi
ram_block_added(RAMBlockNotifier * n,void * host,size_t size,size_t max_size)12*7f9241d8SStefan Hajnoczi static void ram_block_added(RAMBlockNotifier *n, void *host, size_t size,
13*7f9241d8SStefan Hajnoczi size_t max_size)
14*7f9241d8SStefan Hajnoczi {
15*7f9241d8SStefan Hajnoczi BlockRAMRegistrar *r = container_of(n, BlockRAMRegistrar, notifier);
16*7f9241d8SStefan Hajnoczi Error *err = NULL;
17*7f9241d8SStefan Hajnoczi
18*7f9241d8SStefan Hajnoczi if (!r->ok) {
19*7f9241d8SStefan Hajnoczi return; /* don't try again if we've already failed */
20*7f9241d8SStefan Hajnoczi }
21*7f9241d8SStefan Hajnoczi
22*7f9241d8SStefan Hajnoczi if (!blk_register_buf(r->blk, host, max_size, &err)) {
23*7f9241d8SStefan Hajnoczi error_report_err(err);
24*7f9241d8SStefan Hajnoczi ram_block_notifier_remove(&r->notifier);
25*7f9241d8SStefan Hajnoczi r->ok = false;
26*7f9241d8SStefan Hajnoczi }
27*7f9241d8SStefan Hajnoczi }
28*7f9241d8SStefan Hajnoczi
ram_block_removed(RAMBlockNotifier * n,void * host,size_t size,size_t max_size)29*7f9241d8SStefan Hajnoczi static void ram_block_removed(RAMBlockNotifier *n, void *host, size_t size,
30*7f9241d8SStefan Hajnoczi size_t max_size)
31*7f9241d8SStefan Hajnoczi {
32*7f9241d8SStefan Hajnoczi BlockRAMRegistrar *r = container_of(n, BlockRAMRegistrar, notifier);
33*7f9241d8SStefan Hajnoczi blk_unregister_buf(r->blk, host, max_size);
34*7f9241d8SStefan Hajnoczi }
35*7f9241d8SStefan Hajnoczi
blk_ram_registrar_init(BlockRAMRegistrar * r,BlockBackend * blk)36*7f9241d8SStefan Hajnoczi void blk_ram_registrar_init(BlockRAMRegistrar *r, BlockBackend *blk)
37*7f9241d8SStefan Hajnoczi {
38*7f9241d8SStefan Hajnoczi r->blk = blk;
39*7f9241d8SStefan Hajnoczi r->notifier = (RAMBlockNotifier){
40*7f9241d8SStefan Hajnoczi .ram_block_added = ram_block_added,
41*7f9241d8SStefan Hajnoczi .ram_block_removed = ram_block_removed,
42*7f9241d8SStefan Hajnoczi
43*7f9241d8SStefan Hajnoczi /*
44*7f9241d8SStefan Hajnoczi * .ram_block_resized() is not necessary because we use the max_size
45*7f9241d8SStefan Hajnoczi * value that does not change across resize.
46*7f9241d8SStefan Hajnoczi */
47*7f9241d8SStefan Hajnoczi };
48*7f9241d8SStefan Hajnoczi r->ok = true;
49*7f9241d8SStefan Hajnoczi
50*7f9241d8SStefan Hajnoczi ram_block_notifier_add(&r->notifier);
51*7f9241d8SStefan Hajnoczi }
52*7f9241d8SStefan Hajnoczi
blk_ram_registrar_destroy(BlockRAMRegistrar * r)53*7f9241d8SStefan Hajnoczi void blk_ram_registrar_destroy(BlockRAMRegistrar *r)
54*7f9241d8SStefan Hajnoczi {
55*7f9241d8SStefan Hajnoczi if (r->ok) {
56*7f9241d8SStefan Hajnoczi ram_block_notifier_remove(&r->notifier);
57*7f9241d8SStefan Hajnoczi }
58*7f9241d8SStefan Hajnoczi }
59