Re: [PATCH] tests: fix a memory in test_socket_unix_abstract_good

2020-06-03 Thread xiaoqiang zhao

在 2020/6/4 上午12:14, Li Qiang 写道:

After build qemu with '-fsanitize=address' extra-cflags,
'make check' show following leak:

=
==44580==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 2500 byte(s) in 1 object(s) allocated from:
 #0 0x7f1b5a8b8d28 in __interceptor_calloc 
(/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
 #1 0x7f1b5a514b10 in g_malloc0 
(/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x51b10)
 #2 0xd79ea4e4c0ad31c3  ()

SUMMARY: AddressSanitizer: 2500 byte(s) leaked in 1 allocation(s).

Call 'g_rand_free' in the end of function to avoid this.

Fixes: 4d3a329af59("tests/util-sockets: add abstract unix socket cases")
Signed-off-by: Li Qiang 
---
  tests/test-util-sockets.c | 1 +
  1 file changed, 1 insertion(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 2ca1e99f17..ca6671f9bf 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -312,6 +312,7 @@ static void test_socket_unix_abstract_good(void)
  g_thread_join(serv);
  
  g_free(abstract_sock_name);

+g_rand_free(r);
  }
  #endif
  


Reviewed-by:  xiaoqiang zhao 




Re: [PATCH v6 3/3] qemu-options: updates for abstract unix sockets

2020-05-15 Thread xiaoqiang zhao

在 2020/5/16 上午11:13, xiaoqiang zhao 写道:

add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
  qemu-options.hx | 8 ++--
  1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index e2dca8a4e9..4ee7e6c772 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2938,7 +2938,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
  " 
[,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n"
  " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] 
(tcp)\n"
  "-chardev 
socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n"
-" [,mux=on|off][,logfile=PATH][,logappend=on|off] (unix)\n"
+" 
[,mux=on|off][,logfile=PATH][,logappend=on|off][,abstract=on|off][,tight=on|off] 
(unix)\n"
  "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
  " [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n"
  " [,logfile=PATH][,logappend=on|off]\n"
@@ -3105,9 +3105,13 @@ The available backends are:
  
  ``nodelay`` disables the Nagle algorithm.
  
-``unix options: path=path``

+``unix options: path=path[,abstract=on|off][,tight=on|off]``
  ``path`` specifies the local path of the unix socket. ``path``
  is required.
+   ``abstract`` specifies the use of the abstract socket namespace,
+rather than the filesystem.  Optional, defaults to false.
+   ``tight`` sets the socket length of abstract sockets to their minimum,
+rather than the full sun_path length.  Optional, defaults to true.
  
  ``-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]``

  Sends all traffic from the guest to a remote host over UDP.


Daniel,  is this still okay for you ?

I have already include a Reviewed-by tag by mistake  ;-(




[PATCH v6 2/3] tests/util-sockets: add abstract unix socket cases

2020-05-15 Thread xiaoqiang zhao
add cases to test tight and non-tight for abstract address type

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 tests/test-util-sockets.c | 92 +++
 1 file changed, 92 insertions(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 5fd947c7bf..2ca1e99f17 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -227,6 +227,93 @@ static void test_socket_fd_pass_num_nocli(void)
 g_free(addr.u.fd.str);
 }
 
+#ifdef __linux__
+static gchar *abstract_sock_name;
+
+static gpointer unix_server_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+int connfd = -1;
+struct sockaddr_un un;
+socklen_t len = sizeof(un);
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = abstract_sock_name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_listen(, 1, );
+g_assert_cmpint(fd, >=, 0);
+g_assert(fd_is_socket(fd));
+
+connfd = accept(fd, (struct sockaddr *), );
+g_assert_cmpint(connfd, !=, -1);
+
+close(fd);
+
+return NULL;
+}
+
+static gpointer unix_client_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = abstract_sock_name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_connect(, );
+
+g_assert_cmpint(fd, >=, 0);
+
+close(fd);
+
+return NULL;
+}
+
+static void test_socket_unix_abstract_good(void)
+{
+GRand *r = g_rand_new();
+
+abstract_sock_name = g_strdup_printf("unix-%d-%d", getpid(),
+ g_rand_int_range(r, 100, 1000));
+
+/* non tight socklen serv and cli */
+GThread *serv = g_thread_new("abstract_unix_server",
+ unix_server_thread_func,
+ NULL);
+
+sleep(1);
+
+GThread *cli = g_thread_new("abstract_unix_client",
+unix_client_thread_func,
+NULL);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+/* tight socklen serv and cli */
+serv = g_thread_new("abstract_unix_server",
+unix_server_thread_func,
+(gpointer)1);
+
+sleep(1);
+
+cli = g_thread_new("abstract_unix_client",
+   unix_client_thread_func,
+   (gpointer)1);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+g_free(abstract_sock_name);
+}
+#endif
 
 int main(int argc, char **argv)
 {
@@ -265,6 +352,11 @@ int main(int argc, char **argv)
 test_socket_fd_pass_num_nocli);
 }
 
+#ifdef __linux__
+g_test_add_func("/util/socket/unix-abstract/good",
+test_socket_unix_abstract_good);
+#endif
+
 end:
 return g_test_run();
 }
-- 
2.17.1




[PATCH v6 3/3] qemu-options: updates for abstract unix sockets

2020-05-15 Thread xiaoqiang zhao
add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 qemu-options.hx | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index e2dca8a4e9..4ee7e6c772 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2938,7 +2938,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
 " 
[,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] 
(tcp)\n"
 "-chardev 
socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n"
-" [,mux=on|off][,logfile=PATH][,logappend=on|off] (unix)\n"
+" 
[,mux=on|off][,logfile=PATH][,logappend=on|off][,abstract=on|off][,tight=on|off]
 (unix)\n"
 "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
 " [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off]\n"
@@ -3105,9 +3105,13 @@ The available backends are:
 
 ``nodelay`` disables the Nagle algorithm.
 
-``unix options: path=path``
+``unix options: path=path[,abstract=on|off][,tight=on|off]``
 ``path`` specifies the local path of the unix socket. ``path``
 is required.
+   ``abstract`` specifies the use of the abstract socket namespace,
+rather than the filesystem.  Optional, defaults to false.
+   ``tight`` sets the socket length of abstract sockets to their minimum,
+rather than the full sun_path length.  Optional, defaults to true.
 
 ``-chardev 
udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]``
 Sends all traffic from the guest to a remote host over UDP.
-- 
2.17.1




[PATCH v6 1/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-15 Thread xiaoqiang zhao
unix_listen/connect_saddr now support abstract address types

two aditional BOOL switches are introduced:
tight: whether to set @addrlen to the minimal string length,
   or the maximum sun_path length. default is TRUE
abstract: whether we use abstract address. default is FALSE

cli example:
-monitor unix:/tmp/unix.socket,abstract,tight=off
OR
-chardev socket,path=/tmp/unix.socket,id=unix1,abstract,tight=on

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 chardev/char-socket.c |  4 
 chardev/char.c|  7 +++
 qapi/sockets.json |  8 +++-
 util/qemu-sockets.c   | 39 ---
 4 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 232e0a8604..e77699db48 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1380,6 +1380,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 const char *host = qemu_opt_get(opts, "host");
 const char *port = qemu_opt_get(opts, "port");
 const char *fd = qemu_opt_get(opts, "fd");
+bool tight = qemu_opt_get_bool(opts, "tight", true);
+bool abstract = qemu_opt_get_bool(opts, "abstract", false);
 SocketAddressLegacy *addr;
 ChardevSocket *sock;
 
@@ -1431,6 +1433,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
 q_unix->path = g_strdup(path);
+q_unix->tight = tight;
+q_unix->abstract = abstract;
 } else if (host) {
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
 addr->u.inet.data = g_new(InetSocketAddress, 1);
diff --git a/chardev/char.c b/chardev/char.c
index 0196e2887b..ea06c5ff4d 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -939,6 +939,13 @@ QemuOptsList qemu_chardev_opts = {
 },{
 .name = "logappend",
 .type = QEMU_OPT_BOOL,
+},{
+.name = "tight",
+.type = QEMU_OPT_BOOL,
+.def_value_str = "on",
+},{
+.name = "abstract",
+.type = QEMU_OPT_BOOL,
 },
 { /* end of list */ }
 },
diff --git a/qapi/sockets.json b/qapi/sockets.json
index ea933ed4b2..cbd6ef35d0 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -73,12 +73,18 @@
 # Captures a socket address in the local ("Unix socket") namespace.
 #
 # @path: filesystem path to use
+# @tight: pass a socket address length confined to the minimum length of the
+# abstract string, rather than the full sockaddr_un record length
+# (only matters for abstract sockets, default true). (Since 5.1)
+# @abstract: whether this is an abstract address, default false. (Since 5.1)
 #
 # Since: 1.3
 ##
 { 'struct': 'UnixSocketAddress',
   'data': {
-'path': 'str' } }
+'path': 'str',
+'*tight': 'bool',
+'*abstract': 'bool' } }
 
 ##
 # @VsockSocketAddress:
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 86c48b9fa5..b37d288866 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -863,6 +863,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 char *pathbuf = NULL;
 const char *path;
 size_t pathlen;
+size_t addrlen;
 
 sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 if (sock < 0) {
@@ -879,9 +880,11 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 }
 
 pathlen = strlen(path);
-if (pathlen > sizeof(un.sun_path)) {
+if (pathlen > sizeof(un.sun_path) ||
+(saddr->abstract && pathlen > (sizeof(un.sun_path) - 1))) {
 error_setg(errp, "UNIX socket path '%s' is too long", path);
 error_append_hint(errp, "Path must be less than %zu bytes\n",
+  saddr->abstract ? sizeof(un.sun_path) - 1 :
   sizeof(un.sun_path));
 goto err;
 }
@@ -903,7 +906,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 close(fd);
 }
 
-if (unlink(path) < 0 && errno != ENOENT) {
+if (!saddr->abstract && unlink(path) < 0 && errno != ENOENT) {
 error_setg_errno(errp, errno,
  "Failed to unlink socket %s", path);
 goto err;
@@ -911,9 +914,19 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 
 memset(, 0, sizeof(un));
 un.sun_family = AF_UNIX;
-memcpy(un.sun_path, path, pathlen);
+addrlen = sizeof(un);
 
-if (bind(sock, (struct sockaddr*) , sizeof(un)) < 0) {
+if (saddr->abstract) {
+un.sun_path[0] = '\0';
+memcpy(_path[1], path, pathlen);
+if (saddr->tight) {
+addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + p

[PATCH v6 0/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-15 Thread xiaoqiang zhao
qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.

Changes since v5: 
* rebase on master
* refine document statement

v4 -> v5: 
* fix typo and coding style problems

v3 -> v4: 
* rebase on master
* refine qapi document statement
* use random names to avoid name clash in unit test

Xiaoqiang Zhao (3):
  qemu-sockets: add abstract UNIX domain socket support
  tests/util-sockets: add abstract unix socket cases
  qemu-options: updates for abstract unix sockets

 chardev/char-socket.c |  4 ++
 chardev/char.c|  7 +++
 qapi/sockets.json |  8 +++-
 qemu-options.hx   |  8 +++-
 tests/test-util-sockets.c | 92 +++
 util/qemu-sockets.c   | 39 ++---
 6 files changed, 148 insertions(+), 10 deletions(-)

-- 
2.17.1




Re: [PATCH v4 3/3] qemu-options: updates for abstract unix sockets

2020-05-15 Thread xiaoqiang zhao

在 2020/5/16 上午1:37, Eric Blake 写道:

On 5/14/20 11:32 PM, xiaoqiang zhao wrote:

add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
  qemu-options.hx | 9 +++--
  1 file changed, 7 insertions(+), 2 deletions(-)


I'd suggest listing 'abstract' before 'tight', since 'tight' only 
matters for abstract.  I also have grammar suggestions:



-    ``unix options: path=path``
+    ``unix options: path=path[,tight=on|off][,abstract=on|off]``
  ``path`` specifies the local path of the unix socket. ``path``
  is required.
+    ``tight`` whether to set @addrlen to the minimal string length,
+    or the maximum sun_path length. defaults to true. ``tight`` is
+    optional.
+    ``abstract`` whether use abstract address. defaults to false.
+    ``abstract`` is optional.


``abstract`` specifies the use of the abstract socket namespace, 
rather than the filesystem.  Optional, defaults to false.
``tight`` sets the socket length of abstract sockets to their minimum, 
rather than the full sun_path length.  Optional, defaults to true.



Reasonable,  will change in v6




[PATCH v5 1/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-15 Thread xiaoqiang zhao
unix_listen/connect_saddr now support abstract address types

two aditional BOOL switches are introduced:
tight: whether to set @addrlen to the minimal string length,
   or the maximum sun_path length. default is TRUE
abstract: whether we use abstract address. default is FALSE

cli example:
-monitor unix:/tmp/unix.socket,abstract,tight=off
OR
-chardev socket,path=/tmp/unix.socket,id=unix1,abstract,tight=on

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 chardev/char-socket.c |  4 
 chardev/char.c|  7 +++
 qapi/sockets.json |  8 +++-
 util/qemu-sockets.c   | 39 ---
 4 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 185fe38dda..16f2211091 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1380,6 +1380,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 const char *host = qemu_opt_get(opts, "host");
 const char *port = qemu_opt_get(opts, "port");
 const char *fd = qemu_opt_get(opts, "fd");
+bool tight = qemu_opt_get_bool(opts, "tight", true);
+bool abstract = qemu_opt_get_bool(opts, "abstract", false);
 SocketAddressLegacy *addr;
 ChardevSocket *sock;
 
@@ -1431,6 +1433,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
 q_unix->path = g_strdup(path);
+q_unix->tight = tight;
+q_unix->abstract = abstract;
 } else if (host) {
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
 addr->u.inet.data = g_new(InetSocketAddress, 1);
diff --git a/chardev/char.c b/chardev/char.c
index e77564060d..f44fda3a92 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -939,6 +939,13 @@ QemuOptsList qemu_chardev_opts = {
 },{
 .name = "logappend",
 .type = QEMU_OPT_BOOL,
+},{
+.name = "tight",
+.type = QEMU_OPT_BOOL,
+.def_value_str = "on",
+},{
+.name = "abstract",
+.type = QEMU_OPT_BOOL,
 },
 { /* end of list */ }
 },
diff --git a/qapi/sockets.json b/qapi/sockets.json
index ea933ed4b2..cbd6ef35d0 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -73,12 +73,18 @@
 # Captures a socket address in the local ("Unix socket") namespace.
 #
 # @path: filesystem path to use
+# @tight: pass a socket address length confined to the minimum length of the
+# abstract string, rather than the full sockaddr_un record length
+# (only matters for abstract sockets, default true). (Since 5.1)
+# @abstract: whether this is an abstract address, default false. (Since 5.1)
 #
 # Since: 1.3
 ##
 { 'struct': 'UnixSocketAddress',
   'data': {
-'path': 'str' } }
+'path': 'str',
+'*tight': 'bool',
+'*abstract': 'bool' } }
 
 ##
 # @VsockSocketAddress:
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 86c48b9fa5..b37d288866 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -863,6 +863,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 char *pathbuf = NULL;
 const char *path;
 size_t pathlen;
+size_t addrlen;
 
 sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 if (sock < 0) {
@@ -879,9 +880,11 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 }
 
 pathlen = strlen(path);
-if (pathlen > sizeof(un.sun_path)) {
+if (pathlen > sizeof(un.sun_path) ||
+(saddr->abstract && pathlen > (sizeof(un.sun_path) - 1))) {
 error_setg(errp, "UNIX socket path '%s' is too long", path);
 error_append_hint(errp, "Path must be less than %zu bytes\n",
+  saddr->abstract ? sizeof(un.sun_path) - 1 :
   sizeof(un.sun_path));
 goto err;
 }
@@ -903,7 +906,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 close(fd);
 }
 
-if (unlink(path) < 0 && errno != ENOENT) {
+if (!saddr->abstract && unlink(path) < 0 && errno != ENOENT) {
 error_setg_errno(errp, errno,
  "Failed to unlink socket %s", path);
 goto err;
@@ -911,9 +914,19 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 
 memset(, 0, sizeof(un));
 un.sun_family = AF_UNIX;
-memcpy(un.sun_path, path, pathlen);
+addrlen = sizeof(un);
 
-if (bind(sock, (struct sockaddr*) , sizeof(un)) < 0) {
+if (saddr->abstract) {
+un.sun_path[0] = '\0';
+memcpy(_path[1], path, pathlen);
+if (saddr->tight) {
+addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + p

[PATCH v5 0/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-15 Thread xiaoqiang zhao
qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.

Changes since v4:
* fix typo and coding style problems

v3 -> v4: 
* rebase on master
* refine qapi document statement
* use random names to avoid name clash in unit test

Xiaoqiang Zhao (3):
  qemu-sockets: add abstract UNIX domain socket support
  tests/util-sockets: add abstract unix socket cases
  qemu-options: updates for abstract unix sockets

 chardev/char-socket.c |  4 ++
 chardev/char.c|  7 +++
 qapi/sockets.json |  8 +++-
 qemu-options.hx   |  9 +++-
 tests/test-util-sockets.c | 92 +++
 util/qemu-sockets.c   | 39 ++---
 6 files changed, 149 insertions(+), 10 deletions(-)

-- 
2.17.1




[PATCH v5 2/3] tests/util-sockets: add abstract unix socket cases

2020-05-15 Thread xiaoqiang zhao
add cases to test tight and non-tight for abstract address type

Signed-off-by: xiaoqiang zhao 
---
 tests/test-util-sockets.c | 92 +++
 1 file changed, 92 insertions(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 5fd947c7bf..2ca1e99f17 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -227,6 +227,93 @@ static void test_socket_fd_pass_num_nocli(void)
 g_free(addr.u.fd.str);
 }
 
+#ifdef __linux__
+static gchar *abstract_sock_name;
+
+static gpointer unix_server_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+int connfd = -1;
+struct sockaddr_un un;
+socklen_t len = sizeof(un);
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = abstract_sock_name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_listen(, 1, );
+g_assert_cmpint(fd, >=, 0);
+g_assert(fd_is_socket(fd));
+
+connfd = accept(fd, (struct sockaddr *), );
+g_assert_cmpint(connfd, !=, -1);
+
+close(fd);
+
+return NULL;
+}
+
+static gpointer unix_client_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = abstract_sock_name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_connect(, );
+
+g_assert_cmpint(fd, >=, 0);
+
+close(fd);
+
+return NULL;
+}
+
+static void test_socket_unix_abstract_good(void)
+{
+GRand *r = g_rand_new();
+
+abstract_sock_name = g_strdup_printf("unix-%d-%d", getpid(),
+ g_rand_int_range(r, 100, 1000));
+
+/* non tight socklen serv and cli */
+GThread *serv = g_thread_new("abstract_unix_server",
+ unix_server_thread_func,
+ NULL);
+
+sleep(1);
+
+GThread *cli = g_thread_new("abstract_unix_client",
+unix_client_thread_func,
+NULL);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+/* tight socklen serv and cli */
+serv = g_thread_new("abstract_unix_server",
+unix_server_thread_func,
+(gpointer)1);
+
+sleep(1);
+
+cli = g_thread_new("abstract_unix_client",
+   unix_client_thread_func,
+   (gpointer)1);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+g_free(abstract_sock_name);
+}
+#endif
 
 int main(int argc, char **argv)
 {
@@ -265,6 +352,11 @@ int main(int argc, char **argv)
 test_socket_fd_pass_num_nocli);
 }
 
+#ifdef __linux__
+g_test_add_func("/util/socket/unix-abstract/good",
+test_socket_unix_abstract_good);
+#endif
+
 end:
 return g_test_run();
 }
-- 
2.17.1




[PATCH v5 3/3] qemu-options: updates for abstract unix sockets

2020-05-15 Thread xiaoqiang zhao
add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 qemu-options.hx | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index e2dca8a4e9..e63cc1b4b4 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2938,7 +2938,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
 " 
[,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] 
(tcp)\n"
 "-chardev 
socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n"
-" [,mux=on|off][,logfile=PATH][,logappend=on|off] (unix)\n"
+" 
[,mux=on|off][,logfile=PATH][,logappend=on|off][,tight=on|off][,abstract=on|off]
 (unix)\n"
 "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
 " [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off]\n"
@@ -3105,9 +3105,14 @@ The available backends are:
 
 ``nodelay`` disables the Nagle algorithm.
 
-``unix options: path=path``
+``unix options: path=path[,tight=on|off][,abstract=on|off]``
 ``path`` specifies the local path of the unix socket. ``path``
 is required.
+   ``tight`` whether to set @addrlen to the minimal string length,
+or the maximum sun_path length. defaults to true. ``tight`` is
+optional.
+   ``abstract`` whether use abstract address. defaults to false.
+   ``abstract`` is optional.
 
 ``-chardev 
udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]``
 Sends all traffic from the guest to a remote host over UDP.
-- 
2.17.1




[PATCH v4 2/3] tests/util-sockets: add abstract unix socket cases

2020-05-14 Thread xiaoqiang zhao
add cases to test tight and non-tight for abstract address type

Signed-off-by: xiaoqiang zhao 
---
 tests/test-util-sockets.c | 91 +++
 1 file changed, 91 insertions(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 5fd947c7bf..c21a90634a 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -227,6 +227,92 @@ static void test_socket_fd_pass_num_nocli(void)
 g_free(addr.u.fd.str);
 }
 
+static gchar *abstract_sock_name;
+
+static gpointer unix_server_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+int connfd = -1;
+struct sockaddr_un un;
+socklen_t len = sizeof(un);
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = abstract_sock_name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_listen(, 1, );
+g_assert_cmpint(fd, >=, 0);
+g_assert(fd_is_socket(fd));
+
+connfd = accept(fd, (struct sockaddr *), );
+g_assert_cmpint(connfd, !=, -1);
+
+close(fd);
+
+return NULL;
+}
+
+static gpointer unix_client_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = abstract_sock_name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_connect(, );
+
+g_assert_cmpint(fd, >=, 0);
+
+close(fd);
+
+return NULL;
+}
+
+static void test_socket_unix_abstract_good(void)
+{
+
+GRand *r = g_rand_new();
+
+abstract_sock_name = g_strdup_printf("unix-%d-%d", getpid(),
+g_rand_int_range(r, 100, 1000));
+
+/* non tight socklen serv and cli */
+GThread *serv = g_thread_new("abstract_unix_server",
+ unix_server_thread_func,
+ NULL);
+
+sleep(1);
+
+GThread *cli = g_thread_new("abstruct_unix_client",
+unix_client_thread_func,
+NULL);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+/* tight socklen serv and cli */
+serv = g_thread_new("abstract_unix_server",
+unix_server_thread_func,
+(gpointer)1);
+
+sleep(1);
+
+cli = g_thread_new("abstruct_unix_client",
+   unix_client_thread_func,
+   (gpointer)1);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+g_free(abstract_sock_name);
+}
 
 int main(int argc, char **argv)
 {
@@ -265,6 +351,11 @@ int main(int argc, char **argv)
 test_socket_fd_pass_num_nocli);
 }
 
+#ifdef __linux__
+g_test_add_func("/util/socket/unix-abstract/good",
+test_socket_unix_abstract_good);
+#endif
+
 end:
 return g_test_run();
 }
-- 
2.17.1




[PATCH v4 1/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-14 Thread xiaoqiang zhao
unix_listen/connect_saddr now support abstract address types

two aditional BOOL switches are introduced:
tight: whether to set @addrlen to the minimal string length,
   or the maximum sun_path length. default is TRUE
abstract: whether we use abstract address. default is FALSE

cli example:
-monitor unix:/tmp/unix.socket,abstract,tight=off
OR
-chardev socket,path=/tmp/unix.socket,id=unix1,abstract,tight=on

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 chardev/char-socket.c |  4 
 chardev/char.c|  7 +++
 qapi/sockets.json |  8 +++-
 util/qemu-sockets.c   | 39 ---
 4 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 185fe38dda..16f2211091 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1380,6 +1380,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 const char *host = qemu_opt_get(opts, "host");
 const char *port = qemu_opt_get(opts, "port");
 const char *fd = qemu_opt_get(opts, "fd");
+bool tight = qemu_opt_get_bool(opts, "tight", true);
+bool abstract = qemu_opt_get_bool(opts, "abstract", false);
 SocketAddressLegacy *addr;
 ChardevSocket *sock;
 
@@ -1431,6 +1433,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
 q_unix->path = g_strdup(path);
+q_unix->tight = tight;
+q_unix->abstract = abstract;
 } else if (host) {
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
 addr->u.inet.data = g_new(InetSocketAddress, 1);
diff --git a/chardev/char.c b/chardev/char.c
index e77564060d..f44fda3a92 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -939,6 +939,13 @@ QemuOptsList qemu_chardev_opts = {
 },{
 .name = "logappend",
 .type = QEMU_OPT_BOOL,
+},{
+.name = "tight",
+.type = QEMU_OPT_BOOL,
+.def_value_str = "on",
+},{
+.name = "abstract",
+.type = QEMU_OPT_BOOL,
 },
 { /* end of list */ }
 },
diff --git a/qapi/sockets.json b/qapi/sockets.json
index ea933ed4b2..cbd6ef35d0 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -73,12 +73,18 @@
 # Captures a socket address in the local ("Unix socket") namespace.
 #
 # @path: filesystem path to use
+# @tight: pass a socket address length confined to the minimum length of the
+# abstract string, rather than the full sockaddr_un record length
+# (only matters for abstract sockets, default true). (Since 5.1)
+# @abstract: whether this is an abstract address, default false. (Since 5.1)
 #
 # Since: 1.3
 ##
 { 'struct': 'UnixSocketAddress',
   'data': {
-'path': 'str' } }
+'path': 'str',
+'*tight': 'bool',
+'*abstract': 'bool' } }
 
 ##
 # @VsockSocketAddress:
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 86c48b9fa5..b37d288866 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -863,6 +863,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 char *pathbuf = NULL;
 const char *path;
 size_t pathlen;
+size_t addrlen;
 
 sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 if (sock < 0) {
@@ -879,9 +880,11 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 }
 
 pathlen = strlen(path);
-if (pathlen > sizeof(un.sun_path)) {
+if (pathlen > sizeof(un.sun_path) ||
+(saddr->abstract && pathlen > (sizeof(un.sun_path) - 1))) {
 error_setg(errp, "UNIX socket path '%s' is too long", path);
 error_append_hint(errp, "Path must be less than %zu bytes\n",
+  saddr->abstract ? sizeof(un.sun_path) - 1 :
   sizeof(un.sun_path));
 goto err;
 }
@@ -903,7 +906,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 close(fd);
 }
 
-if (unlink(path) < 0 && errno != ENOENT) {
+if (!saddr->abstract && unlink(path) < 0 && errno != ENOENT) {
 error_setg_errno(errp, errno,
  "Failed to unlink socket %s", path);
 goto err;
@@ -911,9 +914,19 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 
 memset(, 0, sizeof(un));
 un.sun_family = AF_UNIX;
-memcpy(un.sun_path, path, pathlen);
+addrlen = sizeof(un);
 
-if (bind(sock, (struct sockaddr*) , sizeof(un)) < 0) {
+if (saddr->abstract) {
+un.sun_path[0] = '\0';
+memcpy(_path[1], path, pathlen);
+if (saddr->tight) {
+addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + p

[PATCH v4 3/3] qemu-options: updates for abstract unix sockets

2020-05-14 Thread xiaoqiang zhao
add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
Reviewed-by: Daniel P. Berrangé 
---
 qemu-options.hx | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index e2dca8a4e9..e63cc1b4b4 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2938,7 +2938,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
 " 
[,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] 
(tcp)\n"
 "-chardev 
socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n"
-" [,mux=on|off][,logfile=PATH][,logappend=on|off] (unix)\n"
+" 
[,mux=on|off][,logfile=PATH][,logappend=on|off][,tight=on|off][,abstract=on|off]
 (unix)\n"
 "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
 " [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off]\n"
@@ -3105,9 +3105,14 @@ The available backends are:
 
 ``nodelay`` disables the Nagle algorithm.
 
-``unix options: path=path``
+``unix options: path=path[,tight=on|off][,abstract=on|off]``
 ``path`` specifies the local path of the unix socket. ``path``
 is required.
+   ``tight`` whether to set @addrlen to the minimal string length,
+or the maximum sun_path length. defaults to true. ``tight`` is
+optional.
+   ``abstract`` whether use abstract address. defaults to false.
+   ``abstract`` is optional.
 
 ``-chardev 
udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]``
 Sends all traffic from the guest to a remote host over UDP.
-- 
2.17.1




[PATCH v4 0/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-14 Thread xiaoqiang zhao
qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.

Changes since v3: 
* rebase on master
* refine qapi document statement
* use random names to avoid name clash in unit test

Xiaoqiang Zhao (3):
  qemu-sockets: add abstract UNIX domain socket support
  tests/util-sockets: add abstract unix socket cases
  qemu-options: updates for abstract unix sockets

 chardev/char-socket.c |  4 ++
 chardev/char.c|  7 +++
 qapi/sockets.json |  8 +++-
 qemu-options.hx   |  9 +++-
 tests/test-util-sockets.c | 91 +++
 util/qemu-sockets.c   | 39 ++---
 6 files changed, 148 insertions(+), 10 deletions(-)

-- 
2.17.1




Re: [PATCH v3 2/3] tests/util-sockets: add abstract unix socket cases

2020-05-13 Thread xiaoqiang zhao

在 2020/5/13 下午11:49, Daniel P. Berrangé 写道:

On Sun, May 10, 2020 at 02:14:21PM +0800, xiaoqiang zhao wrote:

add cases to test tight and non-tight for abstract address type

Signed-off-by: xiaoqiang zhao
---
  tests/test-util-sockets.c | 83 +++
  1 file changed, 83 insertions(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 5fd947c7bf..8042fb9276 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -227,6 +227,84 @@ static void test_socket_fd_pass_num_nocli(void)
  g_free(addr.u.fd.str);
  }
  
+static gpointer unix_server_thread_func(gpointer user_data)

+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+int connfd = -1;
+struct sockaddr_un un;
+socklen_t len = sizeof(un);
+char name[] = "/tmp/unix-test.sock";

Fixed filenames are bad, as even though this is the abstract
namespace and thus safe from on-disk clashes, the abstract
namespace is still OS global. We should append both the PID
and a sequence of random bytes to get something which doesnt
clash if two copies of the unit test run concurrently.


agree.




[PATCH RESEND v3 0/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-10 Thread xiaoqiang zhao
Resend this patch series as it does not meet patchew last time.

By default qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.

Changes since v2: 
* reorganize code to cover both connect and listen
* qapi related changes
* add test cases and update qemu-options documents

Xiaoqiang Zhao (3):
  qemu-sockets: add abstract UNIX domain socket support
  tests/util-sockets: add abstract unix socket cases
  qemu-options: updates for abstract unix sockets

 chardev/char-socket.c |  4 ++
 chardev/char.c|  7 
 qapi/sockets.json |  9 -
 qemu-options.hx   |  9 -
 tests/test-util-sockets.c | 83 +++
 util/qemu-sockets.c   | 39 ++
 6 files changed, 141 insertions(+), 10 deletions(-)

-- 
2.17.1




[PATCH RESEND v3 2/3] tests/util-sockets: add abstract unix socket cases

2020-05-10 Thread xiaoqiang zhao
add cases to test tight and non-tight for abstract address type

Signed-off-by: xiaoqiang zhao 
---
 tests/test-util-sockets.c | 83 +++
 1 file changed, 83 insertions(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 5fd947c7bf..8042fb9276 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -227,6 +227,84 @@ static void test_socket_fd_pass_num_nocli(void)
 g_free(addr.u.fd.str);
 }
 
+static gpointer unix_server_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+int connfd = -1;
+struct sockaddr_un un;
+socklen_t len = sizeof(un);
+char name[] = "/tmp/unix-test.sock";
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_listen(, 1, );
+g_assert_cmpint(fd, >=, 0);
+g_assert(fd_is_socket(fd));
+
+connfd = accept(fd, (struct sockaddr *), );
+g_assert_cmpint(connfd, !=, -1);
+
+close(fd);
+
+return NULL;
+}
+
+static gpointer unix_client_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+char name[] = "/tmp/unix-test.sock";
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_connect(, );
+
+g_assert_cmpint(fd, >=, 0);
+
+close(fd);
+
+return NULL;
+}
+
+static void test_socket_unix_abstract_good(void)
+{
+/* non tight socklen serv and cli */
+GThread *serv = g_thread_new("abstract_unix_server",
+ unix_server_thread_func,
+ NULL);
+
+sleep(1);
+
+GThread *cli = g_thread_new("abstruct_unix_client",
+unix_client_thread_func,
+NULL);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+/* tight socklen serv and cli */
+serv = g_thread_new("abstract_unix_server",
+unix_server_thread_func,
+(gpointer)1);
+
+sleep(1);
+
+cli = g_thread_new("abstruct_unix_client",
+   unix_client_thread_func,
+   (gpointer)1);
+
+g_thread_join(cli);
+g_thread_join(serv);
+}
 
 int main(int argc, char **argv)
 {
@@ -265,6 +343,11 @@ int main(int argc, char **argv)
 test_socket_fd_pass_num_nocli);
 }
 
+#ifdef __linux__
+g_test_add_func("/util/socket/unix-abstract/good",
+test_socket_unix_abstract_good);
+#endif
+
 end:
 return g_test_run();
 }
-- 
2.17.1




[PATCH RESEND v3 1/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-10 Thread xiaoqiang zhao
unix_listen/connect_saddr now support abstract address types

two aditional BOOL switches are introduced:
tight: whether to set @addrlen to the minimal string length,
   or the maximum sun_path length. default is TRUE
abstract: whether we use abstract address. default is FALSE

cli example:
-monitor unix:/tmp/unix.socket,abstract,tight=off
OR
-chardev socket,path=/tmp/unix.socket,id=unix1,abstract,tight=on

Signed-off-by: xiaoqiang zhao 
---
 chardev/char-socket.c |  4 
 chardev/char.c|  7 +++
 qapi/sockets.json |  9 -
 util/qemu-sockets.c   | 39 ---
 4 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 185fe38dda..16f2211091 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1380,6 +1380,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 const char *host = qemu_opt_get(opts, "host");
 const char *port = qemu_opt_get(opts, "port");
 const char *fd = qemu_opt_get(opts, "fd");
+bool tight = qemu_opt_get_bool(opts, "tight", true);
+bool abstract = qemu_opt_get_bool(opts, "abstract", false);
 SocketAddressLegacy *addr;
 ChardevSocket *sock;
 
@@ -1431,6 +1433,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
 q_unix->path = g_strdup(path);
+q_unix->tight = tight;
+q_unix->abstract = abstract;
 } else if (host) {
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
 addr->u.inet.data = g_new(InetSocketAddress, 1);
diff --git a/chardev/char.c b/chardev/char.c
index e77564060d..f44fda3a92 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -939,6 +939,13 @@ QemuOptsList qemu_chardev_opts = {
 },{
 .name = "logappend",
 .type = QEMU_OPT_BOOL,
+},{
+.name = "tight",
+.type = QEMU_OPT_BOOL,
+.def_value_str = "on",
+},{
+.name = "abstract",
+.type = QEMU_OPT_BOOL,
 },
 { /* end of list */ }
 },
diff --git a/qapi/sockets.json b/qapi/sockets.json
index ea933ed4b2..e7aa096cde 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -73,12 +73,19 @@
 # Captures a socket address in the local ("Unix socket") namespace.
 #
 # @path: filesystem path to use
+# @tight: pass a socket address length that does not include the whole
+# struct sockaddr_un record but (besides other components) only
+# the relevant part of the filename or abstract string.
+# default value is 'true'
+# @abstract: whether this is a abstract address, default is 'false'
 #
 # Since: 1.3
 ##
 { 'struct': 'UnixSocketAddress',
   'data': {
-'path': 'str' } }
+'path': 'str',
+'*tight': 'bool',
+'*abstract': 'bool' } }
 
 ##
 # @VsockSocketAddress:
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 86c48b9fa5..b37d288866 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -863,6 +863,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 char *pathbuf = NULL;
 const char *path;
 size_t pathlen;
+size_t addrlen;
 
 sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 if (sock < 0) {
@@ -879,9 +880,11 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 }
 
 pathlen = strlen(path);
-if (pathlen > sizeof(un.sun_path)) {
+if (pathlen > sizeof(un.sun_path) ||
+(saddr->abstract && pathlen > (sizeof(un.sun_path) - 1))) {
 error_setg(errp, "UNIX socket path '%s' is too long", path);
 error_append_hint(errp, "Path must be less than %zu bytes\n",
+  saddr->abstract ? sizeof(un.sun_path) - 1 :
   sizeof(un.sun_path));
 goto err;
 }
@@ -903,7 +906,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 close(fd);
 }
 
-if (unlink(path) < 0 && errno != ENOENT) {
+if (!saddr->abstract && unlink(path) < 0 && errno != ENOENT) {
 error_setg_errno(errp, errno,
  "Failed to unlink socket %s", path);
 goto err;
@@ -911,9 +914,19 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 
 memset(, 0, sizeof(un));
 un.sun_family = AF_UNIX;
-memcpy(un.sun_path, path, pathlen);
+addrlen = sizeof(un);
 
-if (bind(sock, (struct sockaddr*) , sizeof(un)) < 0) {
+if (saddr->abstract) {
+un.sun_path[0] = '\0';
+memcpy(_path[1], path, pathlen);
+if (saddr->tight) {
+addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + pathlen;
+}
+

[PATCH RESEND v3 3/3] qemu-options: updates for abstract unix sockets

2020-05-10 Thread xiaoqiang zhao
add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
---
 qemu-options.hx | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index 292d4e7c0c..ce73014f8e 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2930,7 +2930,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
 " 
[,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] 
(tcp)\n"
 "-chardev 
socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n"
-" [,mux=on|off][,logfile=PATH][,logappend=on|off] (unix)\n"
+" 
[,mux=on|off][,logfile=PATH][,logappend=on|off][,tight=on|off][,abstract=on|off]
 (unix)\n"
 "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
 " [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off]\n"
@@ -3097,9 +3097,14 @@ The available backends are:
 
 ``nodelay`` disables the Nagle algorithm.
 
-``unix options: path=path``
+``unix options: path=path[,tight=on|off][,abstract=on|off]``
 ``path`` specifies the local path of the unix socket. ``path``
 is required.
+   ``tight`` whether to set @addrlen to the minimal string length,
+or the maximum sun_path length. defaults to true. ``tight`` is
+optional.
+   ``abstract`` whether use abstract address. defaults to false.
+   ``abstract`` is optional.
 
 ``-chardev 
udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]``
 Sends all traffic from the guest to a remote host over UDP.
-- 
2.17.1




[PATCH v3 0/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-10 Thread xiaoqiang zhao
By default qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.

Changes since v2: 
* reorganize code to cover both connect and listen
* qapi related changes
* add test cases and update qemu-options documents

Xiaoqiang Zhao (3):
  qemu-sockets: add abstract UNIX domain socket support
  tests/util-sockets: add abstract unix socket cases
  qemu-options: updates for abstract unix sockets

 chardev/char-socket.c |  4 ++
 chardev/char.c|  7 
 qapi/sockets.json |  9 -
 qemu-options.hx   |  9 -
 tests/test-util-sockets.c | 83 +++
 util/qemu-sockets.c   | 39 ++
 6 files changed, 141 insertions(+), 10 deletions(-)

-- 
2.17.1





[PATCH v3 1/3] qemu-sockets: add abstract UNIX domain socket support

2020-05-10 Thread xiaoqiang zhao
unix_listen/connect_saddr now support abstract address types

two aditional BOOL switches are introduced:
tight: whether to set @addrlen to the minimal string length,
   or the maximum sun_path length. default is TRUE
abstract: whether we use abstract address. default is FALSE

cli example:
-monitor unix:/tmp/unix.socket,abstract,tight=off
OR
-chardev socket,path=/tmp/unix.socket,id=unix1,abstract,tight=on

Signed-off-by: xiaoqiang zhao 
---
 chardev/char-socket.c |  4 
 chardev/char.c|  7 +++
 qapi/sockets.json |  9 -
 util/qemu-sockets.c   | 39 ---
 4 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 185fe38dda..16f2211091 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -1380,6 +1380,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 const char *host = qemu_opt_get(opts, "host");
 const char *port = qemu_opt_get(opts, "port");
 const char *fd = qemu_opt_get(opts, "fd");
+bool tight = qemu_opt_get_bool(opts, "tight", true);
+bool abstract = qemu_opt_get_bool(opts, "abstract", false);
 SocketAddressLegacy *addr;
 ChardevSocket *sock;
 
@@ -1431,6 +1433,8 @@ static void qemu_chr_parse_socket(QemuOpts *opts, 
ChardevBackend *backend,
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
 q_unix->path = g_strdup(path);
+q_unix->tight = tight;
+q_unix->abstract = abstract;
 } else if (host) {
 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
 addr->u.inet.data = g_new(InetSocketAddress, 1);
diff --git a/chardev/char.c b/chardev/char.c
index e77564060d..f44fda3a92 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -939,6 +939,13 @@ QemuOptsList qemu_chardev_opts = {
 },{
 .name = "logappend",
 .type = QEMU_OPT_BOOL,
+},{
+.name = "tight",
+.type = QEMU_OPT_BOOL,
+.def_value_str = "on",
+},{
+.name = "abstract",
+.type = QEMU_OPT_BOOL,
 },
 { /* end of list */ }
 },
diff --git a/qapi/sockets.json b/qapi/sockets.json
index ea933ed4b2..e7aa096cde 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -73,12 +73,19 @@
 # Captures a socket address in the local ("Unix socket") namespace.
 #
 # @path: filesystem path to use
+# @tight: pass a socket address length that does not include the whole
+# struct sockaddr_un record but (besides other components) only
+# the relevant part of the filename or abstract string.
+# default value is 'true'
+# @abstract: whether this is a abstract address, default is 'false'
 #
 # Since: 1.3
 ##
 { 'struct': 'UnixSocketAddress',
   'data': {
-'path': 'str' } }
+'path': 'str',
+'*tight': 'bool',
+'*abstract': 'bool' } }
 
 ##
 # @VsockSocketAddress:
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 86c48b9fa5..b37d288866 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -863,6 +863,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 char *pathbuf = NULL;
 const char *path;
 size_t pathlen;
+size_t addrlen;
 
 sock = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
 if (sock < 0) {
@@ -879,9 +880,11 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 }
 
 pathlen = strlen(path);
-if (pathlen > sizeof(un.sun_path)) {
+if (pathlen > sizeof(un.sun_path) ||
+(saddr->abstract && pathlen > (sizeof(un.sun_path) - 1))) {
 error_setg(errp, "UNIX socket path '%s' is too long", path);
 error_append_hint(errp, "Path must be less than %zu bytes\n",
+  saddr->abstract ? sizeof(un.sun_path) - 1 :
   sizeof(un.sun_path));
 goto err;
 }
@@ -903,7 +906,7 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 close(fd);
 }
 
-if (unlink(path) < 0 && errno != ENOENT) {
+if (!saddr->abstract && unlink(path) < 0 && errno != ENOENT) {
 error_setg_errno(errp, errno,
  "Failed to unlink socket %s", path);
 goto err;
@@ -911,9 +914,19 @@ static int unix_listen_saddr(UnixSocketAddress *saddr,
 
 memset(, 0, sizeof(un));
 un.sun_family = AF_UNIX;
-memcpy(un.sun_path, path, pathlen);
+addrlen = sizeof(un);
 
-if (bind(sock, (struct sockaddr*) , sizeof(un)) < 0) {
+if (saddr->abstract) {
+un.sun_path[0] = '\0';
+memcpy(_path[1], path, pathlen);
+if (saddr->tight) {
+addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + pathlen;
+}
+

[PATCH v3 2/3] tests/util-sockets: add abstract unix socket cases

2020-05-10 Thread xiaoqiang zhao
add cases to test tight and non-tight for abstract address type

Signed-off-by: xiaoqiang zhao 
---
 tests/test-util-sockets.c | 83 +++
 1 file changed, 83 insertions(+)

diff --git a/tests/test-util-sockets.c b/tests/test-util-sockets.c
index 5fd947c7bf..8042fb9276 100644
--- a/tests/test-util-sockets.c
+++ b/tests/test-util-sockets.c
@@ -227,6 +227,84 @@ static void test_socket_fd_pass_num_nocli(void)
 g_free(addr.u.fd.str);
 }
 
+static gpointer unix_server_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+int connfd = -1;
+struct sockaddr_un un;
+socklen_t len = sizeof(un);
+char name[] = "/tmp/unix-test.sock";
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_listen(, 1, );
+g_assert_cmpint(fd, >=, 0);
+g_assert(fd_is_socket(fd));
+
+connfd = accept(fd, (struct sockaddr *), );
+g_assert_cmpint(connfd, !=, -1);
+
+close(fd);
+
+return NULL;
+}
+
+static gpointer unix_client_thread_func(gpointer user_data)
+{
+SocketAddress addr;
+Error *err = NULL;
+int fd = -1;
+char name[] = "/tmp/unix-test.sock";
+
+addr.type = SOCKET_ADDRESS_TYPE_UNIX;
+addr.u.q_unix.path = name;
+addr.u.q_unix.tight = user_data != NULL;
+addr.u.q_unix.abstract = true;
+
+fd = socket_connect(, );
+
+g_assert_cmpint(fd, >=, 0);
+
+close(fd);
+
+return NULL;
+}
+
+static void test_socket_unix_abstract_good(void)
+{
+/* non tight socklen serv and cli */
+GThread *serv = g_thread_new("abstract_unix_server",
+ unix_server_thread_func,
+ NULL);
+
+sleep(1);
+
+GThread *cli = g_thread_new("abstruct_unix_client",
+unix_client_thread_func,
+NULL);
+
+g_thread_join(cli);
+g_thread_join(serv);
+
+/* tight socklen serv and cli */
+serv = g_thread_new("abstract_unix_server",
+unix_server_thread_func,
+(gpointer)1);
+
+sleep(1);
+
+cli = g_thread_new("abstruct_unix_client",
+   unix_client_thread_func,
+   (gpointer)1);
+
+g_thread_join(cli);
+g_thread_join(serv);
+}
 
 int main(int argc, char **argv)
 {
@@ -265,6 +343,11 @@ int main(int argc, char **argv)
 test_socket_fd_pass_num_nocli);
 }
 
+#ifdef __linux__
+g_test_add_func("/util/socket/unix-abstract/good",
+test_socket_unix_abstract_good);
+#endif
+
 end:
 return g_test_run();
 }
-- 
2.17.1





[PATCH v3 3/3] qemu-options: updates for abstract unix sockets

2020-05-10 Thread xiaoqiang zhao
add options documents changes for -chardev

Signed-off-by: xiaoqiang zhao 
---
 qemu-options.hx | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/qemu-options.hx b/qemu-options.hx
index 292d4e7c0c..ce73014f8e 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2930,7 +2930,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
 " 
[,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] 
(tcp)\n"
 "-chardev 
socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n"
-" [,mux=on|off][,logfile=PATH][,logappend=on|off] (unix)\n"
+" 
[,mux=on|off][,logfile=PATH][,logappend=on|off][,tight=on|off][,abstract=on|off]
 (unix)\n"
 "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
 " [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n"
 " [,logfile=PATH][,logappend=on|off]\n"
@@ -3097,9 +3097,14 @@ The available backends are:
 
 ``nodelay`` disables the Nagle algorithm.
 
-``unix options: path=path``
+``unix options: path=path[,tight=on|off][,abstract=on|off]``
 ``path`` specifies the local path of the unix socket. ``path``
 is required.
+   ``tight`` whether to set @addrlen to the minimal string length,
+or the maximum sun_path length. defaults to true. ``tight`` is
+optional.
+   ``abstract`` whether use abstract address. defaults to false.
+   ``abstract`` is optional.
 
 ``-chardev 
udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]``
 Sends all traffic from the guest to a remote host over UDP.
-- 
2.17.1





[PATCH v2] qemu-sockets: add abstract UNIX domain socket support

2020-04-22 Thread xiaoqiang zhao
unix_connect_saddr now support abstract address type

By default qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.
Abstract address is marked by prefixing the address name with a '@'.

Signed-off-by: xiaoqiang zhao 
---
 util/qemu-sockets.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index bcc06d0e01..7ba9c497ab 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -939,6 +939,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, 
Error **errp)
 struct sockaddr_un un;
 int sock, rc;
 size_t pathlen;
+socklen_t serverlen;
 
 if (saddr->path == NULL) {
 error_setg(errp, "unix connect: no path specified");
@@ -963,10 +964,17 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, 
Error **errp)
 un.sun_family = AF_UNIX;
 memcpy(un.sun_path, saddr->path, pathlen);
 
+if (saddr->path[0] == '@') {
+un.sun_path[0] = '\0';
+serverlen = pathlen + offsetof(struct sockaddr_un, sun_path);
+} else {
+serverlen = sizeof(un);
+}
+
 /* connect to peer */
 do {
 rc = 0;
-if (connect(sock, (struct sockaddr *) , sizeof(un)) < 0) {
+if (connect(sock, (struct sockaddr *) , serverlen) < 0) {
 rc = -errno;
 }
 } while (rc == -EINTR);
-- 
2.17.1





[PATCH] qemu-sockets: add abstract UNIX domain socket support

2020-04-22 Thread xiaoqiang zhao
unix_connect_saddr now support abstract address type

By default qemu does not support abstract UNIX domain
socket address. Add this ability to make qemu handy
when abstract address is needed.
Abstract address is marked by prefixing the address name with a '@'.

Signed-off-by: xiaoqiang zhao 
---
 util/qemu-sockets.c | 11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index bcc06d0e01..d4f02a6b1a 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -939,6 +939,7 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, 
Error **errp)
 struct sockaddr_un un;
 int sock, rc;
 size_t pathlen;
+socklen_t serverlen;
 
 if (saddr->path == NULL) {
 error_setg(errp, "unix connect: no path specified");
@@ -963,10 +964,18 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, 
Error **errp)
 un.sun_family = AF_UNIX;
 memcpy(un.sun_path, saddr->path, pathlen);
 
+if (saddr->path[0] == '@') {
+un.sun_path[0] = '\0';
+serverlen = strlen(saddr->path) + offsetof(struct sockaddr_un, 
sun_path);
+}
+else {
+serverlen = sizeof(un);
+}
+
 /* connect to peer */
 do {
 rc = 0;
-if (connect(sock, (struct sockaddr *) , sizeof(un)) < 0) {
+if (connect(sock, (struct sockaddr *) , serverlen) < 0) {
 rc = -errno;
 }
 } while (rc == -EINTR);
-- 
2.17.1





Re: [PATCH v5 07/37] serial: register vmsd with DeviceClass

2019-12-22 Thread xiaoqiang zhao



在 2019/12/20 下午9:45, Marc-André Lureau 写道:

Migration from old to new code works, however the other way fails for
devices that use serial_init/serial_mm_init with "base", used as
instance_id previously.

(with qdev_set_legacy_instance_id, the alias_id is only used in
savevm.c:find_se(), and thus can only be used to match against
"legacy" instance id values. On new code, instance_id is generated
incrementally from 0 with calculate_new_instance_id(), based on
"qdev-path/vmsd-name")

Signed-off-by: Marc-André Lureau 
---
  hw/char/serial.c | 6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 233a9e2076..e926845843 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -990,8 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int 
baudbase,
  s->baudbase = baudbase;
  qemu_chr_fe_init(>chr, chr, _abort);
  serial_realize_core(s, _fatal);
-
-vmstate_register(NULL, base, _serial, s);
+qdev_set_legacy_instance_id(dev, base, 2);
  qdev_init_nofail(dev);
  
  memory_region_init_io(>io, NULL, _io_ops, s, "serial", 8);

@@ -1006,6 +1005,7 @@ static void serial_class_init(ObjectClass *klass, void 
*data)
  
  /* internal device for serialio/serialmm, not user-creatable */

  dc->user_creatable = false;
+dc->vmsd = _serial;
  }
  
  static const TypeInfo serial_info = {

@@ -1069,7 +1069,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
  qemu_chr_fe_init(>chr, chr, _abort);
  
  serial_realize_core(s, _fatal);

-vmstate_register(NULL, base, _serial, s);
+qdev_set_legacy_instance_id(dev, base, 2);
  qdev_init_nofail(dev);
  
  memory_region_init_io(>io, NULL, _mm_ops[end], s,

Resend, cc peter
Reviewed-by: xiaoqiang zhao 




Re: [PATCH v5 04/37] chardev: generate an internal id when none given

2019-12-22 Thread xiaoqiang zhao

在 2019/12/20 下午9:45, Marc-André Lureau 写道:

Internally, qemu may create chardev without ID. Those will not be
looked up with qemu_chr_find(), which prevents using qdev_prop_set_chr().

Use id_generate(), to generate an internal name (prefixed with #), so
no conflict exist with user-named chardev.

Signed-off-by: Marc-André Lureau 
---
  chardev/char.c| 32 
  include/qemu/id.h |  1 +
  util/id.c |  1 +
  3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/chardev/char.c b/chardev/char.c
index 7b6b2cb123..e7e7492b0e 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -37,6 +37,7 @@
  #include "qemu/help_option.h"
  #include "qemu/module.h"
  #include "qemu/option.h"
+#include "qemu/id.h"
  
  #include "chardev/char-mux.h"
  
@@ -944,10 +945,10 @@ void qemu_chr_set_feature(Chardev *chr,

  return set_bit(feature, chr->features);
  }
  
-Chardev *qemu_chardev_new(const char *id, const char *typename,

-  ChardevBackend *backend,
-  GMainContext *gcontext,
-  Error **errp)
+static Chardev *chardev_new(const char *id, const char *typename,
+ChardevBackend *backend,
+GMainContext *gcontext,
+Error **errp)
  {
  Object *obj;
  Chardev *chr = NULL;
@@ -991,6 +992,21 @@ end:
  return chr;
  }
  
+Chardev *qemu_chardev_new(const char *id, const char *typename,

+  ChardevBackend *backend,
+  GMainContext *gcontext,
+  Error **errp)
+{
+g_autofree char *genid = NULL;
+
+if (!id) {
+genid = id_generate(ID_CHR);
+id = genid;
+}
+
+return chardev_new(id, typename, backend, gcontext, errp);
+}
+
  ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
 Error **errp)
  {
@@ -1003,8 +1019,8 @@ ChardevReturn *qmp_chardev_add(const char *id, 
ChardevBackend *backend,
  return NULL;
  }
  
-chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),

-   backend, NULL, errp);
+chr = chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
+  backend, NULL, errp);
  if (!chr) {
  return NULL;
  }
@@ -1061,8 +1077,8 @@ ChardevReturn *qmp_chardev_change(const char *id, 
ChardevBackend *backend,
  return NULL;
  }
  
-chr_new = qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),

-   backend, chr->gcontext, errp);
+chr_new = chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
+  backend, chr->gcontext, errp);
  if (!chr_new) {
  return NULL;
  }
diff --git a/include/qemu/id.h b/include/qemu/id.h
index 40c70103e4..b55c406e69 100644
--- a/include/qemu/id.h
+++ b/include/qemu/id.h
@@ -4,6 +4,7 @@
  typedef enum IdSubSystems {
  ID_QDEV,
  ID_BLOCK,
+ID_CHR,
  ID_MAX  /* last element, used as array size */
  } IdSubSystems;
  
diff --git a/util/id.c b/util/id.c

index af1c5f1b81..5addb4460e 100644
--- a/util/id.c
+++ b/util/id.c
@@ -34,6 +34,7 @@ bool id_wellformed(const char *id)
  static const char *const id_subsys_str[ID_MAX] = {
  [ID_QDEV]  = "qdev",
  [ID_BLOCK] = "block",
+[ID_CHR] = "chr",
  };
  
  /*


Looks good to me.

Reviewed-by: xiaoqiang zhao 





Re: [PATCH v5 07/37] serial: register vmsd with DeviceClass

2019-12-22 Thread xiaoqiang zhao

在 2019/12/20 下午9:45, Marc-André Lureau 写道:

Migration from old to new code works, however the other way fails for
devices that use serial_init/serial_mm_init with "base", used as
instance_id previously.

(with qdev_set_legacy_instance_id, the alias_id is only used in
savevm.c:find_se(), and thus can only be used to match against
"legacy" instance id values. On new code, instance_id is generated
incrementally from 0 with calculate_new_instance_id(), based on
"qdev-path/vmsd-name")

Signed-off-by: Marc-André Lureau 
---
  hw/char/serial.c | 6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 233a9e2076..e926845843 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -990,8 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int 
baudbase,
  s->baudbase = baudbase;
  qemu_chr_fe_init(>chr, chr, _abort);
  serial_realize_core(s, _fatal);
-
-vmstate_register(NULL, base, _serial, s);
+qdev_set_legacy_instance_id(dev, base, 2);
  qdev_init_nofail(dev);
  
  memory_region_init_io(>io, NULL, _io_ops, s, "serial", 8);

@@ -1006,6 +1005,7 @@ static void serial_class_init(ObjectClass *klass, void 
*data)
  
  /* internal device for serialio/serialmm, not user-creatable */

  dc->user_creatable = false;
+dc->vmsd = _serial;
  }
  
  static const TypeInfo serial_info = {

@@ -1069,7 +1069,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
  qemu_chr_fe_init(>chr, chr, _abort);
  
  serial_realize_core(s, _fatal);

-vmstate_register(NULL, base, _serial, s);
+qdev_set_legacy_instance_id(dev, base, 2);
  qdev_init_nofail(dev);
  
  memory_region_init_io(>io, NULL, _mm_ops[end], s,

Reviewed-by: xiaoqiang zhao 




Re: [Qemu-devel] [PATCH 51/88] hw/timer: use g_new() family of functions

2017-10-06 Thread xiaoqiang zhao

> 在 2017年10月7日,上午7:49,Philippe Mathieu-Daudé <f4...@amsat.org> 写道:
> 
> From: Marc-André Lureau <marcandre.lur...@redhat.com>
> 
> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
> ---
> hw/timer/slavio_timer.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
> index a8cc9c0148..6d0282a788 100644
> --- a/hw/timer/slavio_timer.c
> +++ b/hw/timer/slavio_timer.c
> @@ -385,7 +385,7 @@ static void slavio_timer_init(Object *obj)
>  uint64_t size;
>  char timer_name[20];
> 
> -tc = g_malloc0(sizeof(TimerContext));
> +tc = g_new0(TimerContext, 1);
>  tc->s = s;
>  tc->timer_index = i;
> 
> -- 
> 2.14.2

Resend due to email blocks.

Reviewed-by: xiaoqiang zhao <zxq_yx_...@163.com>





Re: [Qemu-devel] [PATCH 51/88] hw/timer: use g_new() family of functions

2017-10-06 Thread xiaoqiang zhao

> 在 2017年10月7日,上午7:49,Philippe Mathieu-Daudé <f4...@amsat.org> 写道:
> 
> From: Marc-André Lureau <marcandre.lur...@redhat.com>
> 
> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
> ---
> hw/timer/slavio_timer.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
> index a8cc9c0148..6d0282a788 100644
> --- a/hw/timer/slavio_timer.c
> +++ b/hw/timer/slavio_timer.c
> @@ -385,7 +385,7 @@ static void slavio_timer_init(Object *obj)
>   uint64_t size;
>   char timer_name[20];
> 
> -tc = g_malloc0(sizeof(TimerContext));
> +tc = g_new0(TimerContext, 1);
>   tc->s = s;
>   tc->timer_index = i;
> 
> -- 
> 2.14.2

Reviewed-by: xiaoqiang zhao <zxq_yx_...@163.com>




[Qemu-devel] [PATCH v3 7/8] hw/sparc: QOM'ify sun4m.c

2017-05-25 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/sparc/sun4m.c | 54 +++---
 1 file changed, 19 insertions(+), 35 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 5f022cc08d..0faff4619f 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -585,30 +585,23 @@ typedef struct IDRegState {
 MemoryRegion mem;
 } IDRegState;
 
-static int idreg_init1(SysBusDevice *dev)
+static void idreg_init1(Object *obj)
 {
-IDRegState *s = MACIO_ID_REGISTER(dev);
+IDRegState *s = MACIO_ID_REGISTER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s),
+memory_region_init_ram(>mem, obj,
"sun4m.idreg", sizeof(idreg_data), _fatal);
 vmstate_register_ram_global(>mem);
 memory_region_set_readonly(>mem, true);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void idreg_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = idreg_init1;
 }
 
 static const TypeInfo idreg_info = {
 .name  = TYPE_MACIO_ID_REGISTER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IDRegState),
-.class_init= idreg_class_init,
+.instance_init = idreg_init1,
 };
 
 #define TYPE_TCX_AFX "tcx_afx"
@@ -633,28 +626,21 @@ static void afx_init(hwaddr addr)
 sysbus_mmio_map(s, 0, addr);
 }
 
-static int afx_init1(SysBusDevice *dev)
+static void afx_init1(Object *obj)
 {
-AFXState *s = TCX_AFX(dev);
+AFXState *s = TCX_AFX(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s), "sun4m.afx", 4, _fatal);
+memory_region_init_ram(>mem, obj, "sun4m.afx", 4, _fatal);
 vmstate_register_ram_global(>mem);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void afx_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = afx_init1;
 }
 
 static const TypeInfo afx_info = {
 .name  = TYPE_TCX_AFX,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(AFXState),
-.class_init= afx_class_init,
+.instance_init = afx_init1,
 };
 
 #define TYPE_OPENPROM "openprom"
@@ -707,16 +693,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4m.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -726,9 +712,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -737,6 +721,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 #define TYPE_SUN4M_MEMORY "memory"
@@ -750,14 +735,14 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4M_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_allocate_system_memory(>ram, OBJECT(d), "sun4m.ram",
  d->size);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size,
@@ -793,9 +778,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 8/8] hw/sparc64: QOM'ify sun4u.c

2017-05-25 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/sparc64/sun4u.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index d347b6616d..18b8f8bcba 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -329,16 +329,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4u.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -348,9 +348,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -359,6 +357,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 
@@ -373,15 +372,15 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4U_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_init_ram(>ram, OBJECT(d), "sun4u.ram", d->size,
_fatal);
 vmstate_register_ram_global(>ram);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size)
@@ -409,9 +408,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 0/8] QOM'ify work for sparc

2017-05-25 Thread xiaoqiang zhao
This patch set aims for QOM'ifying code relate with sparc.
It is part of my QOM'ify work of qemu code base.

Changes:

v2 -> v3:
* rebased on the latest master
* squash two patches about m48txx_sysbus into one

v1 ->  v2: 
* rebased on the latest master

xiaoqiang zhao (8):
  hw/misc: QOM'ify eccmemctl.c
  hw/dma: QOM'ify sparc32_dma.c
  hw/dma: QOM'ify sun4m_iommu.c
  hw/misc: QOM'ify slavio_misc.c
  hw/timer: QOM'ify m48txx_sysbus
  hw/timer: QOM'ify slavio_timer
  hw/sparc: QOM'ify sun4m.c
  hw/sparc64: QOM'ify sun4u.c

 hw/dma/sparc32_dma.c| 25 ++-
 hw/dma/sun4m_iommu.c| 12 +--
 hw/misc/eccmemctl.c | 25 ++-
 hw/misc/slavio_misc.c   | 43 ---
 hw/sparc/sun4m.c| 54 +
 hw/sparc64/sun4u.c  | 20 +-
 hw/timer/m48t59.c   | 38 +-
 hw/timer/slavio_timer.c | 12 +--
 8 files changed, 105 insertions(+), 124 deletions(-)

-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 3/8] hw/dma: QOM'ify sun4m_iommu.c

2017-05-25 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/dma/sun4m_iommu.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/dma/sun4m_iommu.c b/hw/dma/sun4m_iommu.c
index b3cbc54c23..335ef63cbc 100644
--- a/hw/dma/sun4m_iommu.c
+++ b/hw/dma/sun4m_iommu.c
@@ -349,17 +349,16 @@ static void iommu_reset(DeviceState *d)
 s->regs[IOMMU_MASK_ID] = IOMMU_TS_MASK;
 }
 
-static int iommu_init1(SysBusDevice *dev)
+static void iommu_init(Object *obj)
 {
-IOMMUState *s = SUN4M_IOMMU(dev);
+IOMMUState *s = SUN4M_IOMMU(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s, "iommu",
+memory_region_init_io(>iomem, obj, _mem_ops, s, "iommu",
   IOMMU_NREGS * sizeof(uint32_t));
 sysbus_init_mmio(dev, >iomem);
-
-return 0;
 }
 
 static Property iommu_properties[] = {
@@ -370,9 +369,7 @@ static Property iommu_properties[] = {
 static void iommu_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = iommu_init1;
 dc->reset = iommu_reset;
 dc->vmsd = _iommu;
 dc->props = iommu_properties;
@@ -382,6 +379,7 @@ static const TypeInfo iommu_info = {
 .name  = TYPE_SUN4M_IOMMU,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IOMMUState),
+.instance_init = iommu_init,
 .class_init= iommu_class_init,
 };
 
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 1/8] hw/misc: QOM'ify eccmemctl.c

2017-05-25 Thread xiaoqiang zhao
* Split the old SysBus init into an instance_init and a
  DeviceClass::realize function
* Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/misc/eccmemctl.c | 25 -
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/hw/misc/eccmemctl.c b/hw/misc/eccmemctl.c
index a0071f3eae..bb7cc52b5e 100644
--- a/hw/misc/eccmemctl.c
+++ b/hw/misc/eccmemctl.c
@@ -295,22 +295,29 @@ static void ecc_reset(DeviceState *d)
 s->regs[ECC_ECR1] = 0;
 }
 
-static int ecc_init1(SysBusDevice *dev)
+static void ecc_init(Object *obj)
 {
-ECCState *s = ECC_MEMCTL(dev);
+ECCState *s = ECC_MEMCTL(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
-s->regs[0] = s->version;
-memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s, "ecc", 
ECC_SIZE);
+
+memory_region_init_io(>iomem, obj, _mem_ops, s, "ecc", ECC_SIZE);
 sysbus_init_mmio(dev, >iomem);
+}
+
+static void ecc_realize(DeviceState *dev, Error **errp)
+{
+ECCState *s = ECC_MEMCTL(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+s->regs[0] = s->version;
 
 if (s->version == ECC_MCC) { // SS-600MP only
 memory_region_init_io(>iomem_diag, OBJECT(dev), _diag_mem_ops, 
s,
   "ecc.diag", ECC_DIAG_SIZE);
-sysbus_init_mmio(dev, >iomem_diag);
+sysbus_init_mmio(sbd, >iomem_diag);
 }
-
-return 0;
 }
 
 static Property ecc_properties[] = {
@@ -321,9 +328,8 @@ static Property ecc_properties[] = {
 static void ecc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ecc_init1;
+dc->realize = ecc_realize;
 dc->reset = ecc_reset;
 dc->vmsd = _ecc;
 dc->props = ecc_properties;
@@ -333,6 +339,7 @@ static const TypeInfo ecc_info = {
 .name  = TYPE_ECC_MEMCTL,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(ECCState),
+.instance_init = ecc_init,
 .class_init= ecc_class_init,
 };
 
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 2/8] hw/dma: QOM'ify sparc32_dma.c

2017-05-25 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init
and an realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/dma/sparc32_dma.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 9c6bdc6295..eb491b50ca 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -270,23 +270,28 @@ static const VMStateDescription vmstate_dma = {
 }
 };
 
-static int sparc32_dma_init1(SysBusDevice *sbd)
+static void sparc32_dma_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-DMAState *s = SPARC32_DMA(dev);
-int reg_size;
+DeviceState *dev = DEVICE(obj);
+DMAState *s = SPARC32_DMA(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 
-reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
-  "dma", reg_size);
 sysbus_init_mmio(sbd, >iomem);
 
 qdev_init_gpio_in(dev, dma_set_irq, 1);
 qdev_init_gpio_out(dev, s->gpio, 2);
+}
 
-return 0;
+static void sparc32_dma_realize(DeviceState *dev, Error **errp)
+{
+DMAState *s = SPARC32_DMA(dev);
+int reg_size;
+
+reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
+memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s,
+  "dma", reg_size);
 }
 
 static Property sparc32_dma_properties[] = {
@@ -298,12 +303,11 @@ static Property sparc32_dma_properties[] = {
 static void sparc32_dma_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = sparc32_dma_init1;
 dc->reset = dma_reset;
 dc->vmsd = _dma;
 dc->props = sparc32_dma_properties;
+dc->realize = sparc32_dma_realize;
 /* Reason: pointer property "iommu_opaque" */
 dc->user_creatable = false;
 }
@@ -312,6 +316,7 @@ static const TypeInfo sparc32_dma_info = {
 .name  = TYPE_SPARC32_DMA,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(DMAState),
+.instance_init = sparc32_dma_init,
 .class_init= sparc32_dma_class_init,
 };
 
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 5/8] hw/timer: QOM'ify m48txx_sysbus

2017-05-25 Thread xiaoqiang zhao
* split the old SysBus init function into an instance_init
  and a Device realize function
* use DeviceClass::realize instead of SysBusDeviceClass::init
* assign DeviceClass::vmsd instead of using vmstate_register function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/timer/m48t59.c | 38 +++---
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 474981a6ac..3a9f541c9b 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -640,34 +640,33 @@ void m48t59_realize_common(M48t59State *s, Error **errp)
 s->wd_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, _cb, s);
 }
 qemu_get_timedate(>alarm, 0);
-
-vmstate_register(NULL, -1, _m48t59, s);
 }
 
-static int m48t59_init1(SysBusDevice *dev)
+static void m48t59_init1(Object *obj)
 {
-M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev);
-M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
-Object *o = OBJECT(dev);
+M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(obj);
+M48txxSysBusState *d = M48TXX_SYS_BUS(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 M48t59State *s = >state;
-Error *err = NULL;
 
 s->model = u->info.model;
 s->size = u->info.size;
 sysbus_init_irq(dev, >IRQ);
 
-memory_region_init_io(>iomem, o, _ops, s, "m48t59.nvram",
+memory_region_init_io(>iomem, obj, _ops, s, "m48t59.nvram",
   s->size);
-memory_region_init_io(>io, o, _io_ops, s, "m48t59", 4);
-sysbus_init_mmio(dev, >iomem);
-sysbus_init_mmio(dev, >io);
-m48t59_realize_common(s, );
-if (err != NULL) {
-error_free(err);
-return -1;
-}
+memory_region_init_io(>io, obj, _io_ops, s, "m48t59", 4);
+}
+
+static void m48t59_realize(DeviceState *dev, Error **errp)
+{
+M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
+M48t59State *s = >state;
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
-return 0;
+sysbus_init_mmio(sbd, >iomem);
+sysbus_init_mmio(sbd, >io);
+m48t59_realize_common(s, errp);
 }
 
 static uint32_t m48txx_sysbus_read(Nvram *obj, uint32_t addr)
@@ -696,12 +695,12 @@ static Property m48t59_sysbus_properties[] = {
 static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 NvramClass *nc = NVRAM_CLASS(klass);
 
-k->init = m48t59_init1;
+dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
+dc->vmsd = _m48t59;
 nc->read = m48txx_sysbus_read;
 nc->write = m48txx_sysbus_write;
 nc->toggle_lock = m48txx_sysbus_toggle_lock;
@@ -725,6 +724,7 @@ static const TypeInfo m48txx_sysbus_type_info = {
 .name = TYPE_M48TXX_SYS_BUS,
 .parent = TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(M48txxSysBusState),
+.instance_init = m48t59_init1,
 .abstract = true,
 .class_init = m48txx_sysbus_class_init,
 .interfaces = (InterfaceInfo[]) {
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 6/8] hw/timer: QOM'ify slavio_timer

2017-05-25 Thread xiaoqiang zhao
rename slavio_timer_init1 to slavio_timer_init and assign
it to slavio_timer_info.instance_init, then we drop the
SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/timer/slavio_timer.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
index bfee1f3027..a8cc9c0148 100644
--- a/hw/timer/slavio_timer.c
+++ b/hw/timer/slavio_timer.c
@@ -373,9 +373,10 @@ static void slavio_timer_reset(DeviceState *d)
 s->cputimer_mode = 0;
 }
 
-static int slavio_timer_init1(SysBusDevice *dev)
+static void slavio_timer_init(Object *obj)
 {
-SLAVIO_TIMERState *s = SLAVIO_TIMER(dev);
+SLAVIO_TIMERState *s = SLAVIO_TIMER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 QEMUBH *bh;
 unsigned int i;
 TimerContext *tc;
@@ -394,14 +395,12 @@ static int slavio_timer_init1(SysBusDevice *dev)
 
 size = i == 0 ? SYS_TIMER_SIZE : CPU_TIMER_SIZE;
 snprintf(timer_name, sizeof(timer_name), "timer-%i", i);
-memory_region_init_io(>iomem, OBJECT(s), _timer_mem_ops, tc,
+memory_region_init_io(>iomem, obj, _timer_mem_ops, tc,
   timer_name, size);
 sysbus_init_mmio(dev, >iomem);
 
 sysbus_init_irq(dev, >cputimer[i].irq);
 }
-
-return 0;
 }
 
 static Property slavio_timer_properties[] = {
@@ -412,9 +411,7 @@ static Property slavio_timer_properties[] = {
 static void slavio_timer_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_timer_init1;
 dc->reset = slavio_timer_reset;
 dc->vmsd = _slavio_timer;
 dc->props = slavio_timer_properties;
@@ -424,6 +421,7 @@ static const TypeInfo slavio_timer_info = {
 .name  = TYPE_SLAVIO_TIMER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(SLAVIO_TIMERState),
+.instance_init = slavio_timer_init,
 .class_init= slavio_timer_class_init,
 };
 
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v3 4/8] hw/misc: QOM'ify slavio_misc.c

2017-05-25 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
---
 hw/misc/slavio_misc.c | 43 +--
 1 file changed, 17 insertions(+), 26 deletions(-)

diff --git a/hw/misc/slavio_misc.c b/hw/misc/slavio_misc.c
index edd5de0702..e1a706e828 100644
--- a/hw/misc/slavio_misc.c
+++ b/hw/misc/slavio_misc.c
@@ -414,76 +414,73 @@ static const VMStateDescription vmstate_misc = {
 }
 };
 
-static int apc_init1(SysBusDevice *dev)
+static void apc_init(Object *obj)
 {
-APCState *s = APC(dev);
+APCState *s = APC(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >cpu_halt);
 
 /* Power management (APC) XXX: not a Slavio device */
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
+memory_region_init_io(>iomem, obj, _mem_ops, s,
   "apc", MISC_SIZE);
 sysbus_init_mmio(dev, >iomem);
-return 0;
 }
 
-static int slavio_misc_init1(SysBusDevice *sbd)
+static void slavio_misc_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MiscState *s = SLAVIO_MISC(dev);
+DeviceState *dev = DEVICE(obj);
+MiscState *s = SLAVIO_MISC(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 sysbus_init_irq(sbd, >fdc_tc);
 
 /* 8 bit registers */
 /* Slavio control */
-memory_region_init_io(>cfg_iomem, OBJECT(s), _cfg_mem_ops, s,
+memory_region_init_io(>cfg_iomem, obj, _cfg_mem_ops, s,
   "configuration", MISC_SIZE);
 sysbus_init_mmio(sbd, >cfg_iomem);
 
 /* Diagnostics */
-memory_region_init_io(>diag_iomem, OBJECT(s), _diag_mem_ops, s,
+memory_region_init_io(>diag_iomem, obj, _diag_mem_ops, s,
   "diagnostic", MISC_SIZE);
 sysbus_init_mmio(sbd, >diag_iomem);
 
 /* Modem control */
-memory_region_init_io(>mdm_iomem, OBJECT(s), _mdm_mem_ops, s,
+memory_region_init_io(>mdm_iomem, obj, _mdm_mem_ops, s,
   "modem", MISC_SIZE);
 sysbus_init_mmio(sbd, >mdm_iomem);
 
 /* 16 bit registers */
 /* ss600mp diag LEDs */
-memory_region_init_io(>led_iomem, OBJECT(s), _led_mem_ops, s,
+memory_region_init_io(>led_iomem, obj, _led_mem_ops, s,
   "leds", LED_SIZE);
 sysbus_init_mmio(sbd, >led_iomem);
 
 /* 32 bit registers */
 /* System control */
-memory_region_init_io(>sysctrl_iomem, OBJECT(s), 
_sysctrl_mem_ops, s,
+memory_region_init_io(>sysctrl_iomem, obj, _sysctrl_mem_ops, s,
   "system-control", SYSCTRL_SIZE);
 sysbus_init_mmio(sbd, >sysctrl_iomem);
 
 /* AUX 1 (Misc System Functions) */
-memory_region_init_io(>aux1_iomem, OBJECT(s), _aux1_mem_ops, s,
+memory_region_init_io(>aux1_iomem, obj, _aux1_mem_ops, s,
   "misc-system-functions", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux1_iomem);
 
 /* AUX 2 (Software Powerdown Control) */
-memory_region_init_io(>aux2_iomem, OBJECT(s), _aux2_mem_ops, s,
+memory_region_init_io(>aux2_iomem, obj, _aux2_mem_ops, s,
   "software-powerdown-control", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux2_iomem);
 
 qdev_init_gpio_in(dev, slavio_set_power_fail, 1);
-
-return 0;
 }
 
 static void slavio_misc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_misc_init1;
 dc->reset = slavio_misc_reset;
 dc->vmsd = _misc;
 }
@@ -492,21 +489,15 @@ static const TypeInfo slavio_misc_info = {
 .name  = TYPE_SLAVIO_MISC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
+.instance_init = slavio_misc_init,
 .class_init= slavio_misc_class_init,
 };
 
-static void apc_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = apc_init1;
-}
-
 static const TypeInfo apc_info = {
 .name  = TYPE_APC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
-.class_init= apc_class_init,
+.instance_init = apc_init,
 };
 
 static void slavio_misc_register_types(void)
-- 
2.13.0.rc2.115.g10c78a162





[Qemu-devel] [PATCH v2 9/9] hw/sparc64: QOM'ify sun4u.c

2017-04-29 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sparc64/sun4u.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index d347b6616d..18b8f8bcba 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -329,16 +329,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4u.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -348,9 +348,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -359,6 +357,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 
@@ -373,15 +372,15 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4U_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_init_ram(>ram, OBJECT(d), "sun4u.ram", d->size,
_fatal);
 vmstate_register_ram_global(>ram);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size)
@@ -409,9 +408,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 2/9] hw/dma: QOM'ify sparc32_dma.c

2017-04-29 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init
and an realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/dma/sparc32_dma.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 9d545e412e..ef4c6a93c8 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -270,23 +270,28 @@ static const VMStateDescription vmstate_dma = {
 }
 };
 
-static int sparc32_dma_init1(SysBusDevice *sbd)
+static void sparc32_dma_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-DMAState *s = SPARC32_DMA(dev);
-int reg_size;
+DeviceState *dev = DEVICE(obj);
+DMAState *s = SPARC32_DMA(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 
-reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
-  "dma", reg_size);
 sysbus_init_mmio(sbd, >iomem);
 
 qdev_init_gpio_in(dev, dma_set_irq, 1);
 qdev_init_gpio_out(dev, s->gpio, 2);
+}
 
-return 0;
+static void sparc32_dma_realize(DeviceState *dev, Error **errp)
+{
+DMAState *s = SPARC32_DMA(dev);
+int reg_size;
+
+reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
+memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s,
+  "dma", reg_size);
 }
 
 static Property sparc32_dma_properties[] = {
@@ -298,12 +303,11 @@ static Property sparc32_dma_properties[] = {
 static void sparc32_dma_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = sparc32_dma_init1;
 dc->reset = dma_reset;
 dc->vmsd = _dma;
 dc->props = sparc32_dma_properties;
+dc->realize = sparc32_dma_realize;
 /* Reason: pointer property "iommu_opaque" */
 dc->cannot_instantiate_with_device_add_yet = true;
 }
@@ -312,6 +316,7 @@ static const TypeInfo sparc32_dma_info = {
 .name  = TYPE_SPARC32_DMA,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(DMAState),
+.instance_init = sparc32_dma_init,
 .class_init= sparc32_dma_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 4/9] hw/misc: QOM'ify slavio_misc.c

2017-04-29 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/slavio_misc.c | 43 +--
 1 file changed, 17 insertions(+), 26 deletions(-)

diff --git a/hw/misc/slavio_misc.c b/hw/misc/slavio_misc.c
index edd5de0702..e1a706e828 100644
--- a/hw/misc/slavio_misc.c
+++ b/hw/misc/slavio_misc.c
@@ -414,76 +414,73 @@ static const VMStateDescription vmstate_misc = {
 }
 };
 
-static int apc_init1(SysBusDevice *dev)
+static void apc_init(Object *obj)
 {
-APCState *s = APC(dev);
+APCState *s = APC(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >cpu_halt);
 
 /* Power management (APC) XXX: not a Slavio device */
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
+memory_region_init_io(>iomem, obj, _mem_ops, s,
   "apc", MISC_SIZE);
 sysbus_init_mmio(dev, >iomem);
-return 0;
 }
 
-static int slavio_misc_init1(SysBusDevice *sbd)
+static void slavio_misc_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MiscState *s = SLAVIO_MISC(dev);
+DeviceState *dev = DEVICE(obj);
+MiscState *s = SLAVIO_MISC(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 sysbus_init_irq(sbd, >fdc_tc);
 
 /* 8 bit registers */
 /* Slavio control */
-memory_region_init_io(>cfg_iomem, OBJECT(s), _cfg_mem_ops, s,
+memory_region_init_io(>cfg_iomem, obj, _cfg_mem_ops, s,
   "configuration", MISC_SIZE);
 sysbus_init_mmio(sbd, >cfg_iomem);
 
 /* Diagnostics */
-memory_region_init_io(>diag_iomem, OBJECT(s), _diag_mem_ops, s,
+memory_region_init_io(>diag_iomem, obj, _diag_mem_ops, s,
   "diagnostic", MISC_SIZE);
 sysbus_init_mmio(sbd, >diag_iomem);
 
 /* Modem control */
-memory_region_init_io(>mdm_iomem, OBJECT(s), _mdm_mem_ops, s,
+memory_region_init_io(>mdm_iomem, obj, _mdm_mem_ops, s,
   "modem", MISC_SIZE);
 sysbus_init_mmio(sbd, >mdm_iomem);
 
 /* 16 bit registers */
 /* ss600mp diag LEDs */
-memory_region_init_io(>led_iomem, OBJECT(s), _led_mem_ops, s,
+memory_region_init_io(>led_iomem, obj, _led_mem_ops, s,
   "leds", LED_SIZE);
 sysbus_init_mmio(sbd, >led_iomem);
 
 /* 32 bit registers */
 /* System control */
-memory_region_init_io(>sysctrl_iomem, OBJECT(s), 
_sysctrl_mem_ops, s,
+memory_region_init_io(>sysctrl_iomem, obj, _sysctrl_mem_ops, s,
   "system-control", SYSCTRL_SIZE);
 sysbus_init_mmio(sbd, >sysctrl_iomem);
 
 /* AUX 1 (Misc System Functions) */
-memory_region_init_io(>aux1_iomem, OBJECT(s), _aux1_mem_ops, s,
+memory_region_init_io(>aux1_iomem, obj, _aux1_mem_ops, s,
   "misc-system-functions", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux1_iomem);
 
 /* AUX 2 (Software Powerdown Control) */
-memory_region_init_io(>aux2_iomem, OBJECT(s), _aux2_mem_ops, s,
+memory_region_init_io(>aux2_iomem, obj, _aux2_mem_ops, s,
   "software-powerdown-control", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux2_iomem);
 
 qdev_init_gpio_in(dev, slavio_set_power_fail, 1);
-
-return 0;
 }
 
 static void slavio_misc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_misc_init1;
 dc->reset = slavio_misc_reset;
 dc->vmsd = _misc;
 }
@@ -492,21 +489,15 @@ static const TypeInfo slavio_misc_info = {
 .name  = TYPE_SLAVIO_MISC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
+.instance_init = slavio_misc_init,
 .class_init= slavio_misc_class_init,
 };
 
-static void apc_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = apc_init1;
-}
-
 static const TypeInfo apc_info = {
 .name  = TYPE_APC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
-.class_init= apc_class_init,
+.instance_init = apc_init,
 };
 
 static void slavio_misc_register_types(void)
-- 
2.11.0





[Qemu-devel] [PATCH v2 7/9] hw/timer: QOM'ify slavio_timer

2017-04-29 Thread xiaoqiang zhao
rename slavio_timer_init1 to slavio_timer_init and assign
it to slavio_timer_info.instance_init, then we drop the
SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/slavio_timer.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
index bfee1f3027..a8cc9c0148 100644
--- a/hw/timer/slavio_timer.c
+++ b/hw/timer/slavio_timer.c
@@ -373,9 +373,10 @@ static void slavio_timer_reset(DeviceState *d)
 s->cputimer_mode = 0;
 }
 
-static int slavio_timer_init1(SysBusDevice *dev)
+static void slavio_timer_init(Object *obj)
 {
-SLAVIO_TIMERState *s = SLAVIO_TIMER(dev);
+SLAVIO_TIMERState *s = SLAVIO_TIMER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 QEMUBH *bh;
 unsigned int i;
 TimerContext *tc;
@@ -394,14 +395,12 @@ static int slavio_timer_init1(SysBusDevice *dev)
 
 size = i == 0 ? SYS_TIMER_SIZE : CPU_TIMER_SIZE;
 snprintf(timer_name, sizeof(timer_name), "timer-%i", i);
-memory_region_init_io(>iomem, OBJECT(s), _timer_mem_ops, tc,
+memory_region_init_io(>iomem, obj, _timer_mem_ops, tc,
   timer_name, size);
 sysbus_init_mmio(dev, >iomem);
 
 sysbus_init_irq(dev, >cputimer[i].irq);
 }
-
-return 0;
 }
 
 static Property slavio_timer_properties[] = {
@@ -412,9 +411,7 @@ static Property slavio_timer_properties[] = {
 static void slavio_timer_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_timer_init1;
 dc->reset = slavio_timer_reset;
 dc->vmsd = _slavio_timer;
 dc->props = slavio_timer_properties;
@@ -424,6 +421,7 @@ static const TypeInfo slavio_timer_info = {
 .name  = TYPE_SLAVIO_TIMER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(SLAVIO_TIMERState),
+.instance_init = slavio_timer_init,
 .class_init= slavio_timer_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 8/9] hw/sparc: QOM'ify sun4m.c

2017-04-29 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sparc/sun4m.c | 54 +++---
 1 file changed, 19 insertions(+), 35 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 5f022cc08d..0faff4619f 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -585,30 +585,23 @@ typedef struct IDRegState {
 MemoryRegion mem;
 } IDRegState;
 
-static int idreg_init1(SysBusDevice *dev)
+static void idreg_init1(Object *obj)
 {
-IDRegState *s = MACIO_ID_REGISTER(dev);
+IDRegState *s = MACIO_ID_REGISTER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s),
+memory_region_init_ram(>mem, obj,
"sun4m.idreg", sizeof(idreg_data), _fatal);
 vmstate_register_ram_global(>mem);
 memory_region_set_readonly(>mem, true);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void idreg_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = idreg_init1;
 }
 
 static const TypeInfo idreg_info = {
 .name  = TYPE_MACIO_ID_REGISTER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IDRegState),
-.class_init= idreg_class_init,
+.instance_init = idreg_init1,
 };
 
 #define TYPE_TCX_AFX "tcx_afx"
@@ -633,28 +626,21 @@ static void afx_init(hwaddr addr)
 sysbus_mmio_map(s, 0, addr);
 }
 
-static int afx_init1(SysBusDevice *dev)
+static void afx_init1(Object *obj)
 {
-AFXState *s = TCX_AFX(dev);
+AFXState *s = TCX_AFX(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s), "sun4m.afx", 4, _fatal);
+memory_region_init_ram(>mem, obj, "sun4m.afx", 4, _fatal);
 vmstate_register_ram_global(>mem);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void afx_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = afx_init1;
 }
 
 static const TypeInfo afx_info = {
 .name  = TYPE_TCX_AFX,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(AFXState),
-.class_init= afx_class_init,
+.instance_init = afx_init1,
 };
 
 #define TYPE_OPENPROM "openprom"
@@ -707,16 +693,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4m.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -726,9 +712,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -737,6 +721,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 #define TYPE_SUN4M_MEMORY "memory"
@@ -750,14 +735,14 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4M_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_allocate_system_memory(>ram, OBJECT(d), "sun4m.ram",
  d->size);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size,
@@ -793,9 +778,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 1/9] hw/misc: QOM'ify eccmemctl.c

2017-04-29 Thread xiaoqiang zhao
* Split the old SysBus init into an instance_init and a
  DeviceClass::realize function
* Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/eccmemctl.c | 25 -
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/hw/misc/eccmemctl.c b/hw/misc/eccmemctl.c
index a0071f3eae..bb7cc52b5e 100644
--- a/hw/misc/eccmemctl.c
+++ b/hw/misc/eccmemctl.c
@@ -295,22 +295,29 @@ static void ecc_reset(DeviceState *d)
 s->regs[ECC_ECR1] = 0;
 }
 
-static int ecc_init1(SysBusDevice *dev)
+static void ecc_init(Object *obj)
 {
-ECCState *s = ECC_MEMCTL(dev);
+ECCState *s = ECC_MEMCTL(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
-s->regs[0] = s->version;
-memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s, "ecc", 
ECC_SIZE);
+
+memory_region_init_io(>iomem, obj, _mem_ops, s, "ecc", ECC_SIZE);
 sysbus_init_mmio(dev, >iomem);
+}
+
+static void ecc_realize(DeviceState *dev, Error **errp)
+{
+ECCState *s = ECC_MEMCTL(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+s->regs[0] = s->version;
 
 if (s->version == ECC_MCC) { // SS-600MP only
 memory_region_init_io(>iomem_diag, OBJECT(dev), _diag_mem_ops, 
s,
   "ecc.diag", ECC_DIAG_SIZE);
-sysbus_init_mmio(dev, >iomem_diag);
+sysbus_init_mmio(sbd, >iomem_diag);
 }
-
-return 0;
 }
 
 static Property ecc_properties[] = {
@@ -321,9 +328,8 @@ static Property ecc_properties[] = {
 static void ecc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ecc_init1;
+dc->realize = ecc_realize;
 dc->reset = ecc_reset;
 dc->vmsd = _ecc;
 dc->props = ecc_properties;
@@ -333,6 +339,7 @@ static const TypeInfo ecc_info = {
 .name  = TYPE_ECC_MEMCTL,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(ECCState),
+.instance_init = ecc_init,
 .class_init= ecc_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 6/9] hw/timer: QOM'ify m48txx_sysbus (pass 2)

2017-04-29 Thread xiaoqiang zhao
assign DeviceClass::vmsd instead of using vmstate_register function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/m48t59.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index eff259ef96..3a9f541c9b 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -640,8 +640,6 @@ void m48t59_realize_common(M48t59State *s, Error **errp)
 s->wd_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, _cb, s);
 }
 qemu_get_timedate(>alarm, 0);
-
-vmstate_register(NULL, -1, _m48t59, s);
 }
 
 static void m48t59_init1(Object *obj)
@@ -702,6 +700,7 @@ static void m48txx_sysbus_class_init(ObjectClass *klass, 
void *data)
 dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
+dc->vmsd = _m48t59;
 nc->read = m48txx_sysbus_read;
 nc->write = m48txx_sysbus_write;
 nc->toggle_lock = m48txx_sysbus_toggle_lock;
-- 
2.11.0





[Qemu-devel] [PATCH v2 0/9] QOM'ify work for sparc

2017-04-29 Thread xiaoqiang zhao
This patch set aims for QOM'ifying code relate with sparc.
It is part of my QOM'ify work of qemu code base.

changes since v1: 
* rebased on the latest master

xiaoqiang zhao (9):
  hw/misc: QOM'ify eccmemctl.c
  hw/dma: QOM'ify sparc32_dma.c
  hw/dma: QOM'ify sun4m_iommu.c
  hw/misc: QOM'ify slavio_misc.c
  hw/timer: QOM'ify m48txx_sysbus (pass 1)
  hw/timer: QOM'ify m48txx_sysbus (pass 2)
  hw/timer: QOM'ify slavio_timer
  hw/sparc: QOM'ify sun4m.c
  hw/sparc64: QOM'ify sun4u.c

 hw/dma/sparc32_dma.c| 25 ++-
 hw/dma/sun4m_iommu.c| 12 +--
 hw/misc/eccmemctl.c | 25 ++-
 hw/misc/slavio_misc.c   | 43 ---
 hw/sparc/sun4m.c| 54 +
 hw/sparc64/sun4u.c  | 20 +-
 hw/timer/m48t59.c   | 38 +-
 hw/timer/slavio_timer.c | 12 +--
 8 files changed, 105 insertions(+), 124 deletions(-)

-- 
2.11.0





[Qemu-devel] [PATCH v2 5/9] hw/timer: QOM'ify m48txx_sysbus (pass 1)

2017-04-29 Thread xiaoqiang zhao
* split the old SysBus init function into an instance_init
  and a Device realize function
* use DeviceClass::realize instead of SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/m48t59.c | 35 ++-
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 474981a6ac..eff259ef96 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -644,30 +644,31 @@ void m48t59_realize_common(M48t59State *s, Error **errp)
 vmstate_register(NULL, -1, _m48t59, s);
 }
 
-static int m48t59_init1(SysBusDevice *dev)
+static void m48t59_init1(Object *obj)
 {
-M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev);
-M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
-Object *o = OBJECT(dev);
+M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(obj);
+M48txxSysBusState *d = M48TXX_SYS_BUS(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 M48t59State *s = >state;
-Error *err = NULL;
 
 s->model = u->info.model;
 s->size = u->info.size;
 sysbus_init_irq(dev, >IRQ);
 
-memory_region_init_io(>iomem, o, _ops, s, "m48t59.nvram",
+memory_region_init_io(>iomem, obj, _ops, s, "m48t59.nvram",
   s->size);
-memory_region_init_io(>io, o, _io_ops, s, "m48t59", 4);
-sysbus_init_mmio(dev, >iomem);
-sysbus_init_mmio(dev, >io);
-m48t59_realize_common(s, );
-if (err != NULL) {
-error_free(err);
-return -1;
-}
+memory_region_init_io(>io, obj, _io_ops, s, "m48t59", 4);
+}
+
+static void m48t59_realize(DeviceState *dev, Error **errp)
+{
+M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
+M48t59State *s = >state;
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
-return 0;
+sysbus_init_mmio(sbd, >iomem);
+sysbus_init_mmio(sbd, >io);
+m48t59_realize_common(s, errp);
 }
 
 static uint32_t m48txx_sysbus_read(Nvram *obj, uint32_t addr)
@@ -696,10 +697,9 @@ static Property m48t59_sysbus_properties[] = {
 static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 NvramClass *nc = NVRAM_CLASS(klass);
 
-k->init = m48t59_init1;
+dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
 nc->read = m48txx_sysbus_read;
@@ -725,6 +725,7 @@ static const TypeInfo m48txx_sysbus_type_info = {
 .name = TYPE_M48TXX_SYS_BUS,
 .parent = TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(M48txxSysBusState),
+.instance_init = m48t59_init1,
 .abstract = true,
 .class_init = m48txx_sysbus_class_init,
 .interfaces = (InterfaceInfo[]) {
-- 
2.11.0





[Qemu-devel] [PATCH v2 3/9] hw/dma: QOM'ify sun4m_iommu.c

2017-04-29 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/dma/sun4m_iommu.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/dma/sun4m_iommu.c b/hw/dma/sun4m_iommu.c
index b3cbc54c23..335ef63cbc 100644
--- a/hw/dma/sun4m_iommu.c
+++ b/hw/dma/sun4m_iommu.c
@@ -349,17 +349,16 @@ static void iommu_reset(DeviceState *d)
 s->regs[IOMMU_MASK_ID] = IOMMU_TS_MASK;
 }
 
-static int iommu_init1(SysBusDevice *dev)
+static void iommu_init(Object *obj)
 {
-IOMMUState *s = SUN4M_IOMMU(dev);
+IOMMUState *s = SUN4M_IOMMU(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s, "iommu",
+memory_region_init_io(>iomem, obj, _mem_ops, s, "iommu",
   IOMMU_NREGS * sizeof(uint32_t));
 sysbus_init_mmio(dev, >iomem);
-
-return 0;
 }
 
 static Property iommu_properties[] = {
@@ -370,9 +369,7 @@ static Property iommu_properties[] = {
 static void iommu_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = iommu_init1;
 dc->reset = iommu_reset;
 dc->vmsd = _iommu;
 dc->props = iommu_properties;
@@ -382,6 +379,7 @@ static const TypeInfo iommu_info = {
 .name  = TYPE_SUN4M_IOMMU,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IOMMUState),
+.instance_init = iommu_init,
 .class_init= iommu_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 2/9] hw/dma: QOM'ify sparc32_dma.c

2017-02-05 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init
and an realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/dma/sparc32_dma.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 9d545e412e..ef4c6a93c8 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -270,23 +270,28 @@ static const VMStateDescription vmstate_dma = {
 }
 };
 
-static int sparc32_dma_init1(SysBusDevice *sbd)
+static void sparc32_dma_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-DMAState *s = SPARC32_DMA(dev);
-int reg_size;
+DeviceState *dev = DEVICE(obj);
+DMAState *s = SPARC32_DMA(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 
-reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
-  "dma", reg_size);
 sysbus_init_mmio(sbd, >iomem);
 
 qdev_init_gpio_in(dev, dma_set_irq, 1);
 qdev_init_gpio_out(dev, s->gpio, 2);
+}
 
-return 0;
+static void sparc32_dma_realize(DeviceState *dev, Error **errp)
+{
+DMAState *s = SPARC32_DMA(dev);
+int reg_size;
+
+reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
+memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s,
+  "dma", reg_size);
 }
 
 static Property sparc32_dma_properties[] = {
@@ -298,12 +303,11 @@ static Property sparc32_dma_properties[] = {
 static void sparc32_dma_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = sparc32_dma_init1;
 dc->reset = dma_reset;
 dc->vmsd = _dma;
 dc->props = sparc32_dma_properties;
+dc->realize = sparc32_dma_realize;
 /* Reason: pointer property "iommu_opaque" */
 dc->cannot_instantiate_with_device_add_yet = true;
 }
@@ -312,6 +316,7 @@ static const TypeInfo sparc32_dma_info = {
 .name  = TYPE_SPARC32_DMA,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(DMAState),
+.instance_init = sparc32_dma_init,
 .class_init= sparc32_dma_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 3/9] hw/dma: QOM'ify sun4m_iommu.c

2017-02-05 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/dma/sun4m_iommu.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/dma/sun4m_iommu.c b/hw/dma/sun4m_iommu.c
index b3cbc54c23..335ef63cbc 100644
--- a/hw/dma/sun4m_iommu.c
+++ b/hw/dma/sun4m_iommu.c
@@ -349,17 +349,16 @@ static void iommu_reset(DeviceState *d)
 s->regs[IOMMU_MASK_ID] = IOMMU_TS_MASK;
 }
 
-static int iommu_init1(SysBusDevice *dev)
+static void iommu_init(Object *obj)
 {
-IOMMUState *s = SUN4M_IOMMU(dev);
+IOMMUState *s = SUN4M_IOMMU(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s, "iommu",
+memory_region_init_io(>iomem, obj, _mem_ops, s, "iommu",
   IOMMU_NREGS * sizeof(uint32_t));
 sysbus_init_mmio(dev, >iomem);
-
-return 0;
 }
 
 static Property iommu_properties[] = {
@@ -370,9 +369,7 @@ static Property iommu_properties[] = {
 static void iommu_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = iommu_init1;
 dc->reset = iommu_reset;
 dc->vmsd = _iommu;
 dc->props = iommu_properties;
@@ -382,6 +379,7 @@ static const TypeInfo iommu_info = {
 .name  = TYPE_SUN4M_IOMMU,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IOMMUState),
+.instance_init = iommu_init,
 .class_init= iommu_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 4/9] hw/misc: QOM'ify slavio_misc.c

2017-02-05 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/slavio_misc.c | 43 +--
 1 file changed, 17 insertions(+), 26 deletions(-)

diff --git a/hw/misc/slavio_misc.c b/hw/misc/slavio_misc.c
index edd5de0702..e1a706e828 100644
--- a/hw/misc/slavio_misc.c
+++ b/hw/misc/slavio_misc.c
@@ -414,76 +414,73 @@ static const VMStateDescription vmstate_misc = {
 }
 };
 
-static int apc_init1(SysBusDevice *dev)
+static void apc_init(Object *obj)
 {
-APCState *s = APC(dev);
+APCState *s = APC(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >cpu_halt);
 
 /* Power management (APC) XXX: not a Slavio device */
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
+memory_region_init_io(>iomem, obj, _mem_ops, s,
   "apc", MISC_SIZE);
 sysbus_init_mmio(dev, >iomem);
-return 0;
 }
 
-static int slavio_misc_init1(SysBusDevice *sbd)
+static void slavio_misc_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MiscState *s = SLAVIO_MISC(dev);
+DeviceState *dev = DEVICE(obj);
+MiscState *s = SLAVIO_MISC(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 sysbus_init_irq(sbd, >fdc_tc);
 
 /* 8 bit registers */
 /* Slavio control */
-memory_region_init_io(>cfg_iomem, OBJECT(s), _cfg_mem_ops, s,
+memory_region_init_io(>cfg_iomem, obj, _cfg_mem_ops, s,
   "configuration", MISC_SIZE);
 sysbus_init_mmio(sbd, >cfg_iomem);
 
 /* Diagnostics */
-memory_region_init_io(>diag_iomem, OBJECT(s), _diag_mem_ops, s,
+memory_region_init_io(>diag_iomem, obj, _diag_mem_ops, s,
   "diagnostic", MISC_SIZE);
 sysbus_init_mmio(sbd, >diag_iomem);
 
 /* Modem control */
-memory_region_init_io(>mdm_iomem, OBJECT(s), _mdm_mem_ops, s,
+memory_region_init_io(>mdm_iomem, obj, _mdm_mem_ops, s,
   "modem", MISC_SIZE);
 sysbus_init_mmio(sbd, >mdm_iomem);
 
 /* 16 bit registers */
 /* ss600mp diag LEDs */
-memory_region_init_io(>led_iomem, OBJECT(s), _led_mem_ops, s,
+memory_region_init_io(>led_iomem, obj, _led_mem_ops, s,
   "leds", LED_SIZE);
 sysbus_init_mmio(sbd, >led_iomem);
 
 /* 32 bit registers */
 /* System control */
-memory_region_init_io(>sysctrl_iomem, OBJECT(s), 
_sysctrl_mem_ops, s,
+memory_region_init_io(>sysctrl_iomem, obj, _sysctrl_mem_ops, s,
   "system-control", SYSCTRL_SIZE);
 sysbus_init_mmio(sbd, >sysctrl_iomem);
 
 /* AUX 1 (Misc System Functions) */
-memory_region_init_io(>aux1_iomem, OBJECT(s), _aux1_mem_ops, s,
+memory_region_init_io(>aux1_iomem, obj, _aux1_mem_ops, s,
   "misc-system-functions", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux1_iomem);
 
 /* AUX 2 (Software Powerdown Control) */
-memory_region_init_io(>aux2_iomem, OBJECT(s), _aux2_mem_ops, s,
+memory_region_init_io(>aux2_iomem, obj, _aux2_mem_ops, s,
   "software-powerdown-control", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux2_iomem);
 
 qdev_init_gpio_in(dev, slavio_set_power_fail, 1);
-
-return 0;
 }
 
 static void slavio_misc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_misc_init1;
 dc->reset = slavio_misc_reset;
 dc->vmsd = _misc;
 }
@@ -492,21 +489,15 @@ static const TypeInfo slavio_misc_info = {
 .name  = TYPE_SLAVIO_MISC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
+.instance_init = slavio_misc_init,
 .class_init= slavio_misc_class_init,
 };
 
-static void apc_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = apc_init1;
-}
-
 static const TypeInfo apc_info = {
 .name  = TYPE_APC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
-.class_init= apc_class_init,
+.instance_init = apc_init,
 };
 
 static void slavio_misc_register_types(void)
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 5/9] hw/timer: QOM'ify m48txx_sysbus (pass 1)

2017-02-05 Thread xiaoqiang zhao
* split the old SysBus init function into an instance_init
  and a Device realize function
* use DeviceClass::realize instead of SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/m48t59.c | 35 ++-
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index e46ca88391..39e425e950 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -765,30 +765,31 @@ static void m48t59_isa_realize(DeviceState *dev, Error 
**errp)
 }
 }
 
-static int m48t59_init1(SysBusDevice *dev)
+static void m48t59_init1(Object *obj)
 {
-M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev);
-M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
-Object *o = OBJECT(dev);
+M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(obj);
+M48txxSysBusState *d = M48TXX_SYS_BUS(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 M48t59State *s = >state;
-Error *err = NULL;
 
 s->model = u->info.model;
 s->size = u->info.size;
 sysbus_init_irq(dev, >IRQ);
 
-memory_region_init_io(>iomem, o, _ops, s, "m48t59.nvram",
+memory_region_init_io(>iomem, obj, _ops, s, "m48t59.nvram",
   s->size);
-memory_region_init_io(>io, o, _io_ops, s, "m48t59", 4);
-sysbus_init_mmio(dev, >iomem);
-sysbus_init_mmio(dev, >io);
-m48t59_realize_common(s, );
-if (err != NULL) {
-error_free(err);
-return -1;
-}
+memory_region_init_io(>io, obj, _io_ops, s, "m48t59", 4);
+}
 
-return 0;
+static void m48t59_realize(DeviceState *dev, Error **errp)
+{
+M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
+M48t59State *s = >state;
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+sysbus_init_mmio(sbd, >iomem);
+sysbus_init_mmio(sbd, >io);
+m48t59_realize_common(s, errp);
 }
 
 static uint32_t m48txx_isa_read(Nvram *obj, uint32_t addr)
@@ -862,10 +863,9 @@ static Property m48t59_sysbus_properties[] = {
 static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 NvramClass *nc = NVRAM_CLASS(klass);
 
-k->init = m48t59_init1;
+dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
 nc->read = m48txx_sysbus_read;
@@ -891,6 +891,7 @@ static const TypeInfo m48txx_sysbus_type_info = {
 .name = TYPE_M48TXX_SYS_BUS,
 .parent = TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(M48txxSysBusState),
+.instance_init = m48t59_init1,
 .abstract = true,
 .class_init = m48txx_sysbus_class_init,
 .interfaces = (InterfaceInfo[]) {
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 7/9] hw/timer: QOM'ify slavio_timer

2017-02-05 Thread xiaoqiang zhao
rename slavio_timer_init1 to slavio_timer_init and assign
it to slavio_timer_info.instance_init, then we drop the
SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/slavio_timer.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
index bfee1f3027..a8cc9c0148 100644
--- a/hw/timer/slavio_timer.c
+++ b/hw/timer/slavio_timer.c
@@ -373,9 +373,10 @@ static void slavio_timer_reset(DeviceState *d)
 s->cputimer_mode = 0;
 }
 
-static int slavio_timer_init1(SysBusDevice *dev)
+static void slavio_timer_init(Object *obj)
 {
-SLAVIO_TIMERState *s = SLAVIO_TIMER(dev);
+SLAVIO_TIMERState *s = SLAVIO_TIMER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 QEMUBH *bh;
 unsigned int i;
 TimerContext *tc;
@@ -394,14 +395,12 @@ static int slavio_timer_init1(SysBusDevice *dev)
 
 size = i == 0 ? SYS_TIMER_SIZE : CPU_TIMER_SIZE;
 snprintf(timer_name, sizeof(timer_name), "timer-%i", i);
-memory_region_init_io(>iomem, OBJECT(s), _timer_mem_ops, tc,
+memory_region_init_io(>iomem, obj, _timer_mem_ops, tc,
   timer_name, size);
 sysbus_init_mmio(dev, >iomem);
 
 sysbus_init_irq(dev, >cputimer[i].irq);
 }
-
-return 0;
 }
 
 static Property slavio_timer_properties[] = {
@@ -412,9 +411,7 @@ static Property slavio_timer_properties[] = {
 static void slavio_timer_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_timer_init1;
 dc->reset = slavio_timer_reset;
 dc->vmsd = _slavio_timer;
 dc->props = slavio_timer_properties;
@@ -424,6 +421,7 @@ static const TypeInfo slavio_timer_info = {
 .name  = TYPE_SLAVIO_TIMER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(SLAVIO_TIMERState),
+.instance_init = slavio_timer_init,
 .class_init= slavio_timer_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 9/9] hw/sparc64: QOM'ify sun4u.c

2017-02-05 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sparc64/sun4u.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index d1a6bca873..5182be2e1f 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -329,16 +329,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4u.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -348,9 +348,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -359,6 +357,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 
@@ -373,15 +372,15 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4U_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_init_ram(>ram, OBJECT(d), "sun4u.ram", d->size,
_fatal);
 vmstate_register_ram_global(>ram);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size)
@@ -409,9 +408,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 6/9] hw/timer: QOM'ify m48txx_sysbus (pass 2)

2017-02-05 Thread xiaoqiang zhao
assign DeviceClass::vmsd instead of using vmstate_register function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/m48t59.c | 26 --
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 39e425e950..6afcce4669 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -639,6 +639,28 @@ static const VMStateDescription vmstate_m48t59 = {
 }
 };
 
+static const VMStateDescription vmstate_m48t59_isa = {
+.name = "m48t59",
+.version_id = 1,
+.minimum_version_id = 1,
+.fields = (VMStateField[]) {
+VMSTATE_STRUCT(state, M48txxISAState, 0,
+   vmstate_m48t59, M48t59State),
+VMSTATE_END_OF_LIST()
+}
+};
+
+static const VMStateDescription vmstate_m48t59_sys_bus = {
+.name = "m48t59",
+.version_id = 1,
+.minimum_version_id = 1,
+.fields = (VMStateField[]) {
+VMSTATE_STRUCT(state, M48txxSysBusState, 0,
+   vmstate_m48t59, M48t59State),
+VMSTATE_END_OF_LIST()
+}
+};
+
 static void m48t59_reset_common(M48t59State *NVRAM)
 {
 NVRAM->addr = 0;
@@ -744,8 +766,6 @@ static void m48t59_realize_common(M48t59State *s, Error 
**errp)
 s->wd_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, _cb, s);
 }
 qemu_get_timedate(>alarm, 0);
-
-vmstate_register(NULL, -1, _m48t59, s);
 }
 
 static void m48t59_isa_realize(DeviceState *dev, Error **errp)
@@ -824,6 +844,7 @@ static void m48txx_isa_class_init(ObjectClass *klass, void 
*data)
 dc->realize = m48t59_isa_realize;
 dc->reset = m48t59_reset_isa;
 dc->props = m48t59_isa_properties;
+dc->vmsd = _m48t59_isa;
 nc->read = m48txx_isa_read;
 nc->write = m48txx_isa_write;
 nc->toggle_lock = m48txx_isa_toggle_lock;
@@ -868,6 +889,7 @@ static void m48txx_sysbus_class_init(ObjectClass *klass, 
void *data)
 dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
+dc->vmsd = _m48t59_sys_bus;
 nc->read = m48txx_sysbus_read;
 nc->write = m48txx_sysbus_write;
 nc->toggle_lock = m48txx_sysbus_toggle_lock;
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 0/9] QOM'ify work for sparc

2017-02-05 Thread xiaoqiang zhao
Rebased on the latest master.

This patch set aims for QOM'ifying code relate with sparc.
It is part of my QOM'ify work of qemu code base.

xiaoqiang zhao (9):
  hw/misc: QOM'ify eccmemctl.c
  hw/dma: QOM'ify sparc32_dma.c
  hw/dma: QOM'ify sun4m_iommu.c
  hw/misc: QOM'ify slavio_misc.c
  hw/timer: QOM'ify m48txx_sysbus (pass 1)
  hw/timer: QOM'ify m48txx_sysbus (pass 2)
  hw/timer: QOM'ify slavio_timer
  hw/sparc: QOM'ify sun4m.c
  hw/sparc64: QOM'ify sun4u.c

 hw/dma/sparc32_dma.c| 25 
 hw/dma/sun4m_iommu.c| 12 --
 hw/misc/eccmemctl.c | 25 
 hw/misc/slavio_misc.c   | 43 ++
 hw/sparc/sun4m.c| 54 +++
 hw/sparc64/sun4u.c  | 20 
 hw/timer/m48t59.c   | 61 ++---
 hw/timer/slavio_timer.c | 12 --
 8 files changed, 128 insertions(+), 124 deletions(-)

-- 
2.11.0





[Qemu-devel] [RESEND PATCH 1/9] hw/misc: QOM'ify eccmemctl.c

2017-02-05 Thread xiaoqiang zhao
* Split the old SysBus init into an instance_init and a
  DeviceClass::realize function
* Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/eccmemctl.c | 25 -
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/hw/misc/eccmemctl.c b/hw/misc/eccmemctl.c
index a0071f3eae..bb7cc52b5e 100644
--- a/hw/misc/eccmemctl.c
+++ b/hw/misc/eccmemctl.c
@@ -295,22 +295,29 @@ static void ecc_reset(DeviceState *d)
 s->regs[ECC_ECR1] = 0;
 }
 
-static int ecc_init1(SysBusDevice *dev)
+static void ecc_init(Object *obj)
 {
-ECCState *s = ECC_MEMCTL(dev);
+ECCState *s = ECC_MEMCTL(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
-s->regs[0] = s->version;
-memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s, "ecc", 
ECC_SIZE);
+
+memory_region_init_io(>iomem, obj, _mem_ops, s, "ecc", ECC_SIZE);
 sysbus_init_mmio(dev, >iomem);
+}
+
+static void ecc_realize(DeviceState *dev, Error **errp)
+{
+ECCState *s = ECC_MEMCTL(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+s->regs[0] = s->version;
 
 if (s->version == ECC_MCC) { // SS-600MP only
 memory_region_init_io(>iomem_diag, OBJECT(dev), _diag_mem_ops, 
s,
   "ecc.diag", ECC_DIAG_SIZE);
-sysbus_init_mmio(dev, >iomem_diag);
+sysbus_init_mmio(sbd, >iomem_diag);
 }
-
-return 0;
 }
 
 static Property ecc_properties[] = {
@@ -321,9 +328,8 @@ static Property ecc_properties[] = {
 static void ecc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ecc_init1;
+dc->realize = ecc_realize;
 dc->reset = ecc_reset;
 dc->vmsd = _ecc;
 dc->props = ecc_properties;
@@ -333,6 +339,7 @@ static const TypeInfo ecc_info = {
 .name  = TYPE_ECC_MEMCTL,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(ECCState),
+.instance_init = ecc_init,
 .class_init= ecc_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [RESEND PATCH 8/9] hw/sparc: QOM'ify sun4m.c

2017-02-05 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sparc/sun4m.c | 54 +++---
 1 file changed, 19 insertions(+), 35 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index f5b6efddf8..352ca0bb4c 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -584,30 +584,23 @@ typedef struct IDRegState {
 MemoryRegion mem;
 } IDRegState;
 
-static int idreg_init1(SysBusDevice *dev)
+static void idreg_init1(Object *obj)
 {
-IDRegState *s = MACIO_ID_REGISTER(dev);
+IDRegState *s = MACIO_ID_REGISTER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s),
+memory_region_init_ram(>mem, obj,
"sun4m.idreg", sizeof(idreg_data), _fatal);
 vmstate_register_ram_global(>mem);
 memory_region_set_readonly(>mem, true);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void idreg_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = idreg_init1;
 }
 
 static const TypeInfo idreg_info = {
 .name  = TYPE_MACIO_ID_REGISTER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IDRegState),
-.class_init= idreg_class_init,
+.instance_init = idreg_init1,
 };
 
 #define TYPE_TCX_AFX "tcx_afx"
@@ -632,28 +625,21 @@ static void afx_init(hwaddr addr)
 sysbus_mmio_map(s, 0, addr);
 }
 
-static int afx_init1(SysBusDevice *dev)
+static void afx_init1(Object *obj)
 {
-AFXState *s = TCX_AFX(dev);
+AFXState *s = TCX_AFX(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s), "sun4m.afx", 4, _fatal);
+memory_region_init_ram(>mem, obj, "sun4m.afx", 4, _fatal);
 vmstate_register_ram_global(>mem);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void afx_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = afx_init1;
 }
 
 static const TypeInfo afx_info = {
 .name  = TYPE_TCX_AFX,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(AFXState),
-.class_init= afx_class_init,
+.instance_init = afx_init1,
 };
 
 #define TYPE_OPENPROM "openprom"
@@ -706,16 +692,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4m.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -725,9 +711,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -736,6 +720,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 #define TYPE_SUN4M_MEMORY "memory"
@@ -749,14 +734,14 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4M_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_allocate_system_memory(>ram, OBJECT(d), "sun4m.ram",
  d->size);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size,
@@ -792,9 +777,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.11.0





[Qemu-devel] [PATCH v2] hw/display: QOM'ify g364fb.c

2017-01-05 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/display/g364fb.c | 40 +---
 1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
index 70ef2c7453..7e2b3abe79 100644
--- a/hw/display/g364fb.c
+++ b/hw/display/g364fb.c
@@ -482,19 +482,6 @@ static const GraphicHwOps g364fb_ops = {
 .gfx_update  = g364fb_update_display,
 };
 
-static void g364fb_init(DeviceState *dev, G364State *s)
-{
-s->vram = g_malloc0(s->vram_size);
-
-s->con = graphic_console_init(dev, 0, _ops, s);
-
-memory_region_init_io(>mem_ctrl, NULL, _ctrl_ops, s, "ctrl", 
0x18);
-memory_region_init_ram_ptr(>mem_vram, NULL, "vram",
-   s->vram_size, s->vram);
-vmstate_register_ram(>mem_vram, dev);
-memory_region_set_log(>mem_vram, true, DIRTY_MEMORY_VGA);
-}
-
 #define TYPE_G364 "sysbus-g364"
 #define G364(obj) OBJECT_CHECK(G364SysBusState, (obj), TYPE_G364)
 
@@ -504,18 +491,33 @@ typedef struct {
 G364State g364;
 } G364SysBusState;
 
-static int g364fb_sysbus_init(SysBusDevice *sbd)
+static void g364fb_init(Object *obj)
 {
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 DeviceState *dev = DEVICE(sbd);
 G364SysBusState *sbs = G364(dev);
 G364State *s = >g364;
 
-g364fb_init(dev, s);
 sysbus_init_irq(sbd, >irq);
+
+memory_region_init_io(>mem_ctrl, NULL, _ctrl_ops,
+  s, "ctrl", 0x18);
 sysbus_init_mmio(sbd, >mem_ctrl);
-sysbus_init_mmio(sbd, >mem_vram);
+}
 
-return 0;
+static void g364fb_realize(DeviceState *dev, Error **errp)
+{
+G364SysBusState *sbs = G364(dev);
+G364State *s = >g364;
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+s->vram = g_malloc0(s->vram_size);
+s->con = graphic_console_init(dev, 0, _ops, s);
+memory_region_init_ram_ptr(>mem_vram, NULL, "vram",
+   s->vram_size, s->vram);
+vmstate_register_ram(>mem_vram, dev);
+memory_region_set_log(>mem_vram, true, DIRTY_MEMORY_VGA);
+sysbus_init_mmio(sbd, >mem_vram);
 }
 
 static void g364fb_sysbus_reset(DeviceState *d)
@@ -534,9 +536,8 @@ static Property g364fb_sysbus_properties[] = {
 static void g364fb_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = g364fb_sysbus_init;
+dc->realize = g364fb_realize;
 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 dc->desc = "G364 framebuffer";
 dc->reset = g364fb_sysbus_reset;
@@ -548,6 +549,7 @@ static const TypeInfo g364fb_sysbus_info = {
 .name  = TYPE_G364,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(G364SysBusState),
+.instance_init = g364fb_init,
 .class_init= g364fb_sysbus_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 3/4] hw/ppc: QOM'ify ppce500_spin.c

2017-01-05 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/ppc/ppce500_spin.c | 18 --
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/hw/ppc/ppce500_spin.c b/hw/ppc/ppce500_spin.c
index cf958a9e00..958536f6c6 100644
--- a/hw/ppc/ppce500_spin.c
+++ b/hw/ppc/ppce500_spin.c
@@ -54,9 +54,9 @@ typedef struct SpinState {
 SpinInfo spin[MAX_CPUS];
 } SpinState;
 
-static void spin_reset(void *opaque)
+static void spin_reset(DeviceState *dev)
 {
-SpinState *s = opaque;
+SpinState *s = E500_SPIN(dev);
 int i;
 
 for (i = 0; i < MAX_CPUS; i++) {
@@ -174,30 +174,28 @@ static const MemoryRegionOps spin_rw_ops = {
 .endianness = DEVICE_BIG_ENDIAN,
 };
 
-static int ppce500_spin_initfn(SysBusDevice *dev)
+static void ppce500_spin_initfn(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 SpinState *s = E500_SPIN(dev);
 
-memory_region_init_io(>iomem, OBJECT(s), _rw_ops, s,
+memory_region_init_io(>iomem, obj, _rw_ops, s,
   "e500 spin pv device", sizeof(SpinInfo) * MAX_CPUS);
 sysbus_init_mmio(dev, >iomem);
-
-qemu_register_reset(spin_reset, s);
-
-return 0;
 }
 
 static void ppce500_spin_class_init(ObjectClass *klass, void *data)
 {
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
+DeviceClass *dc = DEVICE_CLASS(klass);
 
-k->init = ppce500_spin_initfn;
+dc->reset = spin_reset;
 }
 
 static const TypeInfo ppce500_spin_info = {
 .name  = TYPE_E500_SPIN,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(SpinState),
+.instance_init = ppce500_spin_initfn,
 .class_init= ppce500_spin_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 1/4] hw/gpio: QOM'ify mpc8xxx.c

2017-01-05 Thread xiaoqiang zhao
* Drop the old SysBus init function and use instance_init
* Change mpc8xxx_gpio_reset to a DeviceClass::reset function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/gpio/mpc8xxx.c | 20 +++-
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/hw/gpio/mpc8xxx.c b/hw/gpio/mpc8xxx.c
index d149719469..e12edb4933 100644
--- a/hw/gpio/mpc8xxx.c
+++ b/hw/gpio/mpc8xxx.c
@@ -143,8 +143,10 @@ static void mpc8xxx_gpio_write(void *opaque, hwaddr offset,
 mpc8xxx_gpio_update(s);
 }
 
-static void mpc8xxx_gpio_reset(MPC8XXXGPIOState *s)
+static void mpc8xxx_gpio_reset(DeviceState *dev)
 {
+MPC8XXXGPIOState *s = MPC8XXX_GPIO(dev);
+
 s->dir = 0;
 s->odr = 0;
 s->dat = 0;
@@ -180,33 +182,33 @@ static const MemoryRegionOps mpc8xxx_gpio_ops = {
 .endianness = DEVICE_BIG_ENDIAN,
 };
 
-static int mpc8xxx_gpio_initfn(SysBusDevice *sbd)
+static void mpc8xxx_gpio_initfn(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MPC8XXXGPIOState *s = MPC8XXX_GPIO(dev);
+DeviceState *dev = DEVICE(obj);
+MPC8XXXGPIOState *s = MPC8XXX_GPIO(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
-memory_region_init_io(>iomem, OBJECT(s), _gpio_ops, s, 
"mpc8xxx_gpio", 0x1000);
+memory_region_init_io(>iomem, obj, _gpio_ops,
+  s, "mpc8xxx_gpio", 0x1000);
 sysbus_init_mmio(sbd, >iomem);
 sysbus_init_irq(sbd, >irq);
 qdev_init_gpio_in(dev, mpc8xxx_gpio_set_irq, 32);
 qdev_init_gpio_out(dev, s->out, 32);
-mpc8xxx_gpio_reset(s);
-return 0;
 }
 
 static void mpc8xxx_gpio_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = mpc8xxx_gpio_initfn;
 dc->vmsd = _mpc8xxx_gpio;
+dc->reset = mpc8xxx_gpio_reset;
 }
 
 static const TypeInfo mpc8xxx_gpio_info = {
 .name  = TYPE_MPC8XXX_GPIO,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MPC8XXXGPIOState),
+.instance_init = mpc8xxx_gpio_initfn,
 .class_init= mpc8xxx_gpio_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH v2 0/4] QOM'ify work for ppc

2017-01-05 Thread xiaoqiang zhao
This is some QOM'ify work relate with ppc.
See each commit message for details.

changes in v2:
  remove empty function 'spapr_vio_bridge_init'

xiaoqiang zhao (4):
  hw/gpio: QOM'ify mpc8xxx.c
  hw/ppc: QOM'ify e500.c
  hw/ppc: QOM'ify ppce500_spin.c
  hw/ppc: QOM'ify spapr_vio.c

 hw/gpio/mpc8xxx.c | 20 +++-
 hw/ppc/e500.c | 17 -
 hw/ppc/ppce500_spin.c | 18 --
 hw/ppc/spapr_vio.c| 10 --
 4 files changed, 23 insertions(+), 42 deletions(-)

-- 
2.11.0





[Qemu-devel] [PATCH v2 4/4] hw/ppc: QOM'ify spapr_vio.c

2017-01-05 Thread xiaoqiang zhao
Drop the old and empty SysBus init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/ppc/spapr_vio.c | 10 --
 1 file changed, 10 deletions(-)

diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index cc1e09c568..8bfc5f971f 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -538,21 +538,11 @@ VIOsPAPRBus *spapr_vio_bus_init(void)
 return bus;
 }
 
-/* Represents sPAPR hcall VIO devices */
-
-static int spapr_vio_bridge_init(SysBusDevice *dev)
-{
-/* nothing */
-return 0;
-}
-
 static void spapr_vio_bridge_class_init(ObjectClass *klass, void *data)
 {
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 DeviceClass *dc = DEVICE_CLASS(klass);
 
 dc->fw_name = "vdevice";
-k->init = spapr_vio_bridge_init;
 }
 
 static const TypeInfo spapr_vio_bridge_info = {
-- 
2.11.0





[Qemu-devel] [PATCH v2 2/4] hw/ppc: QOM'ify e500.c

2017-01-05 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/ppc/e500.c | 17 -
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index cf8b122afe..792bd79d39 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1049,27 +1049,18 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
 boot_info->dt_size = dt_size;
 }
 
-static int e500_ccsr_initfn(SysBusDevice *dev)
+static void e500_ccsr_initfn(Object *obj)
 {
-PPCE500CCSRState *ccsr;
-
-ccsr = CCSR(dev);
-memory_region_init(>ccsr_space, OBJECT(ccsr), "e500-ccsr",
+PPCE500CCSRState *ccsr = CCSR(obj);
+memory_region_init(>ccsr_space, obj, "e500-ccsr",
MPC8544_CCSRBAR_SIZE);
-return 0;
-}
-
-static void e500_ccsr_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-k->init = e500_ccsr_initfn;
 }
 
 static const TypeInfo e500_ccsr_info = {
 .name  = TYPE_CCSR,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PPCE500CCSRState),
-.class_init= e500_ccsr_class_init,
+.instance_init = e500_ccsr_initfn,
 };
 
 static void e500_register_types(void)
-- 
2.11.0





[Qemu-devel] [PATCH 1/4] hw/gpio: QOM'ify mpc8xxx.c

2016-12-30 Thread xiaoqiang zhao
* Drop the old SysBus init function and use instance_init
* Change mpc8xxx_gpio_reset to a DeviceClass::reset function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/gpio/mpc8xxx.c | 20 +++-
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/hw/gpio/mpc8xxx.c b/hw/gpio/mpc8xxx.c
index d149719469..e12edb4933 100644
--- a/hw/gpio/mpc8xxx.c
+++ b/hw/gpio/mpc8xxx.c
@@ -143,8 +143,10 @@ static void mpc8xxx_gpio_write(void *opaque, hwaddr offset,
 mpc8xxx_gpio_update(s);
 }
 
-static void mpc8xxx_gpio_reset(MPC8XXXGPIOState *s)
+static void mpc8xxx_gpio_reset(DeviceState *dev)
 {
+MPC8XXXGPIOState *s = MPC8XXX_GPIO(dev);
+
 s->dir = 0;
 s->odr = 0;
 s->dat = 0;
@@ -180,33 +182,33 @@ static const MemoryRegionOps mpc8xxx_gpio_ops = {
 .endianness = DEVICE_BIG_ENDIAN,
 };
 
-static int mpc8xxx_gpio_initfn(SysBusDevice *sbd)
+static void mpc8xxx_gpio_initfn(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MPC8XXXGPIOState *s = MPC8XXX_GPIO(dev);
+DeviceState *dev = DEVICE(obj);
+MPC8XXXGPIOState *s = MPC8XXX_GPIO(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
-memory_region_init_io(>iomem, OBJECT(s), _gpio_ops, s, 
"mpc8xxx_gpio", 0x1000);
+memory_region_init_io(>iomem, obj, _gpio_ops,
+  s, "mpc8xxx_gpio", 0x1000);
 sysbus_init_mmio(sbd, >iomem);
 sysbus_init_irq(sbd, >irq);
 qdev_init_gpio_in(dev, mpc8xxx_gpio_set_irq, 32);
 qdev_init_gpio_out(dev, s->out, 32);
-mpc8xxx_gpio_reset(s);
-return 0;
 }
 
 static void mpc8xxx_gpio_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = mpc8xxx_gpio_initfn;
 dc->vmsd = _mpc8xxx_gpio;
+dc->reset = mpc8xxx_gpio_reset;
 }
 
 static const TypeInfo mpc8xxx_gpio_info = {
 .name  = TYPE_MPC8XXX_GPIO,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MPC8XXXGPIOState),
+.instance_init = mpc8xxx_gpio_initfn,
 .class_init= mpc8xxx_gpio_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 3/4] hw/ppc: QOM'ify ppce500_spin.c

2016-12-30 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/ppc/ppce500_spin.c | 18 --
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/hw/ppc/ppce500_spin.c b/hw/ppc/ppce500_spin.c
index cf958a9e00..958536f6c6 100644
--- a/hw/ppc/ppce500_spin.c
+++ b/hw/ppc/ppce500_spin.c
@@ -54,9 +54,9 @@ typedef struct SpinState {
 SpinInfo spin[MAX_CPUS];
 } SpinState;
 
-static void spin_reset(void *opaque)
+static void spin_reset(DeviceState *dev)
 {
-SpinState *s = opaque;
+SpinState *s = E500_SPIN(dev);
 int i;
 
 for (i = 0; i < MAX_CPUS; i++) {
@@ -174,30 +174,28 @@ static const MemoryRegionOps spin_rw_ops = {
 .endianness = DEVICE_BIG_ENDIAN,
 };
 
-static int ppce500_spin_initfn(SysBusDevice *dev)
+static void ppce500_spin_initfn(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 SpinState *s = E500_SPIN(dev);
 
-memory_region_init_io(>iomem, OBJECT(s), _rw_ops, s,
+memory_region_init_io(>iomem, obj, _rw_ops, s,
   "e500 spin pv device", sizeof(SpinInfo) * MAX_CPUS);
 sysbus_init_mmio(dev, >iomem);
-
-qemu_register_reset(spin_reset, s);
-
-return 0;
 }
 
 static void ppce500_spin_class_init(ObjectClass *klass, void *data)
 {
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
+DeviceClass *dc = DEVICE_CLASS(klass);
 
-k->init = ppce500_spin_initfn;
+dc->reset = spin_reset;
 }
 
 static const TypeInfo ppce500_spin_info = {
 .name  = TYPE_E500_SPIN,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(SpinState),
+.instance_init = ppce500_spin_initfn,
 .class_init= ppce500_spin_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 0/4] QOM'ify work for ppc

2016-12-30 Thread xiaoqiang zhao
This is some QOM'ify work relate with ppc.
See each commit message for details.

xiaoqiang zhao (4):
  hw/gpio: QOM'ify mpc8xxx.c
  hw/ppc: QOM'ify e500.c
  hw/ppc: QOM'ify ppce500_spin.c
  hw/ppc: QOM'ify spapr_vio.c

 hw/gpio/mpc8xxx.c | 20 +++-
 hw/ppc/e500.c | 17 -
 hw/ppc/ppce500_spin.c | 18 --
 hw/ppc/spapr_vio.c|  2 --
 4 files changed, 23 insertions(+), 34 deletions(-)

-- 
2.11.0





[Qemu-devel] [PATCH 4/4] hw/ppc: QOM'ify spapr_vio.c

2016-12-30 Thread xiaoqiang zhao
Drop the old and empty SysBus init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/ppc/spapr_vio.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index cc1e09c568..1739b73a13 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -548,11 +548,9 @@ static int spapr_vio_bridge_init(SysBusDevice *dev)
 
 static void spapr_vio_bridge_class_init(ObjectClass *klass, void *data)
 {
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 DeviceClass *dc = DEVICE_CLASS(klass);
 
 dc->fw_name = "vdevice";
-k->init = spapr_vio_bridge_init;
 }
 
 static const TypeInfo spapr_vio_bridge_info = {
-- 
2.11.0





[Qemu-devel] [PATCH 1/5] hw/misc: QOM'ify milkymist-hpdmc.c

2016-12-30 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/milkymist-hpdmc.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/misc/milkymist-hpdmc.c b/hw/misc/milkymist-hpdmc.c
index e6140eec6b..c0fdd2cb2e 100644
--- a/hw/misc/milkymist-hpdmc.c
+++ b/hw/misc/milkymist-hpdmc.c
@@ -129,15 +129,14 @@ static void milkymist_hpdmc_reset(DeviceState *d)
  | IODELAY_PLL2_LOCKED;
 }
 
-static int milkymist_hpdmc_init(SysBusDevice *dev)
+static void milkymist_hpdmc_init(Object *obj)
 {
-MilkymistHpdmcState *s = MILKYMIST_HPDMC(dev);
+MilkymistHpdmcState *s = MILKYMIST_HPDMC(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_io(>regs_region, OBJECT(dev), _mmio_ops, s,
+memory_region_init_io(>regs_region, obj, _mmio_ops, s,
 "milkymist-hpdmc", R_MAX * 4);
 sysbus_init_mmio(dev, >regs_region);
-
-return 0;
 }
 
 static const VMStateDescription vmstate_milkymist_hpdmc = {
@@ -153,9 +152,7 @@ static const VMStateDescription vmstate_milkymist_hpdmc = {
 static void milkymist_hpdmc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = milkymist_hpdmc_init;
 dc->reset = milkymist_hpdmc_reset;
 dc->vmsd = _milkymist_hpdmc;
 }
@@ -164,6 +161,7 @@ static const TypeInfo milkymist_hpdmc_info = {
 .name  = TYPE_MILKYMIST_HPDMC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MilkymistHpdmcState),
+.instance_init = milkymist_hpdmc_init,
 .class_init= milkymist_hpdmc_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 2/4] hw/ppc: QOM'ify e500.c

2016-12-30 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/ppc/e500.c | 17 -
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index cf8b122afe..792bd79d39 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1049,27 +1049,18 @@ void ppce500_init(MachineState *machine, PPCE500Params 
*params)
 boot_info->dt_size = dt_size;
 }
 
-static int e500_ccsr_initfn(SysBusDevice *dev)
+static void e500_ccsr_initfn(Object *obj)
 {
-PPCE500CCSRState *ccsr;
-
-ccsr = CCSR(dev);
-memory_region_init(>ccsr_space, OBJECT(ccsr), "e500-ccsr",
+PPCE500CCSRState *ccsr = CCSR(obj);
+memory_region_init(>ccsr_space, obj, "e500-ccsr",
MPC8544_CCSRBAR_SIZE);
-return 0;
-}
-
-static void e500_ccsr_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-k->init = e500_ccsr_initfn;
 }
 
 static const TypeInfo e500_ccsr_info = {
 .name  = TYPE_CCSR,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PPCE500CCSRState),
-.class_init= e500_ccsr_class_init,
+.instance_init = e500_ccsr_initfn,
 };
 
 static void e500_register_types(void)
-- 
2.11.0





[Qemu-devel] [PATCH 0/2] QOM'ify work for char devices

2016-12-30 Thread xiaoqiang zhao
This patch set finish QOM'ify work of char devices.
See each commit message for details.

xiaoqiang zhao (2):
  hw/char: QOM'ify exynos4210_uart.c
  hw/char: QOM'ify grlib_apbuart.c

 hw/char/exynos4210_uart.c | 16 ++--
 hw/char/grlib_apbuart.c   | 26 +++---
 2 files changed, 25 insertions(+), 17 deletions(-)

-- 
2.11.0





[Qemu-devel] [PATCH 3/5] hw/sd: QOM'ify milkymist-memcard.c

2016-12-30 Thread xiaoqiang zhao
split the old SysBus init function into an instance_init
and Device realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sd/milkymist-memcard.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
index 1f2f0ed44a..c5abcfe51f 100644
--- a/hw/sd/milkymist-memcard.c
+++ b/hw/sd/milkymist-memcard.c
@@ -30,6 +30,7 @@
 #include "sysemu/block-backend.h"
 #include "sysemu/blockdev.h"
 #include "hw/sd/sd.h"
+#include "qapi/error.h"
 
 enum {
 ENABLE_CMD_TX   = (1<<0),
@@ -250,7 +251,17 @@ static void milkymist_memcard_reset(DeviceState *d)
 }
 }
 
-static int milkymist_memcard_init(SysBusDevice *dev)
+static void milkymist_memcard_init(Object *obj)
+{
+MilkymistMemcardState *s = MILKYMIST_MEMCARD(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
+
+memory_region_init_io(>regs_region, obj, _mmio_ops, s,
+"milkymist-memcard", R_MAX * 4);
+sysbus_init_mmio(dev, >regs_region);
+}
+
+static void milkymist_memcard_realize(DeviceState *dev, Error **errp)
 {
 MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
 DriveInfo *dinfo;
@@ -261,16 +272,10 @@ static int milkymist_memcard_init(SysBusDevice *dev)
 blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
 s->card = sd_init(blk, false);
 if (s->card == NULL) {
-return -1;
+error_setg(errp, "sd_init failed");
 }
 
 s->enabled = blk && blk_is_inserted(blk);
-
-memory_region_init_io(>regs_region, OBJECT(s), _mmio_ops, s,
-"milkymist-memcard", R_MAX * 4);
-sysbus_init_mmio(dev, >regs_region);
-
-return 0;
 }
 
 static const VMStateDescription vmstate_milkymist_memcard = {
@@ -293,19 +298,19 @@ static const VMStateDescription vmstate_milkymist_memcard 
= {
 static void milkymist_memcard_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = milkymist_memcard_init;
 dc->reset = milkymist_memcard_reset;
 dc->vmsd = _milkymist_memcard;
 /* Reason: init() method uses drive_get_next() */
 dc->cannot_instantiate_with_device_add_yet = true;
+dc->realize = milkymist_memcard_realize;
 }
 
 static const TypeInfo milkymist_memcard_info = {
 .name  = TYPE_MILKYMIST_MEMCARD,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MilkymistMemcardState),
+.instance_init = milkymist_memcard_init,
 .class_init= milkymist_memcard_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 2/2] hw/audio: QOM'ify pl041.c

2016-12-30 Thread xiaoqiang zhao
split the old SysBus init function into an instance_init
and Device realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/audio/pl041.c | 25 ++---
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/hw/audio/pl041.c b/hw/audio/pl041.c
index 6e9c104011..c8cc503236 100644
--- a/hw/audio/pl041.c
+++ b/hw/audio/pl041.c
@@ -521,12 +521,23 @@ static const MemoryRegionOps pl041_ops = {
 .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int pl041_init(SysBusDevice *dev)
+static void pl041_init(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 PL041State *s = PL041(dev);
 
 DBG_L1("pl041_init 0x%08x\n", (uint32_t)s);
 
+/* Connect the device to the sysbus */
+memory_region_init_io(>iomem, obj, _ops, s, "pl041", 0x1000);
+sysbus_init_mmio(dev, >iomem);
+sysbus_init_irq(dev, >irq);
+}
+
+static void pl041_realize(DeviceState *dev, Error **errp)
+{
+PL041State *s = PL041(dev);
+
 /* Check the device properties */
 switch (s->fifo_depth) {
 case 8:
@@ -545,18 +556,10 @@ static int pl041_init(SysBusDevice *dev)
 qemu_log_mask(LOG_UNIMP,
   "pl041: unsupported non-compact fifo depth [%i]\n",
   s->fifo_depth);
-return -1;
 }
 
-/* Connect the device to the sysbus */
-memory_region_init_io(>iomem, OBJECT(s), _ops, s, "pl041", 
0x1000);
-sysbus_init_mmio(dev, >iomem);
-sysbus_init_irq(dev, >irq);
-
 /* Init the codec */
 lm4549_init(>codec, _request_data, (void *)s);
-
-return 0;
 }
 
 static const VMStateDescription vmstate_pl041_regfile = {
@@ -627,9 +630,8 @@ static Property pl041_device_properties[] = {
 static void pl041_device_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = pl041_init;
+dc->realize = pl041_realize;
 set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
 dc->reset = pl041_device_reset;
 dc->vmsd = _pl041;
@@ -640,6 +642,7 @@ static const TypeInfo pl041_device_info = {
 .name  = TYPE_PL041,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PL041State),
+.instance_init = pl041_init,
 .class_init= pl041_device_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 2/5] hw/misc: QOM'ify milkymist-pfpu.c

2016-12-30 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/milkymist-pfpu.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/misc/milkymist-pfpu.c b/hw/misc/milkymist-pfpu.c
index 3ca25894f1..b1c57cd7f8 100644
--- a/hw/misc/milkymist-pfpu.c
+++ b/hw/misc/milkymist-pfpu.c
@@ -497,17 +497,16 @@ static void milkymist_pfpu_reset(DeviceState *d)
 }
 }
 
-static int milkymist_pfpu_init(SysBusDevice *dev)
+static void milkymist_pfpu_init(Object *obj)
 {
-MilkymistPFPUState *s = MILKYMIST_PFPU(dev);
+MilkymistPFPUState *s = MILKYMIST_PFPU(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>regs_region, OBJECT(dev), _mmio_ops, s,
+memory_region_init_io(>regs_region, obj, _mmio_ops, s,
 "milkymist-pfpu", MICROCODE_END * 4);
 sysbus_init_mmio(dev, >regs_region);
-
-return 0;
 }
 
 static const VMStateDescription vmstate_milkymist_pfpu = {
@@ -527,9 +526,7 @@ static const VMStateDescription vmstate_milkymist_pfpu = {
 static void milkymist_pfpu_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = milkymist_pfpu_init;
 dc->reset = milkymist_pfpu_reset;
 dc->vmsd = _milkymist_pfpu;
 }
@@ -538,6 +535,7 @@ static const TypeInfo milkymist_pfpu_info = {
 .name  = TYPE_MILKYMIST_PFPU,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MilkymistPFPUState),
+.instance_init = milkymist_pfpu_init,
 .class_init= milkymist_pfpu_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 5/5] hw/input: QOM'ify milkymist-softusb.c

2016-12-30 Thread xiaoqiang zhao
split the old SysBus init function into an instance_init
and Device realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/input/milkymist-softusb.c | 21 +
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/hw/input/milkymist-softusb.c b/hw/input/milkymist-softusb.c
index 40dfca157f..2afbca8a9c 100644
--- a/hw/input/milkymist-softusb.c
+++ b/hw/input/milkymist-softusb.c
@@ -245,32 +245,37 @@ static void milkymist_softusb_reset(DeviceState *d)
 s->regs[R_CTRL] = CTRL_RESET;
 }
 
-static int milkymist_softusb_init(SysBusDevice *dev)
+static void milkymist_softusb_init(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 MilkymistSoftUsbState *s = MILKYMIST_SOFTUSB(dev);
 
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>regs_region, OBJECT(s), _mmio_ops, s,
+memory_region_init_io(>regs_region, obj, _mmio_ops, s,
   "milkymist-softusb", R_MAX * 4);
 sysbus_init_mmio(dev, >regs_region);
+}
+
+static void milkymist_softusb_realize(DeviceState *dev, Error **errp)
+{
+MilkymistSoftUsbState *s = MILKYMIST_SOFTUSB(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 /* register pmem and dmem */
 memory_region_init_ram(>pmem, OBJECT(s), "milkymist-softusb.pmem",
s->pmem_size, _fatal);
 vmstate_register_ram_global(>pmem);
 s->pmem_ptr = memory_region_get_ram_ptr(>pmem);
-sysbus_init_mmio(dev, >pmem);
+sysbus_init_mmio(sbd, >pmem);
 memory_region_init_ram(>dmem, OBJECT(s), "milkymist-softusb.dmem",
s->dmem_size, _fatal);
 vmstate_register_ram_global(>dmem);
 s->dmem_ptr = memory_region_get_ram_ptr(>dmem);
-sysbus_init_mmio(dev, >dmem);
+sysbus_init_mmio(sbd, >dmem);
 
 hid_init(>hid_kbd, HID_KEYBOARD, softusb_kbd_hid_datain);
 hid_init(>hid_mouse, HID_MOUSE, softusb_mouse_hid_datain);
-
-return 0;
 }
 
 static const VMStateDescription vmstate_milkymist_softusb = {
@@ -296,9 +301,8 @@ static Property milkymist_softusb_properties[] = {
 static void milkymist_softusb_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = milkymist_softusb_init;
+dc->realize = milkymist_softusb_realize;
 dc->reset = milkymist_softusb_reset;
 dc->vmsd = _milkymist_softusb;
 dc->props = milkymist_softusb_properties;
@@ -308,6 +312,7 @@ static const TypeInfo milkymist_softusb_info = {
 .name  = TYPE_MILKYMIST_SOFTUSB,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MilkymistSoftUsbState),
+.instance_init = milkymist_softusb_init,
 .class_init= milkymist_softusb_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 2/2] hw/char: QOM'ify grlib_apbuart.c

2016-12-30 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/char/grlib_apbuart.c | 26 +++---
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c
index db686e6a6f..620b801f34 100644
--- a/hw/char/grlib_apbuart.c
+++ b/hw/char/grlib_apbuart.c
@@ -239,24 +239,28 @@ static const MemoryRegionOps grlib_apbuart_ops = {
 .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int grlib_apbuart_init(SysBusDevice *dev)
+static void grlib_apbuart_init(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 UART *uart = GRLIB_APB_UART(dev);
 
-qemu_chr_fe_set_handlers(>chr,
- grlib_apbuart_can_receive,
- grlib_apbuart_receive,
- grlib_apbuart_event,
- uart, NULL, true);
-
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>iomem, OBJECT(uart), _apbuart_ops, uart,
+memory_region_init_io(>iomem, obj, _apbuart_ops, uart,
   "uart", UART_REG_SIZE);
 
 sysbus_init_mmio(dev, >iomem);
+}
 
-return 0;
+static void grlib_apbuart_realize(DeviceState *dev, Error **errp)
+{
+UART *uart = GRLIB_APB_UART(dev);
+
+qemu_chr_fe_set_handlers(>chr,
+ grlib_apbuart_can_receive,
+ grlib_apbuart_receive,
+ grlib_apbuart_event,
+ uart, NULL, true);
 }
 
 static void grlib_apbuart_reset(DeviceState *d)
@@ -280,9 +284,8 @@ static Property grlib_apbuart_properties[] = {
 static void grlib_apbuart_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = grlib_apbuart_init;
+dc->realize = grlib_apbuart_realize;
 dc->reset = grlib_apbuart_reset;
 dc->props = grlib_apbuart_properties;
 }
@@ -291,6 +294,7 @@ static const TypeInfo grlib_apbuart_info = {
 .name  = TYPE_GRLIB_APB_UART,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(UART),
+.instance_init = grlib_apbuart_init,
 .class_init= grlib_apbuart_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 0/2] QOM'ify audio devices code

2016-12-30 Thread xiaoqiang zhao
This patch set QOM'ify code about audio devices.
See each commit message for deatils.

xiaoqiang zhao (2):
  hw/audio: QOM'ify marvell_88w8618.c
  hw/audio: QOM'ify pl041.c

 hw/audio/marvell_88w8618.c | 18 +++---
 hw/audio/pl041.c   | 25 ++---
 2 files changed, 25 insertions(+), 18 deletions(-)

-- 
2.11.0





[Qemu-devel] [PATCH 4/5] hw/net: QOM'ify milkymist-minimac2.c

2016-12-30 Thread xiaoqiang zhao
* Split the old SysBus init into an instance_init and a
  DeviceClass::realize function
* Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/net/milkymist-minimac2.c | 21 -
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/hw/net/milkymist-minimac2.c b/hw/net/milkymist-minimac2.c
index c3a12e1197..81d10d64bb 100644
--- a/hw/net/milkymist-minimac2.c
+++ b/hw/net/milkymist-minimac2.c
@@ -452,21 +452,21 @@ static NetClientInfo net_milkymist_minimac2_info = {
 .receive = minimac2_rx,
 };
 
-static int milkymist_minimac2_init(SysBusDevice *sbd)
+static void milkymist_minimac2_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MilkymistMinimac2State *s = MILKYMIST_MINIMAC2(dev);
+MilkymistMinimac2State *s = MILKYMIST_MINIMAC2(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 size_t buffers_size = TARGET_PAGE_ALIGN(3 * MINIMAC2_BUFFER_SIZE);
 
 sysbus_init_irq(sbd, >rx_irq);
 sysbus_init_irq(sbd, >tx_irq);
 
-memory_region_init_io(>regs_region, OBJECT(dev), _ops, s,
+memory_region_init_io(>regs_region, obj, _ops, s,
   "milkymist-minimac2", R_MAX * 4);
 sysbus_init_mmio(sbd, >regs_region);
 
 /* register buffers memory */
-memory_region_init_ram(>buffers, OBJECT(dev), 
"milkymist-minimac2.buffers",
+memory_region_init_ram(>buffers, obj, "milkymist-minimac2.buffers",
buffers_size, _fatal);
 vmstate_register_ram_global(>buffers);
 s->rx0_buf = memory_region_get_ram_ptr(>buffers);
@@ -474,13 +474,16 @@ static int milkymist_minimac2_init(SysBusDevice *sbd)
 s->tx_buf = s->rx1_buf + MINIMAC2_BUFFER_SIZE;
 
 sysbus_init_mmio(sbd, >buffers);
+}
+
+static void milkymist_minimac2_realize(DeviceState *dev, Error **errp)
+{
+MilkymistMinimac2State *s = MILKYMIST_MINIMAC2(dev);
 
 qemu_macaddr_default_if_unset(>conf.macaddr);
 s->nic = qemu_new_nic(_milkymist_minimac2_info, >conf,
   object_get_typename(OBJECT(dev)), dev->id, s);
 qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
-
-return 0;
 }
 
 static const VMStateDescription vmstate_milkymist_minimac2_mdio = {
@@ -521,18 +524,18 @@ static Property milkymist_minimac2_properties[] = {
 static void milkymist_minimac2_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = milkymist_minimac2_init;
 dc->reset = milkymist_minimac2_reset;
 dc->vmsd = _milkymist_minimac2;
 dc->props = milkymist_minimac2_properties;
+dc->realize = milkymist_minimac2_realize;
 }
 
 static const TypeInfo milkymist_minimac2_info = {
 .name  = TYPE_MILKYMIST_MINIMAC2,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MilkymistMinimac2State),
+.instance_init = milkymist_minimac2_init,
 .class_init= milkymist_minimac2_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 0/5] QOM'ify work for milkymist

2016-12-30 Thread xiaoqiang zhao
This patch series continues QOM'ify work for milkymist.
See each commit message for details.

xiaoqiang zhao (5):
  hw/misc: QOM'ify milkymist-hpdmc.c
  hw/misc: QOM'ify milkymist-pfpu.c
  hw/sd: QOM'ify milkymist-memcard.c
  hw/net: QOM'ify milkymist-minimac2.c
  hw/input: QOM'ify milkymist-softusb.c

 hw/input/milkymist-softusb.c | 21 +
 hw/misc/milkymist-hpdmc.c| 12 +---
 hw/misc/milkymist-pfpu.c | 12 +---
 hw/net/milkymist-minimac2.c  | 21 -
 hw/sd/milkymist-memcard.c| 25 +++--
 5 files changed, 50 insertions(+), 41 deletions(-)

-- 
2.11.0





[Qemu-devel] [PATCH 1/2] hw/char: QOM'ify exynos4210_uart.c

2016-12-30 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/char/exynos4210_uart.c | 16 ++--
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
index 571c324004..820d1abeb9 100644
--- a/hw/char/exynos4210_uart.c
+++ b/hw/char/exynos4210_uart.c
@@ -629,22 +629,26 @@ DeviceState *exynos4210_uart_create(hwaddr addr,
 return dev;
 }
 
-static int exynos4210_uart_init(SysBusDevice *dev)
+static void exynos4210_uart_init(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 Exynos4210UartState *s = EXYNOS4210_UART(dev);
 
 /* memory mapping */
-memory_region_init_io(>iomem, OBJECT(s), _uart_ops, s,
+memory_region_init_io(>iomem, obj, _uart_ops, s,
   "exynos4210.uart", EXYNOS4210_UART_REGS_MEM_SIZE);
 sysbus_init_mmio(dev, >iomem);
 
 sysbus_init_irq(dev, >irq);
+}
+
+static void exynos4210_uart_realize(DeviceState *dev, Error **errp)
+{
+Exynos4210UartState *s = EXYNOS4210_UART(dev);
 
 qemu_chr_fe_set_handlers(>chr, exynos4210_uart_can_receive,
  exynos4210_uart_receive, exynos4210_uart_event,
  s, NULL, true);
-
-return 0;
 }
 
 static Property exynos4210_uart_properties[] = {
@@ -658,9 +662,8 @@ static Property exynos4210_uart_properties[] = {
 static void exynos4210_uart_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = exynos4210_uart_init;
+dc->realize = exynos4210_uart_realize;
 dc->reset = exynos4210_uart_reset;
 dc->props = exynos4210_uart_properties;
 dc->vmsd = _exynos4210_uart;
@@ -670,6 +673,7 @@ static const TypeInfo exynos4210_uart_info = {
 .name  = TYPE_EXYNOS4210_UART,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(Exynos4210UartState),
+.instance_init = exynos4210_uart_init,
 .class_init= exynos4210_uart_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 1/2] hw/audio: QOM'ify marvell_88w8618.c

2016-12-30 Thread xiaoqiang zhao
split the old SysBus init function into an instance_init
and Device realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/audio/marvell_88w8618.c | 18 +++---
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c
index a6ca1806be..511b004287 100644
--- a/hw/audio/marvell_88w8618.c
+++ b/hw/audio/marvell_88w8618.c
@@ -241,19 +241,23 @@ static const MemoryRegionOps mv88w8618_audio_ops = {
 .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int mv88w8618_audio_init(SysBusDevice *dev)
+static void mv88w8618_audio_init(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 mv88w8618_audio_state *s = MV88W8618_AUDIO(dev);
 
 sysbus_init_irq(dev, >irq);
 
-wm8750_data_req_set(s->wm, mv88w8618_audio_callback, s);
-
-memory_region_init_io(>iomem, OBJECT(s), _audio_ops, s,
+memory_region_init_io(>iomem, obj, _audio_ops, s,
   "audio", MP_AUDIO_SIZE);
 sysbus_init_mmio(dev, >iomem);
+}
 
-return 0;
+static void mv88w8618_audio_realize(DeviceState *dev, Error **errp)
+{
+mv88w8618_audio_state *s = MV88W8618_AUDIO(dev);
+
+wm8750_data_req_set(s->wm, mv88w8618_audio_callback, s);
 }
 
 static const VMStateDescription mv88w8618_audio_vmsd = {
@@ -282,9 +286,8 @@ static Property mv88w8618_audio_properties[] = {
 static void mv88w8618_audio_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = mv88w8618_audio_init;
+dc->realize = mv88w8618_audio_realize;
 dc->reset = mv88w8618_audio_reset;
 dc->vmsd = _audio_vmsd;
 dc->props = mv88w8618_audio_properties;
@@ -296,6 +299,7 @@ static const TypeInfo mv88w8618_audio_info = {
 .name  = TYPE_MV88W8618_AUDIO,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(mv88w8618_audio_state),
+.instance_init = mv88w8618_audio_init,
 .class_init= mv88w8618_audio_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH] hw/display: QOM'ify g364fb.c

2016-12-25 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/display/g364fb.c | 16 +++-
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
index 70ef2c7453..7a0fe48dd5 100644
--- a/hw/display/g364fb.c
+++ b/hw/display/g364fb.c
@@ -504,18 +504,24 @@ typedef struct {
 G364State g364;
 } G364SysBusState;
 
-static int g364fb_sysbus_init(SysBusDevice *sbd)
+static void g364fb_sysbus_init(Object *obj)
 {
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 DeviceState *dev = DEVICE(sbd);
 G364SysBusState *sbs = G364(dev);
 G364State *s = >g364;
 
-g364fb_init(dev, s);
 sysbus_init_irq(sbd, >irq);
 sysbus_init_mmio(sbd, >mem_ctrl);
 sysbus_init_mmio(sbd, >mem_vram);
+}
 
-return 0;
+static void g364fb_sysbus_realize(DeviceState *dev, Error **errp)
+{
+G364SysBusState *sbs = G364(dev);
+G364State *s = >g364;
+
+g364fb_init(dev, s);
 }
 
 static void g364fb_sysbus_reset(DeviceState *d)
@@ -534,9 +540,8 @@ static Property g364fb_sysbus_properties[] = {
 static void g364fb_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = g364fb_sysbus_init;
+dc->realize = g364fb_sysbus_realize;
 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 dc->desc = "G364 framebuffer";
 dc->reset = g364fb_sysbus_reset;
@@ -548,6 +553,7 @@ static const TypeInfo g364fb_sysbus_info = {
 .name  = TYPE_G364,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(G364SysBusState),
+.instance_init = g364fb_sysbus_init,
 .class_init= g364fb_sysbus_class_init,
 };
 
-- 
2.11.0





[Qemu-devel] [PATCH 4/4] hw/display: QOM'ify pl110.c

2016-10-23 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/display/pl110.c | 9 +++--
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/hw/display/pl110.c b/hw/display/pl110.c
index c069c0b..eae4cde 100644
--- a/hw/display/pl110.c
+++ b/hw/display/pl110.c
@@ -466,17 +466,15 @@ static const GraphicHwOps pl110_gfx_ops = {
 .gfx_update  = pl110_update_display,
 };
 
-static int pl110_initfn(SysBusDevice *sbd)
+static void pl110_realize(DeviceState *dev, Error **errp)
 {
-DeviceState *dev = DEVICE(sbd);
 PL110State *s = PL110(dev);
-
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 memory_region_init_io(>iomem, OBJECT(s), _ops, s, "pl110", 
0x1000);
 sysbus_init_mmio(sbd, >iomem);
 sysbus_init_irq(sbd, >irq);
 qdev_init_gpio_in(dev, pl110_mux_ctrl_set, 1);
 s->con = graphic_console_init(dev, 0, _gfx_ops, s);
-return 0;
 }
 
 static void pl110_init(Object *obj)
@@ -503,11 +501,10 @@ static void pl111_init(Object *obj)
 static void pl110_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = pl110_initfn;
 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
 dc->vmsd = _pl110;
+dc->realize = pl110_realize;
 }
 
 static const TypeInfo pl110_info = {
-- 
2.9.3





[Qemu-devel] [PATCH 2/4] hw/arm: QOM'ify pxa2xx_gpio.c

2016-10-23 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/arm/pxa2xx_gpio.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/arm/pxa2xx_gpio.c b/hw/arm/pxa2xx_gpio.c
index 576a8eb..521dbad 100644
--- a/hw/arm/pxa2xx_gpio.c
+++ b/hw/arm/pxa2xx_gpio.c
@@ -280,23 +280,28 @@ DeviceState *pxa2xx_gpio_init(hwaddr base,
 return dev;
 }
 
-static int pxa2xx_gpio_initfn(SysBusDevice *sbd)
+static void pxa2xx_gpio_initfn(Object *obj)
 {
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 DeviceState *dev = DEVICE(sbd);
 PXA2xxGPIOInfo *s = PXA2XX_GPIO(dev);
 
-s->cpu = ARM_CPU(qemu_get_cpu(s->ncpu));
-
-qdev_init_gpio_in(dev, pxa2xx_gpio_set, s->lines);
-qdev_init_gpio_out(dev, s->handler, s->lines);
-
-memory_region_init_io(>iomem, OBJECT(s), _gpio_ops, s, 
"pxa2xx-gpio", 0x1000);
+memory_region_init_io(>iomem, obj, _gpio_ops,
+  s, "pxa2xx-gpio", 0x1000);
 sysbus_init_mmio(sbd, >iomem);
 sysbus_init_irq(sbd, >irq0);
 sysbus_init_irq(sbd, >irq1);
 sysbus_init_irq(sbd, >irqX);
+}
 
-return 0;
+static void pxa2xx_gpio_realize(DeviceState *dev, Error **errp)
+{
+PXA2xxGPIOInfo *s = PXA2XX_GPIO(dev);
+
+s->cpu = ARM_CPU(qemu_get_cpu(s->ncpu));
+
+qdev_init_gpio_in(dev, pxa2xx_gpio_set, s->lines);
+qdev_init_gpio_out(dev, s->handler, s->lines);
 }
 
 /*
@@ -336,18 +341,18 @@ static Property pxa2xx_gpio_properties[] = {
 static void pxa2xx_gpio_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = pxa2xx_gpio_initfn;
 dc->desc = "PXA2xx GPIO controller";
 dc->props = pxa2xx_gpio_properties;
 dc->vmsd = _pxa2xx_gpio_regs;
+dc->realize = pxa2xx_gpio_realize;
 }
 
 static const TypeInfo pxa2xx_gpio_info = {
 .name  = TYPE_PXA2XX_GPIO,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PXA2xxGPIOInfo),
+.instance_init = pxa2xx_gpio_initfn,
 .class_init= pxa2xx_gpio_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 1/4] hw/arm: QOM'ify musicpal.c

2016-10-23 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/arm/musicpal.c | 88 ---
 1 file changed, 45 insertions(+), 43 deletions(-)

diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 7527037..cbbca4e 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -384,18 +384,24 @@ static NetClientInfo net_mv88w8618_info = {
 .cleanup = eth_cleanup,
 };
 
-static int mv88w8618_eth_init(SysBusDevice *sbd)
+static void mv88w8618_eth_init(Object *obj)
 {
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 DeviceState *dev = DEVICE(sbd);
 mv88w8618_eth_state *s = MV88W8618_ETH(dev);
 
 sysbus_init_irq(sbd, >irq);
-s->nic = qemu_new_nic(_mv88w8618_info, >conf,
-  object_get_typename(OBJECT(dev)), dev->id, s);
-memory_region_init_io(>iomem, OBJECT(s), _eth_ops, s,
+memory_region_init_io(>iomem, obj, _eth_ops, s,
   "mv88w8618-eth", MP_ETH_SIZE);
 sysbus_init_mmio(sbd, >iomem);
-return 0;
+}
+
+static void mv88w8618_eth_realize(DeviceState *dev, Error **errp)
+{
+mv88w8618_eth_state *s = MV88W8618_ETH(dev);
+
+s->nic = qemu_new_nic(_mv88w8618_info, >conf,
+  object_get_typename(OBJECT(dev)), dev->id, s);
 }
 
 static const VMStateDescription mv88w8618_eth_vmsd = {
@@ -423,17 +429,17 @@ static Property mv88w8618_eth_properties[] = {
 static void mv88w8618_eth_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = mv88w8618_eth_init;
 dc->vmsd = _eth_vmsd;
 dc->props = mv88w8618_eth_properties;
+dc->realize = mv88w8618_eth_realize;
 }
 
 static const TypeInfo mv88w8618_eth_info = {
 .name  = TYPE_MV88W8618_ETH,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(mv88w8618_eth_state),
+.instance_init = mv88w8618_eth_init,
 .class_init= mv88w8618_eth_class_init,
 };
 
@@ -615,23 +621,26 @@ static const GraphicHwOps musicpal_gfx_ops = {
 .gfx_update  = lcd_refresh,
 };
 
-static int musicpal_lcd_init(SysBusDevice *sbd)
+static void musicpal_lcd_realize(DeviceState *dev, Error **errp)
+{
+musicpal_lcd_state *s = MUSICPAL_LCD(dev);
+s->con = graphic_console_init(dev, 0, _gfx_ops, s);
+qemu_console_resize(s->con, 128 * 3, 64 * 3);
+}
+
+static void musicpal_lcd_init(Object *obj)
 {
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 DeviceState *dev = DEVICE(sbd);
 musicpal_lcd_state *s = MUSICPAL_LCD(dev);
 
 s->brightness = 7;
 
-memory_region_init_io(>iomem, OBJECT(s), _lcd_ops, s,
+memory_region_init_io(>iomem, obj, _lcd_ops, s,
   "musicpal-lcd", MP_LCD_SIZE);
 sysbus_init_mmio(sbd, >iomem);
 
-s->con = graphic_console_init(dev, 0, _gfx_ops, s);
-qemu_console_resize(s->con, 128*3, 64*3);
-
 qdev_init_gpio_in(dev, musicpal_lcd_gpio_brightness_in, 3);
-
-return 0;
 }
 
 static const VMStateDescription musicpal_lcd_vmsd = {
@@ -652,16 +661,16 @@ static const VMStateDescription musicpal_lcd_vmsd = {
 static void musicpal_lcd_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = musicpal_lcd_init;
 dc->vmsd = _lcd_vmsd;
+dc->realize = musicpal_lcd_realize;
 }
 
 static const TypeInfo musicpal_lcd_info = {
 .name  = TYPE_MUSICPAL_LCD,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(musicpal_lcd_state),
+.instance_init = musicpal_lcd_init,
 .class_init= musicpal_lcd_class_init,
 };
 
@@ -748,16 +757,16 @@ static const MemoryRegionOps mv88w8618_pic_ops = {
 .endianness = DEVICE_NATIVE_ENDIAN,
 };
 
-static int mv88w8618_pic_init(SysBusDevice *dev)
+static void mv88w8618_pic_init(Object *obj)
 {
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 mv88w8618_pic_state *s = MV88W8618_PIC(dev);
 
 qdev_init_gpio_in(DEVICE(dev), mv88w8618_pic_set_irq, 32);
 sysbus_init_irq(dev, >parent_irq);
-memory_region_init_io(>iomem, OBJECT(s), _pic_ops, s,
+memory_region_init_io(>iomem, obj, _pic_ops, s,
   "musicpal-pic", MP_PIC_SIZE);
 sysbus_init_mmio(dev, >iomem);
-return 0;
 }
 
 static const VMStateDescription mv88w8618_pic_vmsd = {
@@ -774,9 +783,7 @@ static const VMStateDescription mv88w8618_pic_vmsd = {
 static void mv88w8618_pic_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = mv88w8618_pic_init;
 dc->reset = mv88w8618_pic_reset;
 dc->vmsd = _pic_vmsd;
 }
@@ -785,6 +792,7

[Qemu-devel] [PATCH 3/4] hw/arm: QOM'ify strongarm.c

2016-10-23 Thread xiaoqiang zhao
Drop the old Sysbus init and use instance_init and
DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/arm/strongarm.c | 15 ++-
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index 021cbf9..0f3216a 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -1238,6 +1238,11 @@ static void strongarm_uart_init(Object *obj)
 
 s->rx_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, 
strongarm_uart_rx_to, s);
 s->tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, strongarm_uart_tx, s);
+}
+
+static void strongarm_uart_realize(DeviceState *dev, Error **errp)
+{
+StrongARMUARTState *s = STRONGARM_UART(dev);
 
 if (s->chr) {
 qemu_chr_add_handlers(s->chr,
@@ -1320,6 +1325,7 @@ static void strongarm_uart_class_init(ObjectClass *klass, 
void *data)
 dc->reset = strongarm_uart_reset;
 dc->vmsd = _strongarm_uart_regs;
 dc->props = strongarm_uart_properties;
+dc->realize = strongarm_uart_realize;
 }
 
 static const TypeInfo strongarm_uart_info = {
@@ -1520,19 +1526,19 @@ static int strongarm_ssp_post_load(void *opaque, int 
version_id)
 return 0;
 }
 
-static int strongarm_ssp_init(SysBusDevice *sbd)
+static void strongarm_ssp_init(Object *obj)
 {
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 DeviceState *dev = DEVICE(sbd);
 StrongARMSSPState *s = STRONGARM_SSP(dev);
 
 sysbus_init_irq(sbd, >irq);
 
-memory_region_init_io(>iomem, OBJECT(s), _ssp_ops, s,
+memory_region_init_io(>iomem, obj, _ssp_ops, s,
   "ssp", 0x1000);
 sysbus_init_mmio(sbd, >iomem);
 
 s->bus = ssi_create_bus(dev, "ssi");
-return 0;
 }
 
 static void strongarm_ssp_reset(DeviceState *dev)
@@ -1562,9 +1568,7 @@ static const VMStateDescription 
vmstate_strongarm_ssp_regs = {
 static void strongarm_ssp_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = strongarm_ssp_init;
 dc->desc = "StrongARM SSP controller";
 dc->reset = strongarm_ssp_reset;
 dc->vmsd = _strongarm_ssp_regs;
@@ -1574,6 +1578,7 @@ static const TypeInfo strongarm_ssp_info = {
 .name  = TYPE_STRONGARM_SSP,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(StrongARMSSPState),
+.instance_init = strongarm_ssp_init,
 .class_init= strongarm_ssp_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 0/4] QOM'ify work for arm

2016-10-23 Thread xiaoqiang zhao
Here is my QOM'ify work relate with arm.
See each commit for details.

xiaoqiang zhao (4):
  hw/arm: QOM'ify musicpal.c
  hw/arm: QOM'ify pxa2xx_gpio.c
  hw/arm: QOM'ify strongarm.c
  hw/display: QOM'ify pl110.c

 hw/arm/musicpal.c| 88 +++-
 hw/arm/pxa2xx_gpio.c | 25 +--
 hw/arm/strongarm.c   | 15 ++---
 hw/display/pl110.c   |  9 ++
 4 files changed, 73 insertions(+), 64 deletions(-)

-- 
2.9.3





[Qemu-devel] [PATCH 0/2] QOM'ify work for etraxfs

2016-10-23 Thread xiaoqiang zhao
This is some QOM'ify work relate with etraxfs.
See each commit for details.

xiaoqiang zhao (2):
  hw/timer: QOM'ify etraxfs_timer
  hw/net: QOM'ify etraxfs_eth.c

 hw/net/etraxfs_eth.c | 34 +++---
 hw/timer/etraxfs_timer.c | 18 +-
 2 files changed, 28 insertions(+), 24 deletions(-)

-- 
2.9.3





[Qemu-devel] [PATCH 2/2] hw/net: QOM'ify etraxfs_eth.c

2016-10-23 Thread xiaoqiang zhao
* Split the old SysBus init into an instance_init and a
  DeviceClass::realize function
* Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/net/etraxfs_eth.c | 34 +++---
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/hw/net/etraxfs_eth.c b/hw/net/etraxfs_eth.c
index efaa49f..9bb814f 100644
--- a/hw/net/etraxfs_eth.c
+++ b/hw/net/etraxfs_eth.c
@@ -27,6 +27,7 @@
 #include "net/net.h"
 #include "hw/cris/etraxfs.h"
 #include "qemu/error-report.h"
+#include "qapi/error.h"
 
 #define D(x)
 
@@ -584,14 +585,25 @@ static NetClientInfo net_etraxfs_info = {
 .link_status_changed = eth_set_link,
 };
 
-static int fs_eth_init(SysBusDevice *sbd)
+static void fs_eth_init(Object *obj)
+{
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
+ETRAXFSEthState *s = ETRAX_FS_ETH(obj);
+
+memory_region_init_io(>mmio, obj, _ops, s,
+  "etraxfs-eth", 0x5c);
+sysbus_init_mmio(sbd, >mmio);
+
+tdk_init(>phy);
+}
+
+static void fs_eth_realize(DeviceState *dev, Error **errp)
 {
-DeviceState *dev = DEVICE(sbd);
 ETRAXFSEthState *s = ETRAX_FS_ETH(dev);
 
 if (!s->dma_out || !s->dma_in) {
-error_report("Unconnected ETRAX-FS Ethernet MAC");
-return -1;
+error_setg(errp, "Unconnected ETRAX-FS Ethernet MAC");
+return;
 }
 
 s->dma_out->client.push = eth_tx_push;
@@ -599,19 +611,11 @@ static int fs_eth_init(SysBusDevice *sbd)
 s->dma_in->client.opaque = s;
 s->dma_in->client.pull = NULL;
 
-memory_region_init_io(>mmio, OBJECT(dev), _ops, s,
-  "etraxfs-eth", 0x5c);
-sysbus_init_mmio(sbd, >mmio);
-
 qemu_macaddr_default_if_unset(>conf.macaddr);
 s->nic = qemu_new_nic(_etraxfs_info, >conf,
-  object_get_typename(OBJECT(s)), dev->id, s);
+  object_get_typename(OBJECT(dev)), dev->id, s);
 qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
-
-
-tdk_init(>phy);
 mdio_attach(>mdio_bus, >phy, s->phyaddr);
-return 0;
 }
 
 static Property etraxfs_eth_properties[] = {
@@ -625,18 +629,18 @@ static Property etraxfs_eth_properties[] = {
 static void etraxfs_eth_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = fs_eth_init;
 dc->props = etraxfs_eth_properties;
 /* Reason: pointer properties "dma_out", "dma_in" */
 dc->cannot_instantiate_with_device_add_yet = true;
+dc->realize = fs_eth_realize;
 }
 
 static const TypeInfo etraxfs_eth_info = {
 .name  = TYPE_ETRAX_FS_ETH,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(ETRAXFSEthState),
+.instance_init = fs_eth_init,
 .class_init= etraxfs_eth_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 1/2] hw/timer: QOM'ify etraxfs_timer

2016-10-23 Thread xiaoqiang zhao
assign etraxfs_timer_init to etraxfs_timer_info.instance_init
and drop the SysBusDeviceClass::init

Reviewed-by: Edgar E. Iglesias <edgar.igles...@xilinx.com>
Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/etraxfs_timer.c | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/hw/timer/etraxfs_timer.c b/hw/timer/etraxfs_timer.c
index 8e18236..bc4bc3a 100644
--- a/hw/timer/etraxfs_timer.c
+++ b/hw/timer/etraxfs_timer.c
@@ -302,9 +302,9 @@ static const MemoryRegionOps timer_ops = {
 }
 };
 
-static void etraxfs_timer_reset(void *opaque)
+static void etraxfs_timer_reset(DeviceState *dev)
 {
-ETRAXTimerState *t = opaque;
+ETRAXTimerState *t = ETRAX_TIMER(dev);
 
 ptimer_stop(t->ptimer_t0);
 ptimer_stop(t->ptimer_t1);
@@ -315,9 +315,10 @@ static void etraxfs_timer_reset(void *opaque)
 qemu_irq_lower(t->irq);
 }
 
-static int etraxfs_timer_init(SysBusDevice *dev)
+static void etraxfs_timer_init(Object *obj)
 {
-ETRAXTimerState *t = ETRAX_TIMER(dev);
+ETRAXTimerState *t = ETRAX_TIMER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 t->bh_t0 = qemu_bh_new(timer0_hit, t);
 t->bh_t1 = qemu_bh_new(timer1_hit, t);
@@ -329,24 +330,23 @@ static int etraxfs_timer_init(SysBusDevice *dev)
 sysbus_init_irq(dev, >irq);
 sysbus_init_irq(dev, >nmi);
 
-memory_region_init_io(>mmio, OBJECT(t), _ops, t,
+memory_region_init_io(>mmio, obj, _ops, t,
   "etraxfs-timer", 0x5c);
 sysbus_init_mmio(dev, >mmio);
-qemu_register_reset(etraxfs_timer_reset, t);
-return 0;
 }
 
 static void etraxfs_timer_class_init(ObjectClass *klass, void *data)
 {
-SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
+DeviceClass *dc = DEVICE_CLASS(klass);
 
-sdc->init = etraxfs_timer_init;
+dc->reset = etraxfs_timer_reset;
 }
 
 static const TypeInfo etraxfs_timer_info = {
 .name  = TYPE_ETRAX_FS_TIMER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(ETRAXTimerState),
+.instance_init = etraxfs_timer_init,
 .class_init= etraxfs_timer_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 5/9] hw/timer: QOM'ify m48txx_sysbus (pass 1)

2016-10-23 Thread xiaoqiang zhao
* split the old SysBus init function into an instance_init
  and a Device realize function
* use DeviceClass::realize instead of SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/m48t59.c | 35 ++-
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index e46ca88..39e425e 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -765,30 +765,31 @@ static void m48t59_isa_realize(DeviceState *dev, Error 
**errp)
 }
 }
 
-static int m48t59_init1(SysBusDevice *dev)
+static void m48t59_init1(Object *obj)
 {
-M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev);
-M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
-Object *o = OBJECT(dev);
+M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(obj);
+M48txxSysBusState *d = M48TXX_SYS_BUS(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 M48t59State *s = >state;
-Error *err = NULL;
 
 s->model = u->info.model;
 s->size = u->info.size;
 sysbus_init_irq(dev, >IRQ);
 
-memory_region_init_io(>iomem, o, _ops, s, "m48t59.nvram",
+memory_region_init_io(>iomem, obj, _ops, s, "m48t59.nvram",
   s->size);
-memory_region_init_io(>io, o, _io_ops, s, "m48t59", 4);
-sysbus_init_mmio(dev, >iomem);
-sysbus_init_mmio(dev, >io);
-m48t59_realize_common(s, );
-if (err != NULL) {
-error_free(err);
-return -1;
-}
+memory_region_init_io(>io, obj, _io_ops, s, "m48t59", 4);
+}
 
-return 0;
+static void m48t59_realize(DeviceState *dev, Error **errp)
+{
+M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
+M48t59State *s = >state;
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+
+sysbus_init_mmio(sbd, >iomem);
+sysbus_init_mmio(sbd, >io);
+m48t59_realize_common(s, errp);
 }
 
 static uint32_t m48txx_isa_read(Nvram *obj, uint32_t addr)
@@ -862,10 +863,9 @@ static Property m48t59_sysbus_properties[] = {
 static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 NvramClass *nc = NVRAM_CLASS(klass);
 
-k->init = m48t59_init1;
+dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
 nc->read = m48txx_sysbus_read;
@@ -891,6 +891,7 @@ static const TypeInfo m48txx_sysbus_type_info = {
 .name = TYPE_M48TXX_SYS_BUS,
 .parent = TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(M48txxSysBusState),
+.instance_init = m48t59_init1,
 .abstract = true,
 .class_init = m48txx_sysbus_class_init,
 .interfaces = (InterfaceInfo[]) {
-- 
2.9.3





[Qemu-devel] [PATCH 7/9] hw/timer: QOM'ify slavio_timer

2016-10-23 Thread xiaoqiang zhao
rename slavio_timer_init1 to slavio_timer_init and assign
it to slavio_timer_info.instance_init, then we drop the
SysBusDeviceClass::init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/slavio_timer.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
index bfee1f3..a8cc9c0 100644
--- a/hw/timer/slavio_timer.c
+++ b/hw/timer/slavio_timer.c
@@ -373,9 +373,10 @@ static void slavio_timer_reset(DeviceState *d)
 s->cputimer_mode = 0;
 }
 
-static int slavio_timer_init1(SysBusDevice *dev)
+static void slavio_timer_init(Object *obj)
 {
-SLAVIO_TIMERState *s = SLAVIO_TIMER(dev);
+SLAVIO_TIMERState *s = SLAVIO_TIMER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 QEMUBH *bh;
 unsigned int i;
 TimerContext *tc;
@@ -394,14 +395,12 @@ static int slavio_timer_init1(SysBusDevice *dev)
 
 size = i == 0 ? SYS_TIMER_SIZE : CPU_TIMER_SIZE;
 snprintf(timer_name, sizeof(timer_name), "timer-%i", i);
-memory_region_init_io(>iomem, OBJECT(s), _timer_mem_ops, tc,
+memory_region_init_io(>iomem, obj, _timer_mem_ops, tc,
   timer_name, size);
 sysbus_init_mmio(dev, >iomem);
 
 sysbus_init_irq(dev, >cputimer[i].irq);
 }
-
-return 0;
 }
 
 static Property slavio_timer_properties[] = {
@@ -412,9 +411,7 @@ static Property slavio_timer_properties[] = {
 static void slavio_timer_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_timer_init1;
 dc->reset = slavio_timer_reset;
 dc->vmsd = _slavio_timer;
 dc->props = slavio_timer_properties;
@@ -424,6 +421,7 @@ static const TypeInfo slavio_timer_info = {
 .name  = TYPE_SLAVIO_TIMER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(SLAVIO_TIMERState),
+.instance_init = slavio_timer_init,
 .class_init= slavio_timer_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 4/9] hw/misc: QOM'ify slavio_misc.c

2016-10-23 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/misc/slavio_misc.c | 43 +--
 1 file changed, 17 insertions(+), 26 deletions(-)

diff --git a/hw/misc/slavio_misc.c b/hw/misc/slavio_misc.c
index edd5de0..e1a706e 100644
--- a/hw/misc/slavio_misc.c
+++ b/hw/misc/slavio_misc.c
@@ -414,76 +414,73 @@ static const VMStateDescription vmstate_misc = {
 }
 };
 
-static int apc_init1(SysBusDevice *dev)
+static void apc_init(Object *obj)
 {
-APCState *s = APC(dev);
+APCState *s = APC(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >cpu_halt);
 
 /* Power management (APC) XXX: not a Slavio device */
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
+memory_region_init_io(>iomem, obj, _mem_ops, s,
   "apc", MISC_SIZE);
 sysbus_init_mmio(dev, >iomem);
-return 0;
 }
 
-static int slavio_misc_init1(SysBusDevice *sbd)
+static void slavio_misc_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-MiscState *s = SLAVIO_MISC(dev);
+DeviceState *dev = DEVICE(obj);
+MiscState *s = SLAVIO_MISC(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 sysbus_init_irq(sbd, >fdc_tc);
 
 /* 8 bit registers */
 /* Slavio control */
-memory_region_init_io(>cfg_iomem, OBJECT(s), _cfg_mem_ops, s,
+memory_region_init_io(>cfg_iomem, obj, _cfg_mem_ops, s,
   "configuration", MISC_SIZE);
 sysbus_init_mmio(sbd, >cfg_iomem);
 
 /* Diagnostics */
-memory_region_init_io(>diag_iomem, OBJECT(s), _diag_mem_ops, s,
+memory_region_init_io(>diag_iomem, obj, _diag_mem_ops, s,
   "diagnostic", MISC_SIZE);
 sysbus_init_mmio(sbd, >diag_iomem);
 
 /* Modem control */
-memory_region_init_io(>mdm_iomem, OBJECT(s), _mdm_mem_ops, s,
+memory_region_init_io(>mdm_iomem, obj, _mdm_mem_ops, s,
   "modem", MISC_SIZE);
 sysbus_init_mmio(sbd, >mdm_iomem);
 
 /* 16 bit registers */
 /* ss600mp diag LEDs */
-memory_region_init_io(>led_iomem, OBJECT(s), _led_mem_ops, s,
+memory_region_init_io(>led_iomem, obj, _led_mem_ops, s,
   "leds", LED_SIZE);
 sysbus_init_mmio(sbd, >led_iomem);
 
 /* 32 bit registers */
 /* System control */
-memory_region_init_io(>sysctrl_iomem, OBJECT(s), 
_sysctrl_mem_ops, s,
+memory_region_init_io(>sysctrl_iomem, obj, _sysctrl_mem_ops, s,
   "system-control", SYSCTRL_SIZE);
 sysbus_init_mmio(sbd, >sysctrl_iomem);
 
 /* AUX 1 (Misc System Functions) */
-memory_region_init_io(>aux1_iomem, OBJECT(s), _aux1_mem_ops, s,
+memory_region_init_io(>aux1_iomem, obj, _aux1_mem_ops, s,
   "misc-system-functions", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux1_iomem);
 
 /* AUX 2 (Software Powerdown Control) */
-memory_region_init_io(>aux2_iomem, OBJECT(s), _aux2_mem_ops, s,
+memory_region_init_io(>aux2_iomem, obj, _aux2_mem_ops, s,
   "software-powerdown-control", MISC_SIZE);
 sysbus_init_mmio(sbd, >aux2_iomem);
 
 qdev_init_gpio_in(dev, slavio_set_power_fail, 1);
-
-return 0;
 }
 
 static void slavio_misc_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = slavio_misc_init1;
 dc->reset = slavio_misc_reset;
 dc->vmsd = _misc;
 }
@@ -492,21 +489,15 @@ static const TypeInfo slavio_misc_info = {
 .name  = TYPE_SLAVIO_MISC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
+.instance_init = slavio_misc_init,
 .class_init= slavio_misc_class_init,
 };
 
-static void apc_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = apc_init1;
-}
-
 static const TypeInfo apc_info = {
 .name  = TYPE_APC,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(MiscState),
-.class_init= apc_class_init,
+.instance_init = apc_init,
 };
 
 static void slavio_misc_register_types(void)
-- 
2.9.3





[Qemu-devel] [PATCH 2/9] hw/dma: QOM'ify sparc32_dma.c

2016-10-23 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init
and an realize function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/dma/sparc32_dma.c | 25 +++--
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 9d545e4..ef4c6a9 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -270,23 +270,28 @@ static const VMStateDescription vmstate_dma = {
 }
 };
 
-static int sparc32_dma_init1(SysBusDevice *sbd)
+static void sparc32_dma_init(Object *obj)
 {
-DeviceState *dev = DEVICE(sbd);
-DMAState *s = SPARC32_DMA(dev);
-int reg_size;
+DeviceState *dev = DEVICE(obj);
+DMAState *s = SPARC32_DMA(obj);
+SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(sbd, >irq);
 
-reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s,
-  "dma", reg_size);
 sysbus_init_mmio(sbd, >iomem);
 
 qdev_init_gpio_in(dev, dma_set_irq, 1);
 qdev_init_gpio_out(dev, s->gpio, 2);
+}
 
-return 0;
+static void sparc32_dma_realize(DeviceState *dev, Error **errp)
+{
+DMAState *s = SPARC32_DMA(dev);
+int reg_size;
+
+reg_size = s->is_ledma ? DMA_ETH_SIZE : DMA_SIZE;
+memory_region_init_io(>iomem, OBJECT(dev), _mem_ops, s,
+  "dma", reg_size);
 }
 
 static Property sparc32_dma_properties[] = {
@@ -298,12 +303,11 @@ static Property sparc32_dma_properties[] = {
 static void sparc32_dma_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = sparc32_dma_init1;
 dc->reset = dma_reset;
 dc->vmsd = _dma;
 dc->props = sparc32_dma_properties;
+dc->realize = sparc32_dma_realize;
 /* Reason: pointer property "iommu_opaque" */
 dc->cannot_instantiate_with_device_add_yet = true;
 }
@@ -312,6 +316,7 @@ static const TypeInfo sparc32_dma_info = {
 .name  = TYPE_SPARC32_DMA,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(DMAState),
+.instance_init = sparc32_dma_init,
 .class_init= sparc32_dma_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 9/9] hw/sparc64: QOM'ify sun4u.c

2016-10-23 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sparc64/sun4u.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 3165e18..aac4cb5 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -651,16 +651,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4u.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4u.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -670,9 +670,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -681,6 +679,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 
@@ -695,15 +694,15 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4U_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_init_ram(>ram, OBJECT(d), "sun4u.ram", d->size,
_fatal);
 vmstate_register_ram_global(>ram);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size)
@@ -731,9 +730,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.9.3





[Qemu-devel] [PATCH 3/9] hw/dma: QOM'ify sun4m_iommu.c

2016-10-23 Thread xiaoqiang zhao
Drop the old SysBus init function and use instance_init

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/dma/sun4m_iommu.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/dma/sun4m_iommu.c b/hw/dma/sun4m_iommu.c
index b3cbc54..335ef63 100644
--- a/hw/dma/sun4m_iommu.c
+++ b/hw/dma/sun4m_iommu.c
@@ -349,17 +349,16 @@ static void iommu_reset(DeviceState *d)
 s->regs[IOMMU_MASK_ID] = IOMMU_TS_MASK;
 }
 
-static int iommu_init1(SysBusDevice *dev)
+static void iommu_init(Object *obj)
 {
-IOMMUState *s = SUN4M_IOMMU(dev);
+IOMMUState *s = SUN4M_IOMMU(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
 sysbus_init_irq(dev, >irq);
 
-memory_region_init_io(>iomem, OBJECT(s), _mem_ops, s, "iommu",
+memory_region_init_io(>iomem, obj, _mem_ops, s, "iommu",
   IOMMU_NREGS * sizeof(uint32_t));
 sysbus_init_mmio(dev, >iomem);
-
-return 0;
 }
 
 static Property iommu_properties[] = {
@@ -370,9 +369,7 @@ static Property iommu_properties[] = {
 static void iommu_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = iommu_init1;
 dc->reset = iommu_reset;
 dc->vmsd = _iommu;
 dc->props = iommu_properties;
@@ -382,6 +379,7 @@ static const TypeInfo iommu_info = {
 .name  = TYPE_SUN4M_IOMMU,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IOMMUState),
+.instance_init = iommu_init,
 .class_init= iommu_class_init,
 };
 
-- 
2.9.3





[Qemu-devel] [PATCH 6/9] hw/timer: QOM'ify m48txx_sysbus (pass 2)

2016-10-23 Thread xiaoqiang zhao
assign DeviceClass::vmsd instead of using vmstate_register function

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/timer/m48t59.c | 26 --
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 39e425e..6afcce4 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -639,6 +639,28 @@ static const VMStateDescription vmstate_m48t59 = {
 }
 };
 
+static const VMStateDescription vmstate_m48t59_isa = {
+.name = "m48t59",
+.version_id = 1,
+.minimum_version_id = 1,
+.fields = (VMStateField[]) {
+VMSTATE_STRUCT(state, M48txxISAState, 0,
+   vmstate_m48t59, M48t59State),
+VMSTATE_END_OF_LIST()
+}
+};
+
+static const VMStateDescription vmstate_m48t59_sys_bus = {
+.name = "m48t59",
+.version_id = 1,
+.minimum_version_id = 1,
+.fields = (VMStateField[]) {
+VMSTATE_STRUCT(state, M48txxSysBusState, 0,
+   vmstate_m48t59, M48t59State),
+VMSTATE_END_OF_LIST()
+}
+};
+
 static void m48t59_reset_common(M48t59State *NVRAM)
 {
 NVRAM->addr = 0;
@@ -744,8 +766,6 @@ static void m48t59_realize_common(M48t59State *s, Error 
**errp)
 s->wd_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, _cb, s);
 }
 qemu_get_timedate(>alarm, 0);
-
-vmstate_register(NULL, -1, _m48t59, s);
 }
 
 static void m48t59_isa_realize(DeviceState *dev, Error **errp)
@@ -824,6 +844,7 @@ static void m48txx_isa_class_init(ObjectClass *klass, void 
*data)
 dc->realize = m48t59_isa_realize;
 dc->reset = m48t59_reset_isa;
 dc->props = m48t59_isa_properties;
+dc->vmsd = _m48t59_isa;
 nc->read = m48txx_isa_read;
 nc->write = m48txx_isa_write;
 nc->toggle_lock = m48txx_isa_toggle_lock;
@@ -868,6 +889,7 @@ static void m48txx_sysbus_class_init(ObjectClass *klass, 
void *data)
 dc->realize = m48t59_realize;
 dc->reset = m48t59_reset_sysbus;
 dc->props = m48t59_sysbus_properties;
+dc->vmsd = _m48t59_sys_bus;
 nc->read = m48txx_sysbus_read;
 nc->write = m48txx_sysbus_write;
 nc->toggle_lock = m48txx_sysbus_toggle_lock;
-- 
2.9.3





[Qemu-devel] [PATCH 8/9] hw/sparc: QOM'ify sun4m.c

2016-10-23 Thread xiaoqiang zhao
Drop the old SysBusDeviceClass::init and use instance_init
or DeviceClass::realize instead

Signed-off-by: xiaoqiang zhao <zxq_yx_...@163.com>
---
 hw/sparc/sun4m.c | 54 +++---
 1 file changed, 19 insertions(+), 35 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index b3915e4..95aef49 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -605,30 +605,23 @@ typedef struct IDRegState {
 MemoryRegion mem;
 } IDRegState;
 
-static int idreg_init1(SysBusDevice *dev)
+static void idreg_init1(Object *obj)
 {
-IDRegState *s = MACIO_ID_REGISTER(dev);
+IDRegState *s = MACIO_ID_REGISTER(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s),
+memory_region_init_ram(>mem, obj,
"sun4m.idreg", sizeof(idreg_data), _fatal);
 vmstate_register_ram_global(>mem);
 memory_region_set_readonly(>mem, true);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void idreg_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = idreg_init1;
 }
 
 static const TypeInfo idreg_info = {
 .name  = TYPE_MACIO_ID_REGISTER,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(IDRegState),
-.class_init= idreg_class_init,
+.instance_init = idreg_init1,
 };
 
 #define TYPE_TCX_AFX "tcx_afx"
@@ -653,28 +646,21 @@ static void afx_init(hwaddr addr)
 sysbus_mmio_map(s, 0, addr);
 }
 
-static int afx_init1(SysBusDevice *dev)
+static void afx_init1(Object *obj)
 {
-AFXState *s = TCX_AFX(dev);
+AFXState *s = TCX_AFX(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>mem, OBJECT(s), "sun4m.afx", 4, _fatal);
+memory_region_init_ram(>mem, obj, "sun4m.afx", 4, _fatal);
 vmstate_register_ram_global(>mem);
 sysbus_init_mmio(dev, >mem);
-return 0;
-}
-
-static void afx_class_init(ObjectClass *klass, void *data)
-{
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
-
-k->init = afx_init1;
 }
 
 static const TypeInfo afx_info = {
 .name  = TYPE_TCX_AFX,
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(AFXState),
-.class_init= afx_class_init,
+.instance_init = afx_init1,
 };
 
 #define TYPE_OPENPROM "openprom"
@@ -727,16 +713,16 @@ static void prom_init(hwaddr addr, const char *bios_name)
 }
 }
 
-static int prom_init1(SysBusDevice *dev)
+static void prom_init1(Object *obj)
 {
-PROMState *s = OPENPROM(dev);
+PROMState *s = OPENPROM(obj);
+SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
-memory_region_init_ram(>prom, OBJECT(s), "sun4m.prom", PROM_SIZE_MAX,
+memory_region_init_ram(>prom, obj, "sun4m.prom", PROM_SIZE_MAX,
_fatal);
 vmstate_register_ram_global(>prom);
 memory_region_set_readonly(>prom, true);
 sysbus_init_mmio(dev, >prom);
-return 0;
 }
 
 static Property prom_properties[] = {
@@ -746,9 +732,7 @@ static Property prom_properties[] = {
 static void prom_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = prom_init1;
 dc->props = prom_properties;
 }
 
@@ -757,6 +741,7 @@ static const TypeInfo prom_info = {
 .parent= TYPE_SYS_BUS_DEVICE,
 .instance_size = sizeof(PROMState),
 .class_init= prom_class_init,
+.instance_init = prom_init1,
 };
 
 #define TYPE_SUN4M_MEMORY "memory"
@@ -770,14 +755,14 @@ typedef struct RamDevice {
 } RamDevice;
 
 /* System RAM */
-static int ram_init1(SysBusDevice *dev)
+static void ram_realize(DeviceState *dev, Error **errp)
 {
 RamDevice *d = SUN4M_RAM(dev);
+SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
 
 memory_region_allocate_system_memory(>ram, OBJECT(d), "sun4m.ram",
  d->size);
-sysbus_init_mmio(dev, >ram);
-return 0;
+sysbus_init_mmio(sbd, >ram);
 }
 
 static void ram_init(hwaddr addr, ram_addr_t RAM_size,
@@ -813,9 +798,8 @@ static Property ram_properties[] = {
 static void ram_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = ram_init1;
+dc->realize = ram_realize;
 dc->props = ram_properties;
 }
 
-- 
2.9.3





  1   2   3   4   >