1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * file.c - part of debugfs, a tiny little debug file system 4 * 5 * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com> 6 * Copyright (C) 2004 IBM Inc. 7 * 8 * debugfs is for people to use instead of /proc or /sys. 9 * See Documentation/filesystems/ for more details. 10 */ 11 12 #include <linux/module.h> 13 #include <linux/fs.h> 14 #include <linux/seq_file.h> 15 #include <linux/pagemap.h> 16 #include <linux/debugfs.h> 17 #include <linux/io.h> 18 #include <linux/slab.h> 19 #include <linux/atomic.h> 20 #include <linux/device.h> 21 #include <linux/pm_runtime.h> 22 #include <linux/poll.h> 23 #include <linux/security.h> 24 25 #include "internal.h" 26 27 struct poll_table_struct; 28 29 static ssize_t default_read_file(struct file *file, char __user *buf, 30 size_t count, loff_t *ppos) 31 { 32 return 0; 33 } 34 35 static ssize_t default_write_file(struct file *file, const char __user *buf, 36 size_t count, loff_t *ppos) 37 { 38 return count; 39 } 40 41 const struct file_operations debugfs_noop_file_operations = { 42 .read = default_read_file, 43 .write = default_write_file, 44 .open = simple_open, 45 .llseek = noop_llseek, 46 }; 47 48 #define F_DENTRY(filp) ((filp)->f_path.dentry) 49 50 const struct file_operations *debugfs_real_fops(const struct file *filp) 51 { 52 struct debugfs_fsdata *fsd = F_DENTRY(filp)->d_fsdata; 53 54 if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT) { 55 /* 56 * Urgh, we've been called w/o a protecting 57 * debugfs_file_get(). 58 */ 59 WARN_ON(1); 60 return NULL; 61 } 62 63 return fsd->real_fops; 64 } 65 EXPORT_SYMBOL_GPL(debugfs_real_fops); 66 67 /** 68 * debugfs_file_get - mark the beginning of file data access 69 * @dentry: the dentry object whose data is being accessed. 70 * 71 * Up to a matching call to debugfs_file_put(), any successive call 72 * into the file removing functions debugfs_remove() and 73 * debugfs_remove_recursive() will block. Since associated private 74 * file data may only get freed after a successful return of any of 75 * the removal functions, you may safely access it after a successful 76 * call to debugfs_file_get() without worrying about lifetime issues. 77 * 78 * If -%EIO is returned, the file has already been removed and thus, 79 * it is not safe to access any of its data. If, on the other hand, 80 * it is allowed to access the file data, zero is returned. 81 */ 82 int debugfs_file_get(struct dentry *dentry) 83 { 84 struct debugfs_fsdata *fsd; 85 void *d_fsd; 86 87 /* 88 * This could only happen if some debugfs user erroneously calls 89 * debugfs_file_get() on a dentry that isn't even a file, let 90 * them know about it. 91 */ 92 if (WARN_ON(!d_is_reg(dentry))) 93 return -EINVAL; 94 95 d_fsd = READ_ONCE(dentry->d_fsdata); 96 if (!((unsigned long)d_fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT)) { 97 fsd = d_fsd; 98 } else { 99 fsd = kmalloc(sizeof(*fsd), GFP_KERNEL); 100 if (!fsd) 101 return -ENOMEM; 102 103 fsd->real_fops = (void *)((unsigned long)d_fsd & 104 ~DEBUGFS_FSDATA_IS_REAL_FOPS_BIT); 105 refcount_set(&fsd->active_users, 1); 106 init_completion(&fsd->active_users_drained); 107 INIT_LIST_HEAD(&fsd->cancellations); 108 mutex_init(&fsd->cancellations_mtx); 109 110 if (cmpxchg(&dentry->d_fsdata, d_fsd, fsd) != d_fsd) { 111 mutex_destroy(&fsd->cancellations_mtx); 112 kfree(fsd); 113 fsd = READ_ONCE(dentry->d_fsdata); 114 } 115 } 116 117 /* 118 * In case of a successful cmpxchg() above, this check is 119 * strictly necessary and must follow it, see the comment in 120 * __debugfs_remove_file(). 121 * OTOH, if the cmpxchg() hasn't been executed or wasn't 122 * successful, this serves the purpose of not starving 123 * removers. 124 */ 125 if (d_unlinked(dentry)) 126 return -EIO; 127 128 if (!refcount_inc_not_zero(&fsd->active_users)) 129 return -EIO; 130 131 return 0; 132 } 133 EXPORT_SYMBOL_GPL(debugfs_file_get); 134 135 /** 136 * debugfs_file_put - mark the end of file data access 137 * @dentry: the dentry object formerly passed to 138 * debugfs_file_get(). 139 * 140 * Allow any ongoing concurrent call into debugfs_remove() or 141 * debugfs_remove_recursive() blocked by a former call to 142 * debugfs_file_get() to proceed and return to its caller. 143 */ 144 void debugfs_file_put(struct dentry *dentry) 145 { 146 struct debugfs_fsdata *fsd = READ_ONCE(dentry->d_fsdata); 147 148 if (refcount_dec_and_test(&fsd->active_users)) 149 complete(&fsd->active_users_drained); 150 } 151 EXPORT_SYMBOL_GPL(debugfs_file_put); 152 153 /** 154 * debugfs_enter_cancellation - enter a debugfs cancellation 155 * @file: the file being accessed 156 * @cancellation: the cancellation object, the cancel callback 157 * inside of it must be initialized 158 * 159 * When a debugfs file is removed it needs to wait for all active 160 * operations to complete. However, the operation itself may need 161 * to wait for hardware or completion of some asynchronous process 162 * or similar. As such, it may need to be cancelled to avoid long 163 * waits or even deadlocks. 164 * 165 * This function can be used inside a debugfs handler that may 166 * need to be cancelled. As soon as this function is called, the 167 * cancellation's 'cancel' callback may be called, at which point 168 * the caller should proceed to call debugfs_leave_cancellation() 169 * and leave the debugfs handler function as soon as possible. 170 * Note that the 'cancel' callback is only ever called in the 171 * context of some kind of debugfs_remove(). 172 * 173 * This function must be paired with debugfs_leave_cancellation(). 174 */ 175 void debugfs_enter_cancellation(struct file *file, 176 struct debugfs_cancellation *cancellation) 177 { 178 struct debugfs_fsdata *fsd; 179 struct dentry *dentry = F_DENTRY(file); 180 181 INIT_LIST_HEAD(&cancellation->list); 182 183 if (WARN_ON(!d_is_reg(dentry))) 184 return; 185 186 if (WARN_ON(!cancellation->cancel)) 187 return; 188 189 fsd = READ_ONCE(dentry->d_fsdata); 190 if (WARN_ON(!fsd || 191 ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT))) 192 return; 193 194 mutex_lock(&fsd->cancellations_mtx); 195 list_add(&cancellation->list, &fsd->cancellations); 196 mutex_unlock(&fsd->cancellations_mtx); 197 198 /* if we're already removing wake it up to cancel */ 199 if (d_unlinked(dentry)) 200 complete(&fsd->active_users_drained); 201 } 202 EXPORT_SYMBOL_GPL(debugfs_enter_cancellation); 203 204 /** 205 * debugfs_leave_cancellation - leave cancellation section 206 * @file: the file being accessed 207 * @cancellation: the cancellation previously registered with 208 * debugfs_enter_cancellation() 209 * 210 * See the documentation of debugfs_enter_cancellation(). 211 */ 212 void debugfs_leave_cancellation(struct file *file, 213 struct debugfs_cancellation *cancellation) 214 { 215 struct debugfs_fsdata *fsd; 216 struct dentry *dentry = F_DENTRY(file); 217 218 if (WARN_ON(!d_is_reg(dentry))) 219 return; 220 221 fsd = READ_ONCE(dentry->d_fsdata); 222 if (WARN_ON(!fsd || 223 ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT))) 224 return; 225 226 mutex_lock(&fsd->cancellations_mtx); 227 if (!list_empty(&cancellation->list)) 228 list_del(&cancellation->list); 229 mutex_unlock(&fsd->cancellations_mtx); 230 } 231 EXPORT_SYMBOL_GPL(debugfs_leave_cancellation); 232 233 /* 234 * Only permit access to world-readable files when the kernel is locked down. 235 * We also need to exclude any file that has ways to write or alter it as root 236 * can bypass the permissions check. 237 */ 238 static int debugfs_locked_down(struct inode *inode, 239 struct file *filp, 240 const struct file_operations *real_fops) 241 { 242 if ((inode->i_mode & 07777 & ~0444) == 0 && 243 !(filp->f_mode & FMODE_WRITE) && 244 !real_fops->unlocked_ioctl && 245 !real_fops->compat_ioctl && 246 !real_fops->mmap) 247 return 0; 248 249 if (security_locked_down(LOCKDOWN_DEBUGFS)) 250 return -EPERM; 251 252 return 0; 253 } 254 255 static int open_proxy_open(struct inode *inode, struct file *filp) 256 { 257 struct dentry *dentry = F_DENTRY(filp); 258 const struct file_operations *real_fops = NULL; 259 int r; 260 261 r = debugfs_file_get(dentry); 262 if (r) 263 return r == -EIO ? -ENOENT : r; 264 265 real_fops = debugfs_real_fops(filp); 266 267 r = debugfs_locked_down(inode, filp, real_fops); 268 if (r) 269 goto out; 270 271 if (!fops_get(real_fops)) { 272 #ifdef CONFIG_MODULES 273 if (real_fops->owner && 274 real_fops->owner->state == MODULE_STATE_GOING) { 275 r = -ENXIO; 276 goto out; 277 } 278 #endif 279 280 /* Huh? Module did not clean up after itself at exit? */ 281 WARN(1, "debugfs file owner did not clean up at exit: %pd", 282 dentry); 283 r = -ENXIO; 284 goto out; 285 } 286 replace_fops(filp, real_fops); 287 288 if (real_fops->open) 289 r = real_fops->open(inode, filp); 290 291 out: 292 debugfs_file_put(dentry); 293 return r; 294 } 295 296 const struct file_operations debugfs_open_proxy_file_operations = { 297 .open = open_proxy_open, 298 }; 299 300 #define PROTO(args...) args 301 #define ARGS(args...) args 302 303 #define FULL_PROXY_FUNC(name, ret_type, filp, proto, args) \ 304 static ret_type full_proxy_ ## name(proto) \ 305 { \ 306 struct dentry *dentry = F_DENTRY(filp); \ 307 const struct file_operations *real_fops; \ 308 ret_type r; \ 309 \ 310 r = debugfs_file_get(dentry); \ 311 if (unlikely(r)) \ 312 return r; \ 313 real_fops = debugfs_real_fops(filp); \ 314 r = real_fops->name(args); \ 315 debugfs_file_put(dentry); \ 316 return r; \ 317 } 318 319 FULL_PROXY_FUNC(llseek, loff_t, filp, 320 PROTO(struct file *filp, loff_t offset, int whence), 321 ARGS(filp, offset, whence)); 322 323 FULL_PROXY_FUNC(read, ssize_t, filp, 324 PROTO(struct file *filp, char __user *buf, size_t size, 325 loff_t *ppos), 326 ARGS(filp, buf, size, ppos)); 327 328 FULL_PROXY_FUNC(write, ssize_t, filp, 329 PROTO(struct file *filp, const char __user *buf, size_t size, 330 loff_t *ppos), 331 ARGS(filp, buf, size, ppos)); 332 333 FULL_PROXY_FUNC(unlocked_ioctl, long, filp, 334 PROTO(struct file *filp, unsigned int cmd, unsigned long arg), 335 ARGS(filp, cmd, arg)); 336 337 static __poll_t full_proxy_poll(struct file *filp, 338 struct poll_table_struct *wait) 339 { 340 struct dentry *dentry = F_DENTRY(filp); 341 __poll_t r = 0; 342 const struct file_operations *real_fops; 343 344 if (debugfs_file_get(dentry)) 345 return EPOLLHUP; 346 347 real_fops = debugfs_real_fops(filp); 348 r = real_fops->poll(filp, wait); 349 debugfs_file_put(dentry); 350 return r; 351 } 352 353 static int full_proxy_release(struct inode *inode, struct file *filp) 354 { 355 const struct dentry *dentry = F_DENTRY(filp); 356 const struct file_operations *real_fops = debugfs_real_fops(filp); 357 const struct file_operations *proxy_fops = filp->f_op; 358 int r = 0; 359 360 /* 361 * We must not protect this against removal races here: the 362 * original releaser should be called unconditionally in order 363 * not to leak any resources. Releasers must not assume that 364 * ->i_private is still being meaningful here. 365 */ 366 if (real_fops->release) 367 r = real_fops->release(inode, filp); 368 369 replace_fops(filp, d_inode(dentry)->i_fop); 370 kfree(proxy_fops); 371 fops_put(real_fops); 372 return r; 373 } 374 375 static void __full_proxy_fops_init(struct file_operations *proxy_fops, 376 const struct file_operations *real_fops) 377 { 378 proxy_fops->release = full_proxy_release; 379 if (real_fops->llseek) 380 proxy_fops->llseek = full_proxy_llseek; 381 if (real_fops->read) 382 proxy_fops->read = full_proxy_read; 383 if (real_fops->write) 384 proxy_fops->write = full_proxy_write; 385 if (real_fops->poll) 386 proxy_fops->poll = full_proxy_poll; 387 if (real_fops->unlocked_ioctl) 388 proxy_fops->unlocked_ioctl = full_proxy_unlocked_ioctl; 389 } 390 391 static int full_proxy_open(struct inode *inode, struct file *filp) 392 { 393 struct dentry *dentry = F_DENTRY(filp); 394 const struct file_operations *real_fops = NULL; 395 struct file_operations *proxy_fops = NULL; 396 int r; 397 398 r = debugfs_file_get(dentry); 399 if (r) 400 return r == -EIO ? -ENOENT : r; 401 402 real_fops = debugfs_real_fops(filp); 403 404 r = debugfs_locked_down(inode, filp, real_fops); 405 if (r) 406 goto out; 407 408 if (!fops_get(real_fops)) { 409 #ifdef CONFIG_MODULES 410 if (real_fops->owner && 411 real_fops->owner->state == MODULE_STATE_GOING) { 412 r = -ENXIO; 413 goto out; 414 } 415 #endif 416 417 /* Huh? Module did not cleanup after itself at exit? */ 418 WARN(1, "debugfs file owner did not clean up at exit: %pd", 419 dentry); 420 r = -ENXIO; 421 goto out; 422 } 423 424 proxy_fops = kzalloc(sizeof(*proxy_fops), GFP_KERNEL); 425 if (!proxy_fops) { 426 r = -ENOMEM; 427 goto free_proxy; 428 } 429 __full_proxy_fops_init(proxy_fops, real_fops); 430 replace_fops(filp, proxy_fops); 431 432 if (real_fops->open) { 433 r = real_fops->open(inode, filp); 434 if (r) { 435 replace_fops(filp, d_inode(dentry)->i_fop); 436 goto free_proxy; 437 } else if (filp->f_op != proxy_fops) { 438 /* No protection against file removal anymore. */ 439 WARN(1, "debugfs file owner replaced proxy fops: %pd", 440 dentry); 441 goto free_proxy; 442 } 443 } 444 445 goto out; 446 free_proxy: 447 kfree(proxy_fops); 448 fops_put(real_fops); 449 out: 450 debugfs_file_put(dentry); 451 return r; 452 } 453 454 const struct file_operations debugfs_full_proxy_file_operations = { 455 .open = full_proxy_open, 456 }; 457 458 ssize_t debugfs_attr_read(struct file *file, char __user *buf, 459 size_t len, loff_t *ppos) 460 { 461 struct dentry *dentry = F_DENTRY(file); 462 ssize_t ret; 463 464 ret = debugfs_file_get(dentry); 465 if (unlikely(ret)) 466 return ret; 467 ret = simple_attr_read(file, buf, len, ppos); 468 debugfs_file_put(dentry); 469 return ret; 470 } 471 EXPORT_SYMBOL_GPL(debugfs_attr_read); 472 473 static ssize_t debugfs_attr_write_xsigned(struct file *file, const char __user *buf, 474 size_t len, loff_t *ppos, bool is_signed) 475 { 476 struct dentry *dentry = F_DENTRY(file); 477 ssize_t ret; 478 479 ret = debugfs_file_get(dentry); 480 if (unlikely(ret)) 481 return ret; 482 if (is_signed) 483 ret = simple_attr_write_signed(file, buf, len, ppos); 484 else 485 ret = simple_attr_write(file, buf, len, ppos); 486 debugfs_file_put(dentry); 487 return ret; 488 } 489 490 ssize_t debugfs_attr_write(struct file *file, const char __user *buf, 491 size_t len, loff_t *ppos) 492 { 493 return debugfs_attr_write_xsigned(file, buf, len, ppos, false); 494 } 495 EXPORT_SYMBOL_GPL(debugfs_attr_write); 496 497 ssize_t debugfs_attr_write_signed(struct file *file, const char __user *buf, 498 size_t len, loff_t *ppos) 499 { 500 return debugfs_attr_write_xsigned(file, buf, len, ppos, true); 501 } 502 EXPORT_SYMBOL_GPL(debugfs_attr_write_signed); 503 504 static struct dentry *debugfs_create_mode_unsafe(const char *name, umode_t mode, 505 struct dentry *parent, void *value, 506 const struct file_operations *fops, 507 const struct file_operations *fops_ro, 508 const struct file_operations *fops_wo) 509 { 510 /* if there are no write bits set, make read only */ 511 if (!(mode & S_IWUGO)) 512 return debugfs_create_file_unsafe(name, mode, parent, value, 513 fops_ro); 514 /* if there are no read bits set, make write only */ 515 if (!(mode & S_IRUGO)) 516 return debugfs_create_file_unsafe(name, mode, parent, value, 517 fops_wo); 518 519 return debugfs_create_file_unsafe(name, mode, parent, value, fops); 520 } 521 522 static int debugfs_u8_set(void *data, u64 val) 523 { 524 *(u8 *)data = val; 525 return 0; 526 } 527 static int debugfs_u8_get(void *data, u64 *val) 528 { 529 *val = *(u8 *)data; 530 return 0; 531 } 532 DEFINE_DEBUGFS_ATTRIBUTE(fops_u8, debugfs_u8_get, debugfs_u8_set, "%llu\n"); 533 DEFINE_DEBUGFS_ATTRIBUTE(fops_u8_ro, debugfs_u8_get, NULL, "%llu\n"); 534 DEFINE_DEBUGFS_ATTRIBUTE(fops_u8_wo, NULL, debugfs_u8_set, "%llu\n"); 535 536 /** 537 * debugfs_create_u8 - create a debugfs file that is used to read and write an unsigned 8-bit value 538 * @name: a pointer to a string containing the name of the file to create. 539 * @mode: the permission that the file should have 540 * @parent: a pointer to the parent dentry for this file. This should be a 541 * directory dentry if set. If this parameter is %NULL, then the 542 * file will be created in the root of the debugfs filesystem. 543 * @value: a pointer to the variable that the file should read to and write 544 * from. 545 * 546 * This function creates a file in debugfs with the given name that 547 * contains the value of the variable @value. If the @mode variable is so 548 * set, it can be read from, and written to. 549 */ 550 void debugfs_create_u8(const char *name, umode_t mode, struct dentry *parent, 551 u8 *value) 552 { 553 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u8, 554 &fops_u8_ro, &fops_u8_wo); 555 } 556 EXPORT_SYMBOL_GPL(debugfs_create_u8); 557 558 static int debugfs_u16_set(void *data, u64 val) 559 { 560 *(u16 *)data = val; 561 return 0; 562 } 563 static int debugfs_u16_get(void *data, u64 *val) 564 { 565 *val = *(u16 *)data; 566 return 0; 567 } 568 DEFINE_DEBUGFS_ATTRIBUTE(fops_u16, debugfs_u16_get, debugfs_u16_set, "%llu\n"); 569 DEFINE_DEBUGFS_ATTRIBUTE(fops_u16_ro, debugfs_u16_get, NULL, "%llu\n"); 570 DEFINE_DEBUGFS_ATTRIBUTE(fops_u16_wo, NULL, debugfs_u16_set, "%llu\n"); 571 572 /** 573 * debugfs_create_u16 - create a debugfs file that is used to read and write an unsigned 16-bit value 574 * @name: a pointer to a string containing the name of the file to create. 575 * @mode: the permission that the file should have 576 * @parent: a pointer to the parent dentry for this file. This should be a 577 * directory dentry if set. If this parameter is %NULL, then the 578 * file will be created in the root of the debugfs filesystem. 579 * @value: a pointer to the variable that the file should read to and write 580 * from. 581 * 582 * This function creates a file in debugfs with the given name that 583 * contains the value of the variable @value. If the @mode variable is so 584 * set, it can be read from, and written to. 585 */ 586 void debugfs_create_u16(const char *name, umode_t mode, struct dentry *parent, 587 u16 *value) 588 { 589 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u16, 590 &fops_u16_ro, &fops_u16_wo); 591 } 592 EXPORT_SYMBOL_GPL(debugfs_create_u16); 593 594 static int debugfs_u32_set(void *data, u64 val) 595 { 596 *(u32 *)data = val; 597 return 0; 598 } 599 static int debugfs_u32_get(void *data, u64 *val) 600 { 601 *val = *(u32 *)data; 602 return 0; 603 } 604 DEFINE_DEBUGFS_ATTRIBUTE(fops_u32, debugfs_u32_get, debugfs_u32_set, "%llu\n"); 605 DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_ro, debugfs_u32_get, NULL, "%llu\n"); 606 DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n"); 607 608 /** 609 * debugfs_create_u32 - create a debugfs file that is used to read and write an unsigned 32-bit value 610 * @name: a pointer to a string containing the name of the file to create. 611 * @mode: the permission that the file should have 612 * @parent: a pointer to the parent dentry for this file. This should be a 613 * directory dentry if set. If this parameter is %NULL, then the 614 * file will be created in the root of the debugfs filesystem. 615 * @value: a pointer to the variable that the file should read to and write 616 * from. 617 * 618 * This function creates a file in debugfs with the given name that 619 * contains the value of the variable @value. If the @mode variable is so 620 * set, it can be read from, and written to. 621 */ 622 void debugfs_create_u32(const char *name, umode_t mode, struct dentry *parent, 623 u32 *value) 624 { 625 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u32, 626 &fops_u32_ro, &fops_u32_wo); 627 } 628 EXPORT_SYMBOL_GPL(debugfs_create_u32); 629 630 static int debugfs_u64_set(void *data, u64 val) 631 { 632 *(u64 *)data = val; 633 return 0; 634 } 635 636 static int debugfs_u64_get(void *data, u64 *val) 637 { 638 *val = *(u64 *)data; 639 return 0; 640 } 641 DEFINE_DEBUGFS_ATTRIBUTE(fops_u64, debugfs_u64_get, debugfs_u64_set, "%llu\n"); 642 DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_ro, debugfs_u64_get, NULL, "%llu\n"); 643 DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n"); 644 645 /** 646 * debugfs_create_u64 - create a debugfs file that is used to read and write an unsigned 64-bit value 647 * @name: a pointer to a string containing the name of the file to create. 648 * @mode: the permission that the file should have 649 * @parent: a pointer to the parent dentry for this file. This should be a 650 * directory dentry if set. If this parameter is %NULL, then the 651 * file will be created in the root of the debugfs filesystem. 652 * @value: a pointer to the variable that the file should read to and write 653 * from. 654 * 655 * This function creates a file in debugfs with the given name that 656 * contains the value of the variable @value. If the @mode variable is so 657 * set, it can be read from, and written to. 658 */ 659 void debugfs_create_u64(const char *name, umode_t mode, struct dentry *parent, 660 u64 *value) 661 { 662 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_u64, 663 &fops_u64_ro, &fops_u64_wo); 664 } 665 EXPORT_SYMBOL_GPL(debugfs_create_u64); 666 667 static int debugfs_ulong_set(void *data, u64 val) 668 { 669 *(unsigned long *)data = val; 670 return 0; 671 } 672 673 static int debugfs_ulong_get(void *data, u64 *val) 674 { 675 *val = *(unsigned long *)data; 676 return 0; 677 } 678 DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong, debugfs_ulong_get, debugfs_ulong_set, 679 "%llu\n"); 680 DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_ro, debugfs_ulong_get, NULL, "%llu\n"); 681 DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n"); 682 683 /** 684 * debugfs_create_ulong - create a debugfs file that is used to read and write 685 * an unsigned long value. 686 * @name: a pointer to a string containing the name of the file to create. 687 * @mode: the permission that the file should have 688 * @parent: a pointer to the parent dentry for this file. This should be a 689 * directory dentry if set. If this parameter is %NULL, then the 690 * file will be created in the root of the debugfs filesystem. 691 * @value: a pointer to the variable that the file should read to and write 692 * from. 693 * 694 * This function creates a file in debugfs with the given name that 695 * contains the value of the variable @value. If the @mode variable is so 696 * set, it can be read from, and written to. 697 */ 698 void debugfs_create_ulong(const char *name, umode_t mode, struct dentry *parent, 699 unsigned long *value) 700 { 701 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_ulong, 702 &fops_ulong_ro, &fops_ulong_wo); 703 } 704 EXPORT_SYMBOL_GPL(debugfs_create_ulong); 705 706 DEFINE_DEBUGFS_ATTRIBUTE(fops_x8, debugfs_u8_get, debugfs_u8_set, "0x%02llx\n"); 707 DEFINE_DEBUGFS_ATTRIBUTE(fops_x8_ro, debugfs_u8_get, NULL, "0x%02llx\n"); 708 DEFINE_DEBUGFS_ATTRIBUTE(fops_x8_wo, NULL, debugfs_u8_set, "0x%02llx\n"); 709 710 DEFINE_DEBUGFS_ATTRIBUTE(fops_x16, debugfs_u16_get, debugfs_u16_set, 711 "0x%04llx\n"); 712 DEFINE_DEBUGFS_ATTRIBUTE(fops_x16_ro, debugfs_u16_get, NULL, "0x%04llx\n"); 713 DEFINE_DEBUGFS_ATTRIBUTE(fops_x16_wo, NULL, debugfs_u16_set, "0x%04llx\n"); 714 715 DEFINE_DEBUGFS_ATTRIBUTE(fops_x32, debugfs_u32_get, debugfs_u32_set, 716 "0x%08llx\n"); 717 DEFINE_DEBUGFS_ATTRIBUTE(fops_x32_ro, debugfs_u32_get, NULL, "0x%08llx\n"); 718 DEFINE_DEBUGFS_ATTRIBUTE(fops_x32_wo, NULL, debugfs_u32_set, "0x%08llx\n"); 719 720 DEFINE_DEBUGFS_ATTRIBUTE(fops_x64, debugfs_u64_get, debugfs_u64_set, 721 "0x%016llx\n"); 722 DEFINE_DEBUGFS_ATTRIBUTE(fops_x64_ro, debugfs_u64_get, NULL, "0x%016llx\n"); 723 DEFINE_DEBUGFS_ATTRIBUTE(fops_x64_wo, NULL, debugfs_u64_set, "0x%016llx\n"); 724 725 /* 726 * debugfs_create_x{8,16,32,64} - create a debugfs file that is used to read and write an unsigned {8,16,32,64}-bit value 727 * 728 * These functions are exactly the same as the above functions (but use a hex 729 * output for the decimal challenged). For details look at the above unsigned 730 * decimal functions. 731 */ 732 733 /** 734 * debugfs_create_x8 - create a debugfs file that is used to read and write an unsigned 8-bit value 735 * @name: a pointer to a string containing the name of the file to create. 736 * @mode: the permission that the file should have 737 * @parent: a pointer to the parent dentry for this file. This should be a 738 * directory dentry if set. If this parameter is %NULL, then the 739 * file will be created in the root of the debugfs filesystem. 740 * @value: a pointer to the variable that the file should read to and write 741 * from. 742 */ 743 void debugfs_create_x8(const char *name, umode_t mode, struct dentry *parent, 744 u8 *value) 745 { 746 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x8, 747 &fops_x8_ro, &fops_x8_wo); 748 } 749 EXPORT_SYMBOL_GPL(debugfs_create_x8); 750 751 /** 752 * debugfs_create_x16 - create a debugfs file that is used to read and write an unsigned 16-bit value 753 * @name: a pointer to a string containing the name of the file to create. 754 * @mode: the permission that the file should have 755 * @parent: a pointer to the parent dentry for this file. This should be a 756 * directory dentry if set. If this parameter is %NULL, then the 757 * file will be created in the root of the debugfs filesystem. 758 * @value: a pointer to the variable that the file should read to and write 759 * from. 760 */ 761 void debugfs_create_x16(const char *name, umode_t mode, struct dentry *parent, 762 u16 *value) 763 { 764 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x16, 765 &fops_x16_ro, &fops_x16_wo); 766 } 767 EXPORT_SYMBOL_GPL(debugfs_create_x16); 768 769 /** 770 * debugfs_create_x32 - create a debugfs file that is used to read and write an unsigned 32-bit value 771 * @name: a pointer to a string containing the name of the file to create. 772 * @mode: the permission that the file should have 773 * @parent: a pointer to the parent dentry for this file. This should be a 774 * directory dentry if set. If this parameter is %NULL, then the 775 * file will be created in the root of the debugfs filesystem. 776 * @value: a pointer to the variable that the file should read to and write 777 * from. 778 */ 779 void debugfs_create_x32(const char *name, umode_t mode, struct dentry *parent, 780 u32 *value) 781 { 782 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x32, 783 &fops_x32_ro, &fops_x32_wo); 784 } 785 EXPORT_SYMBOL_GPL(debugfs_create_x32); 786 787 /** 788 * debugfs_create_x64 - create a debugfs file that is used to read and write an unsigned 64-bit value 789 * @name: a pointer to a string containing the name of the file to create. 790 * @mode: the permission that the file should have 791 * @parent: a pointer to the parent dentry for this file. This should be a 792 * directory dentry if set. If this parameter is %NULL, then the 793 * file will be created in the root of the debugfs filesystem. 794 * @value: a pointer to the variable that the file should read to and write 795 * from. 796 */ 797 void debugfs_create_x64(const char *name, umode_t mode, struct dentry *parent, 798 u64 *value) 799 { 800 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_x64, 801 &fops_x64_ro, &fops_x64_wo); 802 } 803 EXPORT_SYMBOL_GPL(debugfs_create_x64); 804 805 806 static int debugfs_size_t_set(void *data, u64 val) 807 { 808 *(size_t *)data = val; 809 return 0; 810 } 811 static int debugfs_size_t_get(void *data, u64 *val) 812 { 813 *val = *(size_t *)data; 814 return 0; 815 } 816 DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t, debugfs_size_t_get, debugfs_size_t_set, 817 "%llu\n"); /* %llu and %zu are more or less the same */ 818 DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t_ro, debugfs_size_t_get, NULL, "%llu\n"); 819 DEFINE_DEBUGFS_ATTRIBUTE(fops_size_t_wo, NULL, debugfs_size_t_set, "%llu\n"); 820 821 /** 822 * debugfs_create_size_t - create a debugfs file that is used to read and write an size_t value 823 * @name: a pointer to a string containing the name of the file to create. 824 * @mode: the permission that the file should have 825 * @parent: a pointer to the parent dentry for this file. This should be a 826 * directory dentry if set. If this parameter is %NULL, then the 827 * file will be created in the root of the debugfs filesystem. 828 * @value: a pointer to the variable that the file should read to and write 829 * from. 830 */ 831 void debugfs_create_size_t(const char *name, umode_t mode, 832 struct dentry *parent, size_t *value) 833 { 834 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_size_t, 835 &fops_size_t_ro, &fops_size_t_wo); 836 } 837 EXPORT_SYMBOL_GPL(debugfs_create_size_t); 838 839 static int debugfs_atomic_t_set(void *data, u64 val) 840 { 841 atomic_set((atomic_t *)data, val); 842 return 0; 843 } 844 static int debugfs_atomic_t_get(void *data, u64 *val) 845 { 846 *val = atomic_read((atomic_t *)data); 847 return 0; 848 } 849 DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t, debugfs_atomic_t_get, 850 debugfs_atomic_t_set, "%lld\n"); 851 DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t_ro, debugfs_atomic_t_get, NULL, 852 "%lld\n"); 853 DEFINE_DEBUGFS_ATTRIBUTE_SIGNED(fops_atomic_t_wo, NULL, debugfs_atomic_t_set, 854 "%lld\n"); 855 856 /** 857 * debugfs_create_atomic_t - create a debugfs file that is used to read and 858 * write an atomic_t value 859 * @name: a pointer to a string containing the name of the file to create. 860 * @mode: the permission that the file should have 861 * @parent: a pointer to the parent dentry for this file. This should be a 862 * directory dentry if set. If this parameter is %NULL, then the 863 * file will be created in the root of the debugfs filesystem. 864 * @value: a pointer to the variable that the file should read to and write 865 * from. 866 */ 867 void debugfs_create_atomic_t(const char *name, umode_t mode, 868 struct dentry *parent, atomic_t *value) 869 { 870 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_atomic_t, 871 &fops_atomic_t_ro, &fops_atomic_t_wo); 872 } 873 EXPORT_SYMBOL_GPL(debugfs_create_atomic_t); 874 875 ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf, 876 size_t count, loff_t *ppos) 877 { 878 char buf[2]; 879 bool val; 880 int r; 881 struct dentry *dentry = F_DENTRY(file); 882 883 r = debugfs_file_get(dentry); 884 if (unlikely(r)) 885 return r; 886 val = *(bool *)file->private_data; 887 debugfs_file_put(dentry); 888 889 if (val) 890 buf[0] = 'Y'; 891 else 892 buf[0] = 'N'; 893 buf[1] = '\n'; 894 return simple_read_from_buffer(user_buf, count, ppos, buf, 2); 895 } 896 EXPORT_SYMBOL_GPL(debugfs_read_file_bool); 897 898 ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf, 899 size_t count, loff_t *ppos) 900 { 901 bool bv; 902 int r; 903 bool *val = file->private_data; 904 struct dentry *dentry = F_DENTRY(file); 905 906 r = kstrtobool_from_user(user_buf, count, &bv); 907 if (!r) { 908 r = debugfs_file_get(dentry); 909 if (unlikely(r)) 910 return r; 911 *val = bv; 912 debugfs_file_put(dentry); 913 } 914 915 return count; 916 } 917 EXPORT_SYMBOL_GPL(debugfs_write_file_bool); 918 919 static const struct file_operations fops_bool = { 920 .read = debugfs_read_file_bool, 921 .write = debugfs_write_file_bool, 922 .open = simple_open, 923 .llseek = default_llseek, 924 }; 925 926 static const struct file_operations fops_bool_ro = { 927 .read = debugfs_read_file_bool, 928 .open = simple_open, 929 .llseek = default_llseek, 930 }; 931 932 static const struct file_operations fops_bool_wo = { 933 .write = debugfs_write_file_bool, 934 .open = simple_open, 935 .llseek = default_llseek, 936 }; 937 938 /** 939 * debugfs_create_bool - create a debugfs file that is used to read and write a boolean value 940 * @name: a pointer to a string containing the name of the file to create. 941 * @mode: the permission that the file should have 942 * @parent: a pointer to the parent dentry for this file. This should be a 943 * directory dentry if set. If this parameter is %NULL, then the 944 * file will be created in the root of the debugfs filesystem. 945 * @value: a pointer to the variable that the file should read to and write 946 * from. 947 * 948 * This function creates a file in debugfs with the given name that 949 * contains the value of the variable @value. If the @mode variable is so 950 * set, it can be read from, and written to. 951 */ 952 void debugfs_create_bool(const char *name, umode_t mode, struct dentry *parent, 953 bool *value) 954 { 955 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_bool, 956 &fops_bool_ro, &fops_bool_wo); 957 } 958 EXPORT_SYMBOL_GPL(debugfs_create_bool); 959 960 ssize_t debugfs_read_file_str(struct file *file, char __user *user_buf, 961 size_t count, loff_t *ppos) 962 { 963 struct dentry *dentry = F_DENTRY(file); 964 char *str, *copy = NULL; 965 int copy_len, len; 966 ssize_t ret; 967 968 ret = debugfs_file_get(dentry); 969 if (unlikely(ret)) 970 return ret; 971 972 str = *(char **)file->private_data; 973 len = strlen(str) + 1; 974 copy = kmalloc(len, GFP_KERNEL); 975 if (!copy) { 976 debugfs_file_put(dentry); 977 return -ENOMEM; 978 } 979 980 copy_len = strscpy(copy, str, len); 981 debugfs_file_put(dentry); 982 if (copy_len < 0) { 983 kfree(copy); 984 return copy_len; 985 } 986 987 copy[copy_len] = '\n'; 988 989 ret = simple_read_from_buffer(user_buf, count, ppos, copy, len); 990 kfree(copy); 991 992 return ret; 993 } 994 EXPORT_SYMBOL_GPL(debugfs_create_str); 995 996 static ssize_t debugfs_write_file_str(struct file *file, const char __user *user_buf, 997 size_t count, loff_t *ppos) 998 { 999 struct dentry *dentry = F_DENTRY(file); 1000 char *old, *new = NULL; 1001 int pos = *ppos; 1002 int r; 1003 1004 r = debugfs_file_get(dentry); 1005 if (unlikely(r)) 1006 return r; 1007 1008 old = *(char **)file->private_data; 1009 1010 /* only allow strict concatenation */ 1011 r = -EINVAL; 1012 if (pos && pos != strlen(old)) 1013 goto error; 1014 1015 r = -E2BIG; 1016 if (pos + count + 1 > PAGE_SIZE) 1017 goto error; 1018 1019 r = -ENOMEM; 1020 new = kmalloc(pos + count + 1, GFP_KERNEL); 1021 if (!new) 1022 goto error; 1023 1024 if (pos) 1025 memcpy(new, old, pos); 1026 1027 r = -EFAULT; 1028 if (copy_from_user(new + pos, user_buf, count)) 1029 goto error; 1030 1031 new[pos + count] = '\0'; 1032 strim(new); 1033 1034 rcu_assign_pointer(*(char __rcu **)file->private_data, new); 1035 synchronize_rcu(); 1036 kfree(old); 1037 1038 debugfs_file_put(dentry); 1039 return count; 1040 1041 error: 1042 kfree(new); 1043 debugfs_file_put(dentry); 1044 return r; 1045 } 1046 1047 static const struct file_operations fops_str = { 1048 .read = debugfs_read_file_str, 1049 .write = debugfs_write_file_str, 1050 .open = simple_open, 1051 .llseek = default_llseek, 1052 }; 1053 1054 static const struct file_operations fops_str_ro = { 1055 .read = debugfs_read_file_str, 1056 .open = simple_open, 1057 .llseek = default_llseek, 1058 }; 1059 1060 static const struct file_operations fops_str_wo = { 1061 .write = debugfs_write_file_str, 1062 .open = simple_open, 1063 .llseek = default_llseek, 1064 }; 1065 1066 /** 1067 * debugfs_create_str - create a debugfs file that is used to read and write a string value 1068 * @name: a pointer to a string containing the name of the file to create. 1069 * @mode: the permission that the file should have 1070 * @parent: a pointer to the parent dentry for this file. This should be a 1071 * directory dentry if set. If this parameter is %NULL, then the 1072 * file will be created in the root of the debugfs filesystem. 1073 * @value: a pointer to the variable that the file should read to and write 1074 * from. 1075 * 1076 * This function creates a file in debugfs with the given name that 1077 * contains the value of the variable @value. If the @mode variable is so 1078 * set, it can be read from, and written to. 1079 */ 1080 void debugfs_create_str(const char *name, umode_t mode, 1081 struct dentry *parent, char **value) 1082 { 1083 debugfs_create_mode_unsafe(name, mode, parent, value, &fops_str, 1084 &fops_str_ro, &fops_str_wo); 1085 } 1086 1087 static ssize_t read_file_blob(struct file *file, char __user *user_buf, 1088 size_t count, loff_t *ppos) 1089 { 1090 struct debugfs_blob_wrapper *blob = file->private_data; 1091 struct dentry *dentry = F_DENTRY(file); 1092 ssize_t r; 1093 1094 r = debugfs_file_get(dentry); 1095 if (unlikely(r)) 1096 return r; 1097 r = simple_read_from_buffer(user_buf, count, ppos, blob->data, 1098 blob->size); 1099 debugfs_file_put(dentry); 1100 return r; 1101 } 1102 1103 static ssize_t write_file_blob(struct file *file, const char __user *user_buf, 1104 size_t count, loff_t *ppos) 1105 { 1106 struct debugfs_blob_wrapper *blob = file->private_data; 1107 struct dentry *dentry = F_DENTRY(file); 1108 ssize_t r; 1109 1110 r = debugfs_file_get(dentry); 1111 if (unlikely(r)) 1112 return r; 1113 r = simple_write_to_buffer(blob->data, blob->size, ppos, user_buf, 1114 count); 1115 1116 debugfs_file_put(dentry); 1117 return r; 1118 } 1119 1120 static const struct file_operations fops_blob = { 1121 .read = read_file_blob, 1122 .write = write_file_blob, 1123 .open = simple_open, 1124 .llseek = default_llseek, 1125 }; 1126 1127 /** 1128 * debugfs_create_blob - create a debugfs file that is used to read and write 1129 * a binary blob 1130 * @name: a pointer to a string containing the name of the file to create. 1131 * @mode: the permission that the file should have 1132 * @parent: a pointer to the parent dentry for this file. This should be a 1133 * directory dentry if set. If this parameter is %NULL, then the 1134 * file will be created in the root of the debugfs filesystem. 1135 * @blob: a pointer to a struct debugfs_blob_wrapper which contains a pointer 1136 * to the blob data and the size of the data. 1137 * 1138 * This function creates a file in debugfs with the given name that exports 1139 * @blob->data as a binary blob. If the @mode variable is so set it can be 1140 * read from and written to. 1141 * 1142 * This function will return a pointer to a dentry if it succeeds. This 1143 * pointer must be passed to the debugfs_remove() function when the file is 1144 * to be removed (no automatic cleanup happens if your module is unloaded, 1145 * you are responsible here.) If an error occurs, ERR_PTR(-ERROR) will be 1146 * returned. 1147 * 1148 * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will 1149 * be returned. 1150 */ 1151 struct dentry *debugfs_create_blob(const char *name, umode_t mode, 1152 struct dentry *parent, 1153 struct debugfs_blob_wrapper *blob) 1154 { 1155 return debugfs_create_file_unsafe(name, mode & 0644, parent, blob, &fops_blob); 1156 } 1157 EXPORT_SYMBOL_GPL(debugfs_create_blob); 1158 1159 static size_t u32_format_array(char *buf, size_t bufsize, 1160 u32 *array, int array_size) 1161 { 1162 size_t ret = 0; 1163 1164 while (--array_size >= 0) { 1165 size_t len; 1166 char term = array_size ? ' ' : '\n'; 1167 1168 len = snprintf(buf, bufsize, "%u%c", *array++, term); 1169 ret += len; 1170 1171 buf += len; 1172 bufsize -= len; 1173 } 1174 return ret; 1175 } 1176 1177 static int u32_array_open(struct inode *inode, struct file *file) 1178 { 1179 struct debugfs_u32_array *data = inode->i_private; 1180 int size, elements = data->n_elements; 1181 char *buf; 1182 1183 /* 1184 * Max size: 1185 * - 10 digits + ' '/'\n' = 11 bytes per number 1186 * - terminating NUL character 1187 */ 1188 size = elements*11; 1189 buf = kmalloc(size+1, GFP_KERNEL); 1190 if (!buf) 1191 return -ENOMEM; 1192 buf[size] = 0; 1193 1194 file->private_data = buf; 1195 u32_format_array(buf, size, data->array, data->n_elements); 1196 1197 return nonseekable_open(inode, file); 1198 } 1199 1200 static ssize_t u32_array_read(struct file *file, char __user *buf, size_t len, 1201 loff_t *ppos) 1202 { 1203 size_t size = strlen(file->private_data); 1204 1205 return simple_read_from_buffer(buf, len, ppos, 1206 file->private_data, size); 1207 } 1208 1209 static int u32_array_release(struct inode *inode, struct file *file) 1210 { 1211 kfree(file->private_data); 1212 1213 return 0; 1214 } 1215 1216 static const struct file_operations u32_array_fops = { 1217 .owner = THIS_MODULE, 1218 .open = u32_array_open, 1219 .release = u32_array_release, 1220 .read = u32_array_read, 1221 .llseek = no_llseek, 1222 }; 1223 1224 /** 1225 * debugfs_create_u32_array - create a debugfs file that is used to read u32 1226 * array. 1227 * @name: a pointer to a string containing the name of the file to create. 1228 * @mode: the permission that the file should have. 1229 * @parent: a pointer to the parent dentry for this file. This should be a 1230 * directory dentry if set. If this parameter is %NULL, then the 1231 * file will be created in the root of the debugfs filesystem. 1232 * @array: wrapper struct containing data pointer and size of the array. 1233 * 1234 * This function creates a file in debugfs with the given name that exports 1235 * @array as data. If the @mode variable is so set it can be read from. 1236 * Writing is not supported. Seek within the file is also not supported. 1237 * Once array is created its size can not be changed. 1238 */ 1239 void debugfs_create_u32_array(const char *name, umode_t mode, 1240 struct dentry *parent, 1241 struct debugfs_u32_array *array) 1242 { 1243 debugfs_create_file_unsafe(name, mode, parent, array, &u32_array_fops); 1244 } 1245 EXPORT_SYMBOL_GPL(debugfs_create_u32_array); 1246 1247 #ifdef CONFIG_HAS_IOMEM 1248 1249 /* 1250 * The regset32 stuff is used to print 32-bit registers using the 1251 * seq_file utilities. We offer printing a register set in an already-opened 1252 * sequential file or create a debugfs file that only prints a regset32. 1253 */ 1254 1255 /** 1256 * debugfs_print_regs32 - use seq_print to describe a set of registers 1257 * @s: the seq_file structure being used to generate output 1258 * @regs: an array if struct debugfs_reg32 structures 1259 * @nregs: the length of the above array 1260 * @base: the base address to be used in reading the registers 1261 * @prefix: a string to be prefixed to every output line 1262 * 1263 * This function outputs a text block describing the current values of 1264 * some 32-bit hardware registers. It is meant to be used within debugfs 1265 * files based on seq_file that need to show registers, intermixed with other 1266 * information. The prefix argument may be used to specify a leading string, 1267 * because some peripherals have several blocks of identical registers, 1268 * for example configuration of dma channels 1269 */ 1270 void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, 1271 int nregs, void __iomem *base, char *prefix) 1272 { 1273 int i; 1274 1275 for (i = 0; i < nregs; i++, regs++) { 1276 if (prefix) 1277 seq_printf(s, "%s", prefix); 1278 seq_printf(s, "%s = 0x%08x\n", regs->name, 1279 readl(base + regs->offset)); 1280 if (seq_has_overflowed(s)) 1281 break; 1282 } 1283 } 1284 EXPORT_SYMBOL_GPL(debugfs_print_regs32); 1285 1286 static int debugfs_regset32_show(struct seq_file *s, void *data) 1287 { 1288 struct debugfs_regset32 *regset = s->private; 1289 1290 if (regset->dev) 1291 pm_runtime_get_sync(regset->dev); 1292 1293 debugfs_print_regs32(s, regset->regs, regset->nregs, regset->base, ""); 1294 1295 if (regset->dev) 1296 pm_runtime_put(regset->dev); 1297 1298 return 0; 1299 } 1300 1301 DEFINE_SHOW_ATTRIBUTE(debugfs_regset32); 1302 1303 /** 1304 * debugfs_create_regset32 - create a debugfs file that returns register values 1305 * @name: a pointer to a string containing the name of the file to create. 1306 * @mode: the permission that the file should have 1307 * @parent: a pointer to the parent dentry for this file. This should be a 1308 * directory dentry if set. If this parameter is %NULL, then the 1309 * file will be created in the root of the debugfs filesystem. 1310 * @regset: a pointer to a struct debugfs_regset32, which contains a pointer 1311 * to an array of register definitions, the array size and the base 1312 * address where the register bank is to be found. 1313 * 1314 * This function creates a file in debugfs with the given name that reports 1315 * the names and values of a set of 32-bit registers. If the @mode variable 1316 * is so set it can be read from. Writing is not supported. 1317 */ 1318 void debugfs_create_regset32(const char *name, umode_t mode, 1319 struct dentry *parent, 1320 struct debugfs_regset32 *regset) 1321 { 1322 debugfs_create_file(name, mode, parent, regset, &debugfs_regset32_fops); 1323 } 1324 EXPORT_SYMBOL_GPL(debugfs_create_regset32); 1325 1326 #endif /* CONFIG_HAS_IOMEM */ 1327 1328 struct debugfs_devm_entry { 1329 int (*read)(struct seq_file *seq, void *data); 1330 struct device *dev; 1331 }; 1332 1333 static int debugfs_devm_entry_open(struct inode *inode, struct file *f) 1334 { 1335 struct debugfs_devm_entry *entry = inode->i_private; 1336 1337 return single_open(f, entry->read, entry->dev); 1338 } 1339 1340 static const struct file_operations debugfs_devm_entry_ops = { 1341 .owner = THIS_MODULE, 1342 .open = debugfs_devm_entry_open, 1343 .release = single_release, 1344 .read = seq_read, 1345 .llseek = seq_lseek 1346 }; 1347 1348 /** 1349 * debugfs_create_devm_seqfile - create a debugfs file that is bound to device. 1350 * 1351 * @dev: device related to this debugfs file. 1352 * @name: name of the debugfs file. 1353 * @parent: a pointer to the parent dentry for this file. This should be a 1354 * directory dentry if set. If this parameter is %NULL, then the 1355 * file will be created in the root of the debugfs filesystem. 1356 * @read_fn: function pointer called to print the seq_file content. 1357 */ 1358 void debugfs_create_devm_seqfile(struct device *dev, const char *name, 1359 struct dentry *parent, 1360 int (*read_fn)(struct seq_file *s, void *data)) 1361 { 1362 struct debugfs_devm_entry *entry; 1363 1364 if (IS_ERR(parent)) 1365 return; 1366 1367 entry = devm_kzalloc(dev, sizeof(*entry), GFP_KERNEL); 1368 if (!entry) 1369 return; 1370 1371 entry->read = read_fn; 1372 entry->dev = dev; 1373 1374 debugfs_create_file(name, S_IRUGO, parent, entry, 1375 &debugfs_devm_entry_ops); 1376 } 1377 EXPORT_SYMBOL_GPL(debugfs_create_devm_seqfile); 1378
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.