Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 16383
b: refs/heads/master
c: 67df197
h: refs/heads/master
i:
  16381: 8dfeca6
  16379: a6d0973
  16375: 2512522
  16367: 2d5e057
  16351: eb75807
  16319: bd25bb0
  16255: b69fd24
  16127: b6a4d61
  15871: 96b0974
  15359: dfd735e
  14335: 17c1129
  12287: bd96c62
  8191: 08f97ba
v: v3
  • Loading branch information
Arjan van de Ven authored and Linus Torvalds committed Jan 6, 2006
1 parent c2dfb0a commit 44c5429
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c728252c7a072628bd3932ff87943d1e12423359
refs/heads/master: 67df197b1a07944c2e0e40ded3d4fd07d108e110
10 changes: 10 additions & 0 deletions trunk/arch/x86_64/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ config INIT_DEBUG
Fill __init and __initdata at the end of boot. This helps debugging
illegal uses of __init and __initdata after initialization.

config DEBUG_RODATA
bool "Write protect kernel read-only data structures"
depends on DEBUG_KERNEL
help
Mark the kernel read-only data as write-protected in the pagetables,
in order to catch accidental (and incorrect) writes to such const data.
This option may have a slight performance impact because a portion
of the kernel code won't be covered by a 2MB TLB anymore.
If in doubt, say "N".

config IOMMU_DEBUG
depends on GART_IOMMU && DEBUG_KERNEL
bool "Enable IOMMU debugging"
Expand Down
23 changes: 23 additions & 0 deletions trunk/arch/x86_64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,29 @@ void free_initmem(void)
printk ("Freeing unused kernel memory: %luk freed\n", (__init_end - __init_begin) >> 10);
}

#ifdef CONFIG_DEBUG_RODATA

extern char __start_rodata, __end_rodata;
void mark_rodata_ro(void)
{
unsigned long addr = (unsigned long)&__start_rodata;

for (; addr < (unsigned long)&__end_rodata; addr += PAGE_SIZE)
change_page_attr_addr(addr, 1, PAGE_KERNEL_RO);

printk ("Write protecting the kernel read-only data: %luk\n",
(&__end_rodata - &__start_rodata) >> 10);

/*
* change_page_attr_addr() requires a global_flush_tlb() call after it.
* We do this after the printk so that if something went wrong in the
* change, the printk gets out at least to give a better debug hint
* of who is the culprit.
*/
global_flush_tlb();
}
#endif

#ifdef CONFIG_BLK_DEV_INITRD
void free_initrd_mem(unsigned long start, unsigned long end)
{
Expand Down
4 changes: 4 additions & 0 deletions trunk/include/asm-x86_64/cacheflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,8 @@ void global_flush_tlb(void);
int change_page_attr(struct page *page, int numpages, pgprot_t prot);
int change_page_attr_addr(unsigned long addr, int numpages, pgprot_t prot);

#ifdef CONFIG_DEBUG_RODATA
void mark_rodata_ro(void);
#endif

#endif /* _X8664_CACHEFLUSH_H */

0 comments on commit 44c5429

Please sign in to comment.