db_syncobj.c revision 1.2.2.2 1 1.2.2.2 martin /* $NetBSD: db_syncobj.c,v 1.2.2.2 2023/08/09 17:42:03 martin Exp $ */
2 1.2.2.2 martin
3 1.2.2.2 martin /*-
4 1.2.2.2 martin * Copyright (c) 2023 The NetBSD Foundation, Inc.
5 1.2.2.2 martin * All rights reserved.
6 1.2.2.2 martin *
7 1.2.2.2 martin * Redistribution and use in source and binary forms, with or without
8 1.2.2.2 martin * modification, are permitted provided that the following conditions
9 1.2.2.2 martin * are met:
10 1.2.2.2 martin * 1. Redistributions of source code must retain the above copyright
11 1.2.2.2 martin * notice, this list of conditions and the following disclaimer.
12 1.2.2.2 martin * 2. Redistributions in binary form must reproduce the above copyright
13 1.2.2.2 martin * notice, this list of conditions and the following disclaimer in the
14 1.2.2.2 martin * documentation and/or other materials provided with the distribution.
15 1.2.2.2 martin *
16 1.2.2.2 martin * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.2.2.2 martin * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.2.2.2 martin * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.2.2.2 martin * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.2.2.2 martin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.2.2.2 martin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.2.2.2 martin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.2.2.2 martin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.2.2.2 martin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.2.2.2 martin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.2.2.2 martin * POSSIBILITY OF SUCH DAMAGE.
27 1.2.2.2 martin */
28 1.2.2.2 martin
29 1.2.2.2 martin #define __MUTEX_PRIVATE
30 1.2.2.2 martin #define __RWLOCK_PRIVATE
31 1.2.2.2 martin
32 1.2.2.2 martin #include <sys/cdefs.h>
33 1.2.2.2 martin __KERNEL_RCSID(0, "$NetBSD: db_syncobj.c,v 1.2.2.2 2023/08/09 17:42:03 martin Exp $");
34 1.2.2.2 martin
35 1.2.2.2 martin #include <sys/types.h>
36 1.2.2.2 martin
37 1.2.2.2 martin #include <sys/mutex.h>
38 1.2.2.2 martin #include <sys/null.h>
39 1.2.2.2 martin #include <sys/rwlock.h>
40 1.2.2.2 martin #include <sys/syncobj.h>
41 1.2.2.2 martin
42 1.2.2.2 martin #include <ddb/ddb.h>
43 1.2.2.2 martin
44 1.2.2.2 martin struct lwp *
45 1.2.2.2 martin db_syncobj_owner(struct syncobj *sobj, wchan_t wchan)
46 1.2.2.2 martin {
47 1.2.2.2 martin db_expr_t mutex_syncobj_;
48 1.2.2.2 martin db_expr_t rw_syncobj_;
49 1.2.2.2 martin
50 1.2.2.2 martin if (db_value_of_name("mutex_syncobj", &mutex_syncobj_) &&
51 1.2.2.2 martin (db_expr_t)(uintptr_t)sobj == mutex_syncobj_) {
52 1.2.2.2 martin volatile const struct kmutex *mtx = wchan;
53 1.2.2.2 martin uintptr_t owner;
54 1.2.2.2 martin
55 1.2.2.2 martin db_read_bytes((db_addr_t)&mtx->mtx_owner, sizeof(owner),
56 1.2.2.2 martin (char *)&owner);
57 1.2.2.2 martin return (struct lwp *)(owner & MUTEX_THREAD);
58 1.2.2.2 martin
59 1.2.2.2 martin } else if (db_value_of_name("rw_syncobj", &rw_syncobj_) &&
60 1.2.2.2 martin (db_expr_t)(uintptr_t)sobj == rw_syncobj_) {
61 1.2.2.2 martin volatile const struct krwlock *rw = wchan;
62 1.2.2.2 martin uintptr_t owner;
63 1.2.2.2 martin
64 1.2.2.2 martin db_read_bytes((db_addr_t)&rw->rw_owner, sizeof(owner),
65 1.2.2.2 martin (char *)&owner);
66 1.2.2.2 martin if (owner & RW_WRITE_LOCKED)
67 1.2.2.2 martin return (struct lwp *)(owner & RW_THREAD);
68 1.2.2.2 martin return NULL;
69 1.2.2.2 martin
70 1.2.2.2 martin } else {
71 1.2.2.2 martin return NULL;
72 1.2.2.2 martin }
73 1.2.2.2 martin }
74