Merge branch 'akpm' (patches from Andrew)
Merge misc updates from Andrew Morton: - large KASAN update to use arm's "software tag-based mode" - a few misc things - sh updates - ocfs2 updates - just about all of MM * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (167 commits) kernel/fork.c: mark 'stack_vm_area' with __maybe_unused memcg, oom: notify on oom killer invocation from the charge path mm, swap: fix swapoff with KSM pages include/linux/gfp.h: fix typo mm/hmm: fix memremap.h, move dev_page_fault_t callback to hmm hugetlbfs: Use i_mmap_rwsem to fix page fault/truncate race hugetlbfs: use i_mmap_rwsem for more pmd sharing synchronization memory_hotplug: add missing newlines to debugging output mm: remove __hugepage_set_anon_rmap() include/linux/vmstat.h: remove unused page state adjustment macro mm/page_alloc.c: allow error injection mm: migrate: drop unused argument of migrate_page_move_mapping() blkdev: avoid migration stalls for blkdev pages mm: migrate: provide buffer_migrate_page_norefs() mm: migrate: move migrate_page_lock_buffers() mm: migrate: lock buffers before migrate_page_move_mapping() mm: migration: factor out code to compute expected number of page references mm, page_alloc: enable pcpu_drain with zone capability kmemleak: add config to select auto scan mm/page_alloc.c: don't call kasan_free_pages() at deferred mem init ...
This commit is contained in:
commit
f346b0becb
|
@ -98,3 +98,35 @@ Description:
|
||||||
The backing_dev file is read-write and set up backing
|
The backing_dev file is read-write and set up backing
|
||||||
device for zram to write incompressible pages.
|
device for zram to write incompressible pages.
|
||||||
For using, user should enable CONFIG_ZRAM_WRITEBACK.
|
For using, user should enable CONFIG_ZRAM_WRITEBACK.
|
||||||
|
|
||||||
|
What: /sys/block/zram<id>/idle
|
||||||
|
Date: November 2018
|
||||||
|
Contact: Minchan Kim <minchan@kernel.org>
|
||||||
|
Description:
|
||||||
|
idle file is write-only and mark zram slot as idle.
|
||||||
|
If system has mounted debugfs, user can see which slots
|
||||||
|
are idle via /sys/kernel/debug/zram/zram<id>/block_state
|
||||||
|
|
||||||
|
What: /sys/block/zram<id>/writeback
|
||||||
|
Date: November 2018
|
||||||
|
Contact: Minchan Kim <minchan@kernel.org>
|
||||||
|
Description:
|
||||||
|
The writeback file is write-only and trigger idle and/or
|
||||||
|
huge page writeback to backing device.
|
||||||
|
|
||||||
|
What: /sys/block/zram<id>/bd_stat
|
||||||
|
Date: November 2018
|
||||||
|
Contact: Minchan Kim <minchan@kernel.org>
|
||||||
|
Description:
|
||||||
|
The bd_stat file is read-only and represents backing device's
|
||||||
|
statistics (bd_count, bd_reads, bd_writes) in a format
|
||||||
|
similar to block layer statistics file format.
|
||||||
|
|
||||||
|
What: /sys/block/zram<id>/writeback_limit
|
||||||
|
Date: November 2018
|
||||||
|
Contact: Minchan Kim <minchan@kernel.org>
|
||||||
|
Description:
|
||||||
|
The writeback_limit file is read-write and specifies the maximum
|
||||||
|
amount of writeback ZRAM can do. The limit could be changed
|
||||||
|
in run time and "0" means disable the limit.
|
||||||
|
No limit is the initial state.
|
||||||
|
|
|
@ -164,11 +164,14 @@ reset WO trigger device reset
|
||||||
mem_used_max WO reset the `mem_used_max' counter (see later)
|
mem_used_max WO reset the `mem_used_max' counter (see later)
|
||||||
mem_limit WO specifies the maximum amount of memory ZRAM can use
|
mem_limit WO specifies the maximum amount of memory ZRAM can use
|
||||||
to store the compressed data
|
to store the compressed data
|
||||||
|
writeback_limit WO specifies the maximum amount of write IO zram can
|
||||||
|
write out to backing device as 4KB unit
|
||||||
max_comp_streams RW the number of possible concurrent compress operations
|
max_comp_streams RW the number of possible concurrent compress operations
|
||||||
comp_algorithm RW show and change the compression algorithm
|
comp_algorithm RW show and change the compression algorithm
|
||||||
compact WO trigger memory compaction
|
compact WO trigger memory compaction
|
||||||
debug_stat RO this file is used for zram debugging purposes
|
debug_stat RO this file is used for zram debugging purposes
|
||||||
backing_dev RW set up backend storage for zram to write out
|
backing_dev RW set up backend storage for zram to write out
|
||||||
|
idle WO mark allocated slot as idle
|
||||||
|
|
||||||
|
|
||||||
User space is advised to use the following files to read the device statistics.
|
User space is advised to use the following files to read the device statistics.
|
||||||
|
@ -220,6 +223,17 @@ line of text and contains the following stats separated by whitespace:
|
||||||
pages_compacted the number of pages freed during compaction
|
pages_compacted the number of pages freed during compaction
|
||||||
huge_pages the number of incompressible pages
|
huge_pages the number of incompressible pages
|
||||||
|
|
||||||
|
File /sys/block/zram<id>/bd_stat
|
||||||
|
|
||||||
|
The stat file represents device's backing device statistics. It consists of
|
||||||
|
a single line of text and contains the following stats separated by whitespace:
|
||||||
|
bd_count size of data written in backing device.
|
||||||
|
Unit: 4K bytes
|
||||||
|
bd_reads the number of reads from backing device
|
||||||
|
Unit: 4K bytes
|
||||||
|
bd_writes the number of writes to backing device
|
||||||
|
Unit: 4K bytes
|
||||||
|
|
||||||
9) Deactivate:
|
9) Deactivate:
|
||||||
swapoff /dev/zram0
|
swapoff /dev/zram0
|
||||||
umount /dev/zram1
|
umount /dev/zram1
|
||||||
|
@ -237,11 +251,60 @@ line of text and contains the following stats separated by whitespace:
|
||||||
|
|
||||||
= writeback
|
= writeback
|
||||||
|
|
||||||
With incompressible pages, there is no memory saving with zram.
|
With CONFIG_ZRAM_WRITEBACK, zram can write idle/incompressible page
|
||||||
Instead, with CONFIG_ZRAM_WRITEBACK, zram can write incompressible page
|
|
||||||
to backing storage rather than keeping it in memory.
|
to backing storage rather than keeping it in memory.
|
||||||
User should set up backing device via /sys/block/zramX/backing_dev
|
To use the feature, admin should set up backing device via
|
||||||
before disksize setting.
|
|
||||||
|
"echo /dev/sda5 > /sys/block/zramX/backing_dev"
|
||||||
|
|
||||||
|
before disksize setting. It supports only partition at this moment.
|
||||||
|
If admin want to use incompressible page writeback, they could do via
|
||||||
|
|
||||||
|
"echo huge > /sys/block/zramX/write"
|
||||||
|
|
||||||
|
To use idle page writeback, first, user need to declare zram pages
|
||||||
|
as idle.
|
||||||
|
|
||||||
|
"echo all > /sys/block/zramX/idle"
|
||||||
|
|
||||||
|
From now on, any pages on zram are idle pages. The idle mark
|
||||||
|
will be removed until someone request access of the block.
|
||||||
|
IOW, unless there is access request, those pages are still idle pages.
|
||||||
|
|
||||||
|
Admin can request writeback of those idle pages at right timing via
|
||||||
|
|
||||||
|
"echo idle > /sys/block/zramX/writeback"
|
||||||
|
|
||||||
|
With the command, zram writeback idle pages from memory to the storage.
|
||||||
|
|
||||||
|
If there are lots of write IO with flash device, potentially, it has
|
||||||
|
flash wearout problem so that admin needs to design write limitation
|
||||||
|
to guarantee storage health for entire product life.
|
||||||
|
To overcome the concern, zram supports "writeback_limit".
|
||||||
|
The "writeback_limit"'s default value is 0 so that it doesn't limit
|
||||||
|
any writeback. If admin want to measure writeback count in a certain
|
||||||
|
period, he could know it via /sys/block/zram0/bd_stat's 3rd column.
|
||||||
|
|
||||||
|
If admin want to limit writeback as per-day 400M, he could do it
|
||||||
|
like below.
|
||||||
|
|
||||||
|
MB_SHIFT=20
|
||||||
|
4K_SHIFT=12
|
||||||
|
echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
|
||||||
|
/sys/block/zram0/writeback_limit.
|
||||||
|
|
||||||
|
If admin want to allow further write again, he could do it like below
|
||||||
|
|
||||||
|
echo 0 > /sys/block/zram0/writeback_limit
|
||||||
|
|
||||||
|
If admin want to see remaining writeback budget since he set,
|
||||||
|
|
||||||
|
cat /sys/block/zram0/writeback_limit
|
||||||
|
|
||||||
|
The writeback_limit count will reset whenever you reset zram(e.g.,
|
||||||
|
system reboot, echo 1 > /sys/block/zramX/reset) so keeping how many of
|
||||||
|
writeback happened until you reset the zram to allocate extra writeback
|
||||||
|
budget in next setting is user's job.
|
||||||
|
|
||||||
= memory tracking
|
= memory tracking
|
||||||
|
|
||||||
|
@ -251,16 +314,17 @@ pages of the process with*pagemap.
|
||||||
If you enable the feature, you could see block state via
|
If you enable the feature, you could see block state via
|
||||||
/sys/kernel/debug/zram/zram0/block_state". The output is as follows,
|
/sys/kernel/debug/zram/zram0/block_state". The output is as follows,
|
||||||
|
|
||||||
300 75.033841 .wh
|
300 75.033841 .wh.
|
||||||
301 63.806904 s..
|
301 63.806904 s...
|
||||||
302 63.806919 ..h
|
302 63.806919 ..hi
|
||||||
|
|
||||||
First column is zram's block index.
|
First column is zram's block index.
|
||||||
Second column is access time since the system was booted
|
Second column is access time since the system was booted
|
||||||
Third column is state of the block.
|
Third column is state of the block.
|
||||||
(s: same page
|
(s: same page
|
||||||
w: written page to backing store
|
w: written page to backing store
|
||||||
h: huge page)
|
h: huge page
|
||||||
|
i: idle page)
|
||||||
|
|
||||||
First line of above example says 300th block is accessed at 75.033841sec
|
First line of above example says 300th block is accessed at 75.033841sec
|
||||||
and the block's state is huge so it is written back to the backing
|
and the block's state is huge so it is written back to the backing
|
||||||
|
|
|
@ -4,15 +4,25 @@ The Kernel Address Sanitizer (KASAN)
|
||||||
Overview
|
Overview
|
||||||
--------
|
--------
|
||||||
|
|
||||||
KernelAddressSANitizer (KASAN) is a dynamic memory error detector. It provides
|
KernelAddressSANitizer (KASAN) is a dynamic memory error detector designed to
|
||||||
a fast and comprehensive solution for finding use-after-free and out-of-bounds
|
find out-of-bound and use-after-free bugs. KASAN has two modes: generic KASAN
|
||||||
bugs.
|
(similar to userspace ASan) and software tag-based KASAN (similar to userspace
|
||||||
|
HWASan).
|
||||||
|
|
||||||
KASAN uses compile-time instrumentation for checking every memory access,
|
KASAN uses compile-time instrumentation to insert validity checks before every
|
||||||
therefore you will need a GCC version 4.9.2 or later. GCC 5.0 or later is
|
memory access, and therefore requires a compiler version that supports that.
|
||||||
required for detection of out-of-bounds accesses to stack or global variables.
|
|
||||||
|
|
||||||
Currently KASAN is supported only for the x86_64 and arm64 architectures.
|
Generic KASAN is supported in both GCC and Clang. With GCC it requires version
|
||||||
|
4.9.2 or later for basic support and version 5.0 or later for detection of
|
||||||
|
out-of-bounds accesses for stack and global variables and for inline
|
||||||
|
instrumentation mode (see the Usage section). With Clang it requires version
|
||||||
|
7.0.0 or later and it doesn't support detection of out-of-bounds accesses for
|
||||||
|
global variables yet.
|
||||||
|
|
||||||
|
Tag-based KASAN is only supported in Clang and requires version 7.0.0 or later.
|
||||||
|
|
||||||
|
Currently generic KASAN is supported for the x86_64, arm64, xtensa and s390
|
||||||
|
architectures, and tag-based KASAN is supported only for arm64.
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
@ -21,12 +31,14 @@ To enable KASAN configure kernel with::
|
||||||
|
|
||||||
CONFIG_KASAN = y
|
CONFIG_KASAN = y
|
||||||
|
|
||||||
and choose between CONFIG_KASAN_OUTLINE and CONFIG_KASAN_INLINE. Outline and
|
and choose between CONFIG_KASAN_GENERIC (to enable generic KASAN) and
|
||||||
inline are compiler instrumentation types. The former produces smaller binary
|
CONFIG_KASAN_SW_TAGS (to enable software tag-based KASAN).
|
||||||
the latter is 1.1 - 2 times faster. Inline instrumentation requires a GCC
|
|
||||||
version 5.0 or later.
|
|
||||||
|
|
||||||
KASAN works with both SLUB and SLAB memory allocators.
|
You also need to choose between CONFIG_KASAN_OUTLINE and CONFIG_KASAN_INLINE.
|
||||||
|
Outline and inline are compiler instrumentation types. The former produces
|
||||||
|
smaller binary while the latter is 1.1 - 2 times faster.
|
||||||
|
|
||||||
|
Both KASAN modes work with both SLUB and SLAB memory allocators.
|
||||||
For better bug detection and nicer reporting, enable CONFIG_STACKTRACE.
|
For better bug detection and nicer reporting, enable CONFIG_STACKTRACE.
|
||||||
|
|
||||||
To disable instrumentation for specific files or directories, add a line
|
To disable instrumentation for specific files or directories, add a line
|
||||||
|
@ -43,85 +55,85 @@ similar to the following to the respective kernel Makefile:
|
||||||
Error reports
|
Error reports
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
A typical out of bounds access report looks like this::
|
A typical out-of-bounds access generic KASAN report looks like this::
|
||||||
|
|
||||||
==================================================================
|
==================================================================
|
||||||
BUG: AddressSanitizer: out of bounds access in kmalloc_oob_right+0x65/0x75 [test_kasan] at addr ffff8800693bc5d3
|
BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0xa8/0xbc [test_kasan]
|
||||||
Write of size 1 by task modprobe/1689
|
Write of size 1 at addr ffff8801f44ec37b by task insmod/2760
|
||||||
=============================================================================
|
|
||||||
BUG kmalloc-128 (Not tainted): kasan error
|
|
||||||
-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Disabling lock debugging due to kernel taint
|
CPU: 1 PID: 2760 Comm: insmod Not tainted 4.19.0-rc3+ #698
|
||||||
INFO: Allocated in kmalloc_oob_right+0x3d/0x75 [test_kasan] age=0 cpu=0 pid=1689
|
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014
|
||||||
__slab_alloc+0x4b4/0x4f0
|
|
||||||
kmem_cache_alloc_trace+0x10b/0x190
|
|
||||||
kmalloc_oob_right+0x3d/0x75 [test_kasan]
|
|
||||||
init_module+0x9/0x47 [test_kasan]
|
|
||||||
do_one_initcall+0x99/0x200
|
|
||||||
load_module+0x2cb3/0x3b20
|
|
||||||
SyS_finit_module+0x76/0x80
|
|
||||||
system_call_fastpath+0x12/0x17
|
|
||||||
INFO: Slab 0xffffea0001a4ef00 objects=17 used=7 fp=0xffff8800693bd728 flags=0x100000000004080
|
|
||||||
INFO: Object 0xffff8800693bc558 @offset=1368 fp=0xffff8800693bc720
|
|
||||||
|
|
||||||
Bytes b4 ffff8800693bc548: 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ
|
|
||||||
Object ffff8800693bc558: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc568: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc578: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc588: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc598: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc5a8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc5b8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk
|
|
||||||
Object ffff8800693bc5c8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5 kkkkkkkkkkkkkkk.
|
|
||||||
Redzone ffff8800693bc5d8: cc cc cc cc cc cc cc cc ........
|
|
||||||
Padding ffff8800693bc718: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ
|
|
||||||
CPU: 0 PID: 1689 Comm: modprobe Tainted: G B 3.18.0-rc1-mm1+ #98
|
|
||||||
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
|
|
||||||
ffff8800693bc000 0000000000000000 ffff8800693bc558 ffff88006923bb78
|
|
||||||
ffffffff81cc68ae 00000000000000f3 ffff88006d407600 ffff88006923bba8
|
|
||||||
ffffffff811fd848 ffff88006d407600 ffffea0001a4ef00 ffff8800693bc558
|
|
||||||
Call Trace:
|
Call Trace:
|
||||||
[<ffffffff81cc68ae>] dump_stack+0x46/0x58
|
dump_stack+0x94/0xd8
|
||||||
[<ffffffff811fd848>] print_trailer+0xf8/0x160
|
print_address_description+0x73/0x280
|
||||||
[<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
|
kasan_report+0x144/0x187
|
||||||
[<ffffffff811ff0f5>] object_err+0x35/0x40
|
__asan_report_store1_noabort+0x17/0x20
|
||||||
[<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
|
kmalloc_oob_right+0xa8/0xbc [test_kasan]
|
||||||
[<ffffffff8120b9fa>] kasan_report_error+0x38a/0x3f0
|
kmalloc_tests_init+0x16/0x700 [test_kasan]
|
||||||
[<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
|
do_one_initcall+0xa5/0x3ae
|
||||||
[<ffffffff8120b344>] ? kasan_unpoison_shadow+0x14/0x40
|
do_init_module+0x1b6/0x547
|
||||||
[<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
|
load_module+0x75df/0x8070
|
||||||
[<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
|
__do_sys_init_module+0x1c6/0x200
|
||||||
[<ffffffff8120a995>] __asan_store1+0x75/0xb0
|
__x64_sys_init_module+0x6e/0xb0
|
||||||
[<ffffffffa0002601>] ? kmem_cache_oob+0x1d/0xc3 [test_kasan]
|
do_syscall_64+0x9f/0x2c0
|
||||||
[<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
|
entry_SYSCALL_64_after_hwframe+0x44/0xa9
|
||||||
[<ffffffffa0002065>] kmalloc_oob_right+0x65/0x75 [test_kasan]
|
RIP: 0033:0x7f96443109da
|
||||||
[<ffffffffa00026b0>] init_module+0x9/0x47 [test_kasan]
|
RSP: 002b:00007ffcf0b51b08 EFLAGS: 00000202 ORIG_RAX: 00000000000000af
|
||||||
[<ffffffff810002d9>] do_one_initcall+0x99/0x200
|
RAX: ffffffffffffffda RBX: 000055dc3ee521a0 RCX: 00007f96443109da
|
||||||
[<ffffffff811e4e5c>] ? __vunmap+0xec/0x160
|
RDX: 00007f96445cff88 RSI: 0000000000057a50 RDI: 00007f9644992000
|
||||||
[<ffffffff81114f63>] load_module+0x2cb3/0x3b20
|
RBP: 000055dc3ee510b0 R08: 0000000000000003 R09: 0000000000000000
|
||||||
[<ffffffff8110fd70>] ? m_show+0x240/0x240
|
R10: 00007f964430cd0a R11: 0000000000000202 R12: 00007f96445cff88
|
||||||
[<ffffffff81115f06>] SyS_finit_module+0x76/0x80
|
R13: 000055dc3ee51090 R14: 0000000000000000 R15: 0000000000000000
|
||||||
[<ffffffff81cd3129>] system_call_fastpath+0x12/0x17
|
|
||||||
|
Allocated by task 2760:
|
||||||
|
save_stack+0x43/0xd0
|
||||||
|
kasan_kmalloc+0xa7/0xd0
|
||||||
|
kmem_cache_alloc_trace+0xe1/0x1b0
|
||||||
|
kmalloc_oob_right+0x56/0xbc [test_kasan]
|
||||||
|
kmalloc_tests_init+0x16/0x700 [test_kasan]
|
||||||
|
do_one_initcall+0xa5/0x3ae
|
||||||
|
do_init_module+0x1b6/0x547
|
||||||
|
load_module+0x75df/0x8070
|
||||||
|
__do_sys_init_module+0x1c6/0x200
|
||||||
|
__x64_sys_init_module+0x6e/0xb0
|
||||||
|
do_syscall_64+0x9f/0x2c0
|
||||||
|
entry_SYSCALL_64_after_hwframe+0x44/0xa9
|
||||||
|
|
||||||
|
Freed by task 815:
|
||||||
|
save_stack+0x43/0xd0
|
||||||
|
__kasan_slab_free+0x135/0x190
|
||||||
|
kasan_slab_free+0xe/0x10
|
||||||
|
kfree+0x93/0x1a0
|
||||||
|
umh_complete+0x6a/0xa0
|
||||||
|
call_usermodehelper_exec_async+0x4c3/0x640
|
||||||
|
ret_from_fork+0x35/0x40
|
||||||
|
|
||||||
|
The buggy address belongs to the object at ffff8801f44ec300
|
||||||
|
which belongs to the cache kmalloc-128 of size 128
|
||||||
|
The buggy address is located 123 bytes inside of
|
||||||
|
128-byte region [ffff8801f44ec300, ffff8801f44ec380)
|
||||||
|
The buggy address belongs to the page:
|
||||||
|
page:ffffea0007d13b00 count:1 mapcount:0 mapping:ffff8801f7001640 index:0x0
|
||||||
|
flags: 0x200000000000100(slab)
|
||||||
|
raw: 0200000000000100 ffffea0007d11dc0 0000001a0000001a ffff8801f7001640
|
||||||
|
raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
|
||||||
|
page dumped because: kasan: bad access detected
|
||||||
|
|
||||||
Memory state around the buggy address:
|
Memory state around the buggy address:
|
||||||
ffff8800693bc300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
ffff8801f44ec200: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
|
||||||
ffff8800693bc380: fc fc 00 00 00 00 00 00 00 00 00 00 00 00 00 fc
|
ffff8801f44ec280: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
|
||||||
ffff8800693bc400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
>ffff8801f44ec300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03
|
||||||
ffff8800693bc480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
^
|
||||||
ffff8800693bc500: fc fc fc fc fc fc fc fc fc fc fc 00 00 00 00 00
|
ffff8801f44ec380: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
|
||||||
>ffff8800693bc580: 00 00 00 00 00 00 00 00 00 00 03 fc fc fc fc fc
|
ffff8801f44ec400: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
|
||||||
^
|
|
||||||
ffff8800693bc600: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
|
||||||
ffff8800693bc680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
|
||||||
ffff8800693bc700: fc fc fc fc fb fb fb fb fb fb fb fb fb fb fb fb
|
|
||||||
ffff8800693bc780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
|
|
||||||
ffff8800693bc800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
|
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
The header of the report discribe what kind of bug happened and what kind of
|
The header of the report provides a short summary of what kind of bug happened
|
||||||
access caused it. It's followed by the description of the accessed slub object
|
and what kind of access caused it. It's followed by a stack trace of the bad
|
||||||
(see 'SLUB Debug output' section in Documentation/vm/slub.rst for details) and
|
access, a stack trace of where the accessed memory was allocated (in case bad
|
||||||
the description of the accessed memory page.
|
access happens on a slab object), and a stack trace of where the object was
|
||||||
|
freed (in case of a use-after-free bug report). Next comes a description of
|
||||||
|
the accessed slab object and information about the accessed memory page.
|
||||||
|
|
||||||
In the last section the report shows memory state around the accessed address.
|
In the last section the report shows memory state around the accessed address.
|
||||||
Reading this part requires some understanding of how KASAN works.
|
Reading this part requires some understanding of how KASAN works.
|
||||||
|
@ -138,18 +150,24 @@ inaccessible memory like redzones or freed memory (see mm/kasan/kasan.h).
|
||||||
In the report above the arrows point to the shadow byte 03, which means that
|
In the report above the arrows point to the shadow byte 03, which means that
|
||||||
the accessed address is partially accessible.
|
the accessed address is partially accessible.
|
||||||
|
|
||||||
|
For tag-based KASAN this last report section shows the memory tags around the
|
||||||
|
accessed address (see Implementation details section).
|
||||||
|
|
||||||
|
|
||||||
Implementation details
|
Implementation details
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
Generic KASAN
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
From a high level, our approach to memory error detection is similar to that
|
From a high level, our approach to memory error detection is similar to that
|
||||||
of kmemcheck: use shadow memory to record whether each byte of memory is safe
|
of kmemcheck: use shadow memory to record whether each byte of memory is safe
|
||||||
to access, and use compile-time instrumentation to check shadow memory on each
|
to access, and use compile-time instrumentation to insert checks of shadow
|
||||||
memory access.
|
memory on each memory access.
|
||||||
|
|
||||||
AddressSanitizer dedicates 1/8 of kernel memory to its shadow memory
|
Generic KASAN dedicates 1/8th of kernel memory to its shadow memory (e.g. 16TB
|
||||||
(e.g. 16TB to cover 128TB on x86_64) and uses direct mapping with a scale and
|
to cover 128TB on x86_64) and uses direct mapping with a scale and offset to
|
||||||
offset to translate a memory address to its corresponding shadow address.
|
translate a memory address to its corresponding shadow address.
|
||||||
|
|
||||||
Here is the function which translates an address to its corresponding shadow
|
Here is the function which translates an address to its corresponding shadow
|
||||||
address::
|
address::
|
||||||
|
@ -162,12 +180,38 @@ address::
|
||||||
|
|
||||||
where ``KASAN_SHADOW_SCALE_SHIFT = 3``.
|
where ``KASAN_SHADOW_SCALE_SHIFT = 3``.
|
||||||
|
|
||||||
Compile-time instrumentation used for checking memory accesses. Compiler inserts
|
Compile-time instrumentation is used to insert memory access checks. Compiler
|
||||||
function calls (__asan_load*(addr), __asan_store*(addr)) before each memory
|
inserts function calls (__asan_load*(addr), __asan_store*(addr)) before each
|
||||||
access of size 1, 2, 4, 8 or 16. These functions check whether memory access is
|
memory access of size 1, 2, 4, 8 or 16. These functions check whether memory
|
||||||
valid or not by checking corresponding shadow memory.
|
access is valid or not by checking corresponding shadow memory.
|
||||||
|
|
||||||
GCC 5.0 has possibility to perform inline instrumentation. Instead of making
|
GCC 5.0 has possibility to perform inline instrumentation. Instead of making
|
||||||
function calls GCC directly inserts the code to check the shadow memory.
|
function calls GCC directly inserts the code to check the shadow memory.
|
||||||
This option significantly enlarges kernel but it gives x1.1-x2 performance
|
This option significantly enlarges kernel but it gives x1.1-x2 performance
|
||||||
boost over outline instrumented kernel.
|
boost over outline instrumented kernel.
|
||||||
|
|
||||||
|
Software tag-based KASAN
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Tag-based KASAN uses the Top Byte Ignore (TBI) feature of modern arm64 CPUs to
|
||||||
|
store a pointer tag in the top byte of kernel pointers. Like generic KASAN it
|
||||||
|
uses shadow memory to store memory tags associated with each 16-byte memory
|
||||||
|
cell (therefore it dedicates 1/16th of the kernel memory for shadow memory).
|
||||||
|
|
||||||
|
On each memory allocation tag-based KASAN generates a random tag, tags the
|
||||||
|
allocated memory with this tag, and embeds this tag into the returned pointer.
|
||||||
|
Software tag-based KASAN uses compile-time instrumentation to insert checks
|
||||||
|
before each memory access. These checks make sure that tag of the memory that
|
||||||
|
is being accessed is equal to tag of the pointer that is used to access this
|
||||||
|
memory. In case of a tag mismatch tag-based KASAN prints a bug report.
|
||||||
|
|
||||||
|
Software tag-based KASAN also has two instrumentation modes (outline, that
|
||||||
|
emits callbacks to check memory accesses; and inline, that performs the shadow
|
||||||
|
memory checks inline). With outline instrumentation mode, a bug report is
|
||||||
|
simply printed from the function that performs the access check. With inline
|
||||||
|
instrumentation a brk instruction is emitted by the compiler, and a dedicated
|
||||||
|
brk handler is used to print bug reports.
|
||||||
|
|
||||||
|
A potential expansion of this mode is a hardware tag-based mode, which would
|
||||||
|
use hardware memory tagging support instead of compiler instrumentation and
|
||||||
|
manual shadow memory manipulation.
|
||||||
|
|
|
@ -182,6 +182,7 @@ read the file /proc/PID/status:
|
||||||
VmSwap: 0 kB
|
VmSwap: 0 kB
|
||||||
HugetlbPages: 0 kB
|
HugetlbPages: 0 kB
|
||||||
CoreDumping: 0
|
CoreDumping: 0
|
||||||
|
THP_enabled: 1
|
||||||
Threads: 1
|
Threads: 1
|
||||||
SigQ: 0/28578
|
SigQ: 0/28578
|
||||||
SigPnd: 0000000000000000
|
SigPnd: 0000000000000000
|
||||||
|
@ -256,6 +257,8 @@ Table 1-2: Contents of the status files (as of 4.8)
|
||||||
HugetlbPages size of hugetlb memory portions
|
HugetlbPages size of hugetlb memory portions
|
||||||
CoreDumping process's memory is currently being dumped
|
CoreDumping process's memory is currently being dumped
|
||||||
(killing the process may lead to a corrupted core)
|
(killing the process may lead to a corrupted core)
|
||||||
|
THP_enabled process is allowed to use THP (returns 0 when
|
||||||
|
PR_SET_THP_DISABLE is set on the process
|
||||||
Threads number of threads
|
Threads number of threads
|
||||||
SigQ number of signals queued/max. number for queue
|
SigQ number of signals queued/max. number for queue
|
||||||
SigPnd bitmap of pending signals for the thread
|
SigPnd bitmap of pending signals for the thread
|
||||||
|
@ -425,6 +428,7 @@ SwapPss: 0 kB
|
||||||
KernelPageSize: 4 kB
|
KernelPageSize: 4 kB
|
||||||
MMUPageSize: 4 kB
|
MMUPageSize: 4 kB
|
||||||
Locked: 0 kB
|
Locked: 0 kB
|
||||||
|
THPeligible: 0
|
||||||
VmFlags: rd ex mr mw me dw
|
VmFlags: rd ex mr mw me dw
|
||||||
|
|
||||||
the first of these lines shows the same information as is displayed for the
|
the first of these lines shows the same information as is displayed for the
|
||||||
|
@ -462,6 +466,8 @@ replaced by copy-on-write) part of the underlying shmem object out on swap.
|
||||||
"SwapPss" shows proportional swap share of this mapping. Unlike "Swap", this
|
"SwapPss" shows proportional swap share of this mapping. Unlike "Swap", this
|
||||||
does not take into account swapped out page of underlying shmem objects.
|
does not take into account swapped out page of underlying shmem objects.
|
||||||
"Locked" indicates whether the mapping is locked in memory or not.
|
"Locked" indicates whether the mapping is locked in memory or not.
|
||||||
|
"THPeligible" indicates whether the mapping is eligible for THP pages - 1 if
|
||||||
|
true, 0 otherwise.
|
||||||
|
|
||||||
"VmFlags" field deserves a separate description. This member represents the kernel
|
"VmFlags" field deserves a separate description. This member represents the kernel
|
||||||
flags associated with the particular virtual memory area in two letter encoded
|
flags associated with the particular virtual memory area in two letter encoded
|
||||||
|
@ -496,7 +502,9 @@ manner. The codes are the following:
|
||||||
|
|
||||||
Note that there is no guarantee that every flag and associated mnemonic will
|
Note that there is no guarantee that every flag and associated mnemonic will
|
||||||
be present in all further kernel releases. Things get changed, the flags may
|
be present in all further kernel releases. Things get changed, the flags may
|
||||||
be vanished or the reverse -- new added.
|
be vanished or the reverse -- new added. Interpretation of their meaning
|
||||||
|
might change in future as well. So each consumer of these flags has to
|
||||||
|
follow each specific kernel version for the exact semantic.
|
||||||
|
|
||||||
This file is only present if the CONFIG_MMU kernel configuration option is
|
This file is only present if the CONFIG_MMU kernel configuration option is
|
||||||
enabled.
|
enabled.
|
||||||
|
|
|
@ -63,6 +63,7 @@ Currently, these files are in /proc/sys/vm:
|
||||||
- swappiness
|
- swappiness
|
||||||
- user_reserve_kbytes
|
- user_reserve_kbytes
|
||||||
- vfs_cache_pressure
|
- vfs_cache_pressure
|
||||||
|
- watermark_boost_factor
|
||||||
- watermark_scale_factor
|
- watermark_scale_factor
|
||||||
- zone_reclaim_mode
|
- zone_reclaim_mode
|
||||||
|
|
||||||
|
@ -856,6 +857,26 @@ ten times more freeable objects than there are.
|
||||||
|
|
||||||
=============================================================
|
=============================================================
|
||||||
|
|
||||||
|
watermark_boost_factor:
|
||||||
|
|
||||||
|
This factor controls the level of reclaim when memory is being fragmented.
|
||||||
|
It defines the percentage of the high watermark of a zone that will be
|
||||||
|
reclaimed if pages of different mobility are being mixed within pageblocks.
|
||||||
|
The intent is that compaction has less work to do in the future and to
|
||||||
|
increase the success rate of future high-order allocations such as SLUB
|
||||||
|
allocations, THP and hugetlbfs pages.
|
||||||
|
|
||||||
|
To make it sensible with respect to the watermark_scale_factor parameter,
|
||||||
|
the unit is in fractions of 10,000. The default value of 15,000 means
|
||||||
|
that up to 150% of the high watermark will be reclaimed in the event of
|
||||||
|
a pageblock being mixed due to fragmentation. The level of reclaim is
|
||||||
|
determined by the number of fragmentation events that occurred in the
|
||||||
|
recent past. If this value is smaller than a pageblock then a pageblocks
|
||||||
|
worth of pages will be reclaimed (e.g. 2MB on 64-bit x86). A boost factor
|
||||||
|
of 0 will disable the feature.
|
||||||
|
|
||||||
|
=============================================================
|
||||||
|
|
||||||
watermark_scale_factor:
|
watermark_scale_factor:
|
||||||
|
|
||||||
This factor controls the aggressiveness of kswapd. It defines the
|
This factor controls the aggressiveness of kswapd. It defines the
|
||||||
|
|
|
@ -110,6 +110,7 @@ config ARM64
|
||||||
select HAVE_ARCH_JUMP_LABEL
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||||
select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
||||||
|
select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_MMAP_RND_BITS
|
select HAVE_ARCH_MMAP_RND_BITS
|
||||||
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
|
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
|
||||||
|
|
|
@ -101,10 +101,19 @@ else
|
||||||
TEXT_OFFSET := 0x00080000
|
TEXT_OFFSET := 0x00080000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_KASAN_SW_TAGS), y)
|
||||||
|
KASAN_SHADOW_SCALE_SHIFT := 4
|
||||||
|
else
|
||||||
|
KASAN_SHADOW_SCALE_SHIFT := 3
|
||||||
|
endif
|
||||||
|
|
||||||
|
KBUILD_CFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
|
||||||
|
KBUILD_CPPFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
|
||||||
|
KBUILD_AFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
|
||||||
|
|
||||||
# KASAN_SHADOW_OFFSET = VA_START + (1 << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
|
# KASAN_SHADOW_OFFSET = VA_START + (1 << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
|
||||||
# - (1 << (64 - KASAN_SHADOW_SCALE_SHIFT))
|
# - (1 << (64 - KASAN_SHADOW_SCALE_SHIFT))
|
||||||
# in 32-bit arithmetic
|
# in 32-bit arithmetic
|
||||||
KASAN_SHADOW_SCALE_SHIFT := 3
|
|
||||||
KASAN_SHADOW_OFFSET := $(shell printf "0x%08x00000000\n" $$(( \
|
KASAN_SHADOW_OFFSET := $(shell printf "0x%08x00000000\n" $$(( \
|
||||||
(0xffffffff & (-1 << ($(CONFIG_ARM64_VA_BITS) - 32))) \
|
(0xffffffff & (-1 << ($(CONFIG_ARM64_VA_BITS) - 32))) \
|
||||||
+ (1 << ($(CONFIG_ARM64_VA_BITS) - 32 - $(KASAN_SHADOW_SCALE_SHIFT))) \
|
+ (1 << ($(CONFIG_ARM64_VA_BITS) - 32 - $(KASAN_SHADOW_SCALE_SHIFT))) \
|
||||||
|
|
|
@ -16,10 +16,12 @@
|
||||||
* 0x400: for dynamic BRK instruction
|
* 0x400: for dynamic BRK instruction
|
||||||
* 0x401: for compile time BRK instruction
|
* 0x401: for compile time BRK instruction
|
||||||
* 0x800: kernel-mode BUG() and WARN() traps
|
* 0x800: kernel-mode BUG() and WARN() traps
|
||||||
|
* 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff)
|
||||||
*/
|
*/
|
||||||
#define FAULT_BRK_IMM 0x100
|
#define FAULT_BRK_IMM 0x100
|
||||||
#define KGDB_DYN_DBG_BRK_IMM 0x400
|
#define KGDB_DYN_DBG_BRK_IMM 0x400
|
||||||
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
|
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
|
||||||
#define BUG_BRK_IMM 0x800
|
#define BUG_BRK_IMM 0x800
|
||||||
|
#define KASAN_BRK_IMM 0x900
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,12 +4,16 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/pgtable-types.h>
|
#include <asm/pgtable-types.h>
|
||||||
|
|
||||||
|
#define arch_kasan_set_tag(addr, tag) __tag_set(addr, tag)
|
||||||
|
#define arch_kasan_reset_tag(addr) __tag_reset(addr)
|
||||||
|
#define arch_kasan_get_tag(addr) __tag_get(addr)
|
||||||
|
|
||||||
|
#ifdef CONFIG_KASAN
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* KASAN_SHADOW_START: beginning of the kernel virtual addresses.
|
* KASAN_SHADOW_START: beginning of the kernel virtual addresses.
|
||||||
* KASAN_SHADOW_END: KASAN_SHADOW_START + 1/N of kernel virtual addresses,
|
* KASAN_SHADOW_END: KASAN_SHADOW_START + 1/N of kernel virtual addresses,
|
||||||
|
|
|
@ -74,13 +74,11 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* KASAN requires 1/8th of the kernel virtual address space for the shadow
|
* Generic and tag-based KASAN require 1/8th and 1/16th of the kernel virtual
|
||||||
* region. KASAN can bloat the stack significantly, so double the (minimum)
|
* address space for the shadow region respectively. They can bloat the stack
|
||||||
* stack size when KASAN is in use, and then double it again if KASAN_EXTRA is
|
* significantly, so double the (minimum) stack size when they are in use.
|
||||||
* on.
|
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
#define KASAN_SHADOW_SCALE_SHIFT 3
|
|
||||||
#define KASAN_SHADOW_SIZE (UL(1) << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
|
#define KASAN_SHADOW_SIZE (UL(1) << (VA_BITS - KASAN_SHADOW_SCALE_SHIFT))
|
||||||
#ifdef CONFIG_KASAN_EXTRA
|
#ifdef CONFIG_KASAN_EXTRA
|
||||||
#define KASAN_THREAD_SHIFT 2
|
#define KASAN_THREAD_SHIFT 2
|
||||||
|
@ -220,6 +218,26 @@ extern u64 vabits_user;
|
||||||
*/
|
*/
|
||||||
#define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
|
#define PHYS_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When dealing with data aborts, watchpoints, or instruction traps we may end
|
||||||
|
* up with a tagged userland pointer. Clear the tag to get a sane pointer to
|
||||||
|
* pass on to access_ok(), for instance.
|
||||||
|
*/
|
||||||
|
#define untagged_addr(addr) \
|
||||||
|
((__typeof__(addr))sign_extend64((u64)(addr), 55))
|
||||||
|
|
||||||
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
|
#define __tag_shifted(tag) ((u64)(tag) << 56)
|
||||||
|
#define __tag_set(addr, tag) (__typeof__(addr))( \
|
||||||
|
((u64)(addr) & ~__tag_shifted(0xff)) | __tag_shifted(tag))
|
||||||
|
#define __tag_reset(addr) untagged_addr(addr)
|
||||||
|
#define __tag_get(addr) (__u8)((u64)(addr) >> 56)
|
||||||
|
#else
|
||||||
|
#define __tag_set(addr, tag) (addr)
|
||||||
|
#define __tag_reset(addr) (addr)
|
||||||
|
#define __tag_get(addr) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Physical vs virtual RAM address space conversion. These are
|
* Physical vs virtual RAM address space conversion. These are
|
||||||
* private definitions which should NOT be used outside memory.h
|
* private definitions which should NOT be used outside memory.h
|
||||||
|
@ -303,7 +321,13 @@ static inline void *phys_to_virt(phys_addr_t x)
|
||||||
#define __virt_to_pgoff(kaddr) (((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
|
#define __virt_to_pgoff(kaddr) (((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
|
||||||
#define __page_to_voff(kaddr) (((u64)(kaddr) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
|
#define __page_to_voff(kaddr) (((u64)(kaddr) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
|
||||||
|
|
||||||
#define page_to_virt(page) ((void *)((__page_to_voff(page)) | PAGE_OFFSET))
|
#define page_to_virt(page) ({ \
|
||||||
|
unsigned long __addr = \
|
||||||
|
((__page_to_voff(page)) | PAGE_OFFSET); \
|
||||||
|
__addr = __tag_set(__addr, page_kasan_tag(page)); \
|
||||||
|
((void *)__addr); \
|
||||||
|
})
|
||||||
|
|
||||||
#define virt_to_page(vaddr) ((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
|
#define virt_to_page(vaddr) ((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
|
||||||
|
|
||||||
#define _virt_addr_valid(kaddr) pfn_valid((((u64)(kaddr) & ~PAGE_OFFSET) \
|
#define _virt_addr_valid(kaddr) pfn_valid((((u64)(kaddr) & ~PAGE_OFFSET) \
|
||||||
|
@ -311,9 +335,10 @@ static inline void *phys_to_virt(phys_addr_t x)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _virt_addr_is_linear(kaddr) (((u64)(kaddr)) >= PAGE_OFFSET)
|
#define _virt_addr_is_linear(kaddr) \
|
||||||
#define virt_addr_valid(kaddr) (_virt_addr_is_linear(kaddr) && \
|
(__tag_reset((u64)(kaddr)) >= PAGE_OFFSET)
|
||||||
_virt_addr_valid(kaddr))
|
#define virt_addr_valid(kaddr) \
|
||||||
|
(_virt_addr_is_linear(kaddr) && _virt_addr_valid(kaddr))
|
||||||
|
|
||||||
#include <asm-generic/memory_model.h>
|
#include <asm-generic/memory_model.h>
|
||||||
|
|
||||||
|
|
|
@ -299,6 +299,7 @@
|
||||||
#define TCR_A1 (UL(1) << 22)
|
#define TCR_A1 (UL(1) << 22)
|
||||||
#define TCR_ASID16 (UL(1) << 36)
|
#define TCR_ASID16 (UL(1) << 36)
|
||||||
#define TCR_TBI0 (UL(1) << 37)
|
#define TCR_TBI0 (UL(1) << 37)
|
||||||
|
#define TCR_TBI1 (UL(1) << 38)
|
||||||
#define TCR_HA (UL(1) << 39)
|
#define TCR_HA (UL(1) << 39)
|
||||||
#define TCR_HD (UL(1) << 40)
|
#define TCR_HD (UL(1) << 40)
|
||||||
#define TCR_NFD1 (UL(1) << 54)
|
#define TCR_NFD1 (UL(1) << 54)
|
||||||
|
|
|
@ -95,13 +95,6 @@ static inline unsigned long __range_ok(const void __user *addr, unsigned long si
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* When dealing with data aborts, watchpoints, or instruction traps we may end
|
|
||||||
* up with a tagged userland pointer. Clear the tag to get a sane pointer to
|
|
||||||
* pass on to access_ok(), for instance.
|
|
||||||
*/
|
|
||||||
#define untagged_addr(addr) sign_extend64(addr, 55)
|
|
||||||
|
|
||||||
#define access_ok(type, addr, size) __range_ok(addr, size)
|
#define access_ok(type, addr, size) __range_ok(addr, size)
|
||||||
#define user_addr_max get_fs
|
#define user_addr_max get_fs
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <linux/sizes.h>
|
#include <linux/sizes.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/mm_types.h>
|
#include <linux/mm_types.h>
|
||||||
|
#include <linux/kasan.h>
|
||||||
|
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/bug.h>
|
#include <asm/bug.h>
|
||||||
|
@ -969,6 +970,58 @@ static struct break_hook bug_break_hook = {
|
||||||
.fn = bug_handler,
|
.fn = bug_handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
|
|
||||||
|
#define KASAN_ESR_RECOVER 0x20
|
||||||
|
#define KASAN_ESR_WRITE 0x10
|
||||||
|
#define KASAN_ESR_SIZE_MASK 0x0f
|
||||||
|
#define KASAN_ESR_SIZE(esr) (1 << ((esr) & KASAN_ESR_SIZE_MASK))
|
||||||
|
|
||||||
|
static int kasan_handler(struct pt_regs *regs, unsigned int esr)
|
||||||
|
{
|
||||||
|
bool recover = esr & KASAN_ESR_RECOVER;
|
||||||
|
bool write = esr & KASAN_ESR_WRITE;
|
||||||
|
size_t size = KASAN_ESR_SIZE(esr);
|
||||||
|
u64 addr = regs->regs[0];
|
||||||
|
u64 pc = regs->pc;
|
||||||
|
|
||||||
|
if (user_mode(regs))
|
||||||
|
return DBG_HOOK_ERROR;
|
||||||
|
|
||||||
|
kasan_report(addr, size, write, pc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The instrumentation allows to control whether we can proceed after
|
||||||
|
* a crash was detected. This is done by passing the -recover flag to
|
||||||
|
* the compiler. Disabling recovery allows to generate more compact
|
||||||
|
* code.
|
||||||
|
*
|
||||||
|
* Unfortunately disabling recovery doesn't work for the kernel right
|
||||||
|
* now. KASAN reporting is disabled in some contexts (for example when
|
||||||
|
* the allocator accesses slab object metadata; this is controlled by
|
||||||
|
* current->kasan_depth). All these accesses are detected by the tool,
|
||||||
|
* even though the reports for them are not printed.
|
||||||
|
*
|
||||||
|
* This is something that might be fixed at some point in the future.
|
||||||
|
*/
|
||||||
|
if (!recover)
|
||||||
|
die("Oops - KASAN", regs, 0);
|
||||||
|
|
||||||
|
/* If thread survives, skip over the brk instruction and continue: */
|
||||||
|
arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
|
||||||
|
return DBG_HOOK_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define KASAN_ESR_VAL (0xf2000000 | KASAN_BRK_IMM)
|
||||||
|
#define KASAN_ESR_MASK 0xffffff00
|
||||||
|
|
||||||
|
static struct break_hook kasan_break_hook = {
|
||||||
|
.esr_val = KASAN_ESR_VAL,
|
||||||
|
.esr_mask = KASAN_ESR_MASK,
|
||||||
|
.fn = kasan_handler,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initial handler for AArch64 BRK exceptions
|
* Initial handler for AArch64 BRK exceptions
|
||||||
* This handler only used until debug_traps_init().
|
* This handler only used until debug_traps_init().
|
||||||
|
@ -976,6 +1029,10 @@ static struct break_hook bug_break_hook = {
|
||||||
int __init early_brk64(unsigned long addr, unsigned int esr,
|
int __init early_brk64(unsigned long addr, unsigned int esr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
|
if ((esr & KASAN_ESR_MASK) == KASAN_ESR_VAL)
|
||||||
|
return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
|
||||||
|
#endif
|
||||||
return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
|
return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -983,4 +1040,7 @@ int __init early_brk64(unsigned long addr, unsigned int esr,
|
||||||
void __init trap_init(void)
|
void __init trap_init(void)
|
||||||
{
|
{
|
||||||
register_break_hook(&bug_break_hook);
|
register_break_hook(&bug_break_hook);
|
||||||
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
|
register_break_hook(&kasan_break_hook);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <asm/daifflags.h>
|
#include <asm/daifflags.h>
|
||||||
#include <asm/debug-monitors.h>
|
#include <asm/debug-monitors.h>
|
||||||
#include <asm/esr.h>
|
#include <asm/esr.h>
|
||||||
|
#include <asm/kasan.h>
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
#include <asm/system_misc.h>
|
#include <asm/system_misc.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
@ -132,6 +133,18 @@ static void mem_abort_decode(unsigned int esr)
|
||||||
data_abort_decode(esr);
|
data_abort_decode(esr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool is_ttbr0_addr(unsigned long addr)
|
||||||
|
{
|
||||||
|
/* entry assembly clears tags for TTBR0 addrs */
|
||||||
|
return addr < TASK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool is_ttbr1_addr(unsigned long addr)
|
||||||
|
{
|
||||||
|
/* TTBR1 addresses may have a tag if KASAN_SW_TAGS is in use */
|
||||||
|
return arch_kasan_reset_tag(addr) >= VA_START;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dump out the page tables associated with 'addr' in the currently active mm.
|
* Dump out the page tables associated with 'addr' in the currently active mm.
|
||||||
*/
|
*/
|
||||||
|
@ -141,7 +154,7 @@ void show_pte(unsigned long addr)
|
||||||
pgd_t *pgdp;
|
pgd_t *pgdp;
|
||||||
pgd_t pgd;
|
pgd_t pgd;
|
||||||
|
|
||||||
if (addr < TASK_SIZE) {
|
if (is_ttbr0_addr(addr)) {
|
||||||
/* TTBR0 */
|
/* TTBR0 */
|
||||||
mm = current->active_mm;
|
mm = current->active_mm;
|
||||||
if (mm == &init_mm) {
|
if (mm == &init_mm) {
|
||||||
|
@ -149,7 +162,7 @@ void show_pte(unsigned long addr)
|
||||||
addr);
|
addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (addr >= VA_START) {
|
} else if (is_ttbr1_addr(addr)) {
|
||||||
/* TTBR1 */
|
/* TTBR1 */
|
||||||
mm = &init_mm;
|
mm = &init_mm;
|
||||||
} else {
|
} else {
|
||||||
|
@ -254,7 +267,7 @@ static inline bool is_el1_permission_fault(unsigned long addr, unsigned int esr,
|
||||||
if (fsc_type == ESR_ELx_FSC_PERM)
|
if (fsc_type == ESR_ELx_FSC_PERM)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (addr < TASK_SIZE && system_uses_ttbr0_pan())
|
if (is_ttbr0_addr(addr) && system_uses_ttbr0_pan())
|
||||||
return fsc_type == ESR_ELx_FSC_FAULT &&
|
return fsc_type == ESR_ELx_FSC_FAULT &&
|
||||||
(regs->pstate & PSR_PAN_BIT);
|
(regs->pstate & PSR_PAN_BIT);
|
||||||
|
|
||||||
|
@ -319,7 +332,7 @@ static void set_thread_esr(unsigned long address, unsigned int esr)
|
||||||
* type", so we ignore this wrinkle and just return the translation
|
* type", so we ignore this wrinkle and just return the translation
|
||||||
* fault.)
|
* fault.)
|
||||||
*/
|
*/
|
||||||
if (current->thread.fault_address >= TASK_SIZE) {
|
if (!is_ttbr0_addr(current->thread.fault_address)) {
|
||||||
switch (ESR_ELx_EC(esr)) {
|
switch (ESR_ELx_EC(esr)) {
|
||||||
case ESR_ELx_EC_DABT_LOW:
|
case ESR_ELx_EC_DABT_LOW:
|
||||||
/*
|
/*
|
||||||
|
@ -455,7 +468,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
|
||||||
mm_flags |= FAULT_FLAG_WRITE;
|
mm_flags |= FAULT_FLAG_WRITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr < TASK_SIZE && is_el1_permission_fault(addr, esr, regs)) {
|
if (is_ttbr0_addr(addr) && is_el1_permission_fault(addr, esr, regs)) {
|
||||||
/* regs->orig_addr_limit may be 0 if we entered from EL0 */
|
/* regs->orig_addr_limit may be 0 if we entered from EL0 */
|
||||||
if (regs->orig_addr_limit == KERNEL_DS)
|
if (regs->orig_addr_limit == KERNEL_DS)
|
||||||
die_kernel_fault("access to user memory with fs=KERNEL_DS",
|
die_kernel_fault("access to user memory with fs=KERNEL_DS",
|
||||||
|
@ -603,7 +616,7 @@ static int __kprobes do_translation_fault(unsigned long addr,
|
||||||
unsigned int esr,
|
unsigned int esr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (addr < TASK_SIZE)
|
if (is_ttbr0_addr(addr))
|
||||||
return do_page_fault(addr, esr, regs);
|
return do_page_fault(addr, esr, regs);
|
||||||
|
|
||||||
do_bad_area(addr, esr, regs);
|
do_bad_area(addr, esr, regs);
|
||||||
|
@ -758,7 +771,7 @@ asmlinkage void __exception do_el0_ia_bp_hardening(unsigned long addr,
|
||||||
* re-enabled IRQs. If the address is a kernel address, apply
|
* re-enabled IRQs. If the address is a kernel address, apply
|
||||||
* BP hardening prior to enabling IRQs and pre-emption.
|
* BP hardening prior to enabling IRQs and pre-emption.
|
||||||
*/
|
*/
|
||||||
if (addr > TASK_SIZE)
|
if (!is_ttbr0_addr(addr))
|
||||||
arm64_apply_bp_hardening();
|
arm64_apply_bp_hardening();
|
||||||
|
|
||||||
local_daif_restore(DAIF_PROCCTX);
|
local_daif_restore(DAIF_PROCCTX);
|
||||||
|
@ -771,7 +784,7 @@ asmlinkage void __exception do_sp_pc_abort(unsigned long addr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
if (instruction_pointer(regs) > TASK_SIZE)
|
if (!is_ttbr0_addr(instruction_pointer(regs)))
|
||||||
arm64_apply_bp_hardening();
|
arm64_apply_bp_hardening();
|
||||||
local_daif_restore(DAIF_PROCCTX);
|
local_daif_restore(DAIF_PROCCTX);
|
||||||
}
|
}
|
||||||
|
@ -825,7 +838,7 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
|
||||||
if (interrupts_enabled(regs))
|
if (interrupts_enabled(regs))
|
||||||
trace_hardirqs_off();
|
trace_hardirqs_off();
|
||||||
|
|
||||||
if (user_mode(regs) && instruction_pointer(regs) > TASK_SIZE)
|
if (user_mode(regs) && !is_ttbr0_addr(instruction_pointer(regs)))
|
||||||
arm64_apply_bp_hardening();
|
arm64_apply_bp_hardening();
|
||||||
|
|
||||||
if (!inf->fn(addr, esr, regs)) {
|
if (!inf->fn(addr, esr, regs)) {
|
||||||
|
|
|
@ -39,7 +39,15 @@ static phys_addr_t __init kasan_alloc_zeroed_page(int node)
|
||||||
{
|
{
|
||||||
void *p = memblock_alloc_try_nid(PAGE_SIZE, PAGE_SIZE,
|
void *p = memblock_alloc_try_nid(PAGE_SIZE, PAGE_SIZE,
|
||||||
__pa(MAX_DMA_ADDRESS),
|
__pa(MAX_DMA_ADDRESS),
|
||||||
MEMBLOCK_ALLOC_ACCESSIBLE, node);
|
MEMBLOCK_ALLOC_KASAN, node);
|
||||||
|
return __pa(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static phys_addr_t __init kasan_alloc_raw_page(int node)
|
||||||
|
{
|
||||||
|
void *p = memblock_alloc_try_nid_raw(PAGE_SIZE, PAGE_SIZE,
|
||||||
|
__pa(MAX_DMA_ADDRESS),
|
||||||
|
MEMBLOCK_ALLOC_KASAN, node);
|
||||||
return __pa(p);
|
return __pa(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,8 +55,9 @@ static pte_t *__init kasan_pte_offset(pmd_t *pmdp, unsigned long addr, int node,
|
||||||
bool early)
|
bool early)
|
||||||
{
|
{
|
||||||
if (pmd_none(READ_ONCE(*pmdp))) {
|
if (pmd_none(READ_ONCE(*pmdp))) {
|
||||||
phys_addr_t pte_phys = early ? __pa_symbol(kasan_zero_pte)
|
phys_addr_t pte_phys = early ?
|
||||||
: kasan_alloc_zeroed_page(node);
|
__pa_symbol(kasan_early_shadow_pte)
|
||||||
|
: kasan_alloc_zeroed_page(node);
|
||||||
__pmd_populate(pmdp, pte_phys, PMD_TYPE_TABLE);
|
__pmd_populate(pmdp, pte_phys, PMD_TYPE_TABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +69,9 @@ static pmd_t *__init kasan_pmd_offset(pud_t *pudp, unsigned long addr, int node,
|
||||||
bool early)
|
bool early)
|
||||||
{
|
{
|
||||||
if (pud_none(READ_ONCE(*pudp))) {
|
if (pud_none(READ_ONCE(*pudp))) {
|
||||||
phys_addr_t pmd_phys = early ? __pa_symbol(kasan_zero_pmd)
|
phys_addr_t pmd_phys = early ?
|
||||||
: kasan_alloc_zeroed_page(node);
|
__pa_symbol(kasan_early_shadow_pmd)
|
||||||
|
: kasan_alloc_zeroed_page(node);
|
||||||
__pud_populate(pudp, pmd_phys, PMD_TYPE_TABLE);
|
__pud_populate(pudp, pmd_phys, PMD_TYPE_TABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,8 +82,9 @@ static pud_t *__init kasan_pud_offset(pgd_t *pgdp, unsigned long addr, int node,
|
||||||
bool early)
|
bool early)
|
||||||
{
|
{
|
||||||
if (pgd_none(READ_ONCE(*pgdp))) {
|
if (pgd_none(READ_ONCE(*pgdp))) {
|
||||||
phys_addr_t pud_phys = early ? __pa_symbol(kasan_zero_pud)
|
phys_addr_t pud_phys = early ?
|
||||||
: kasan_alloc_zeroed_page(node);
|
__pa_symbol(kasan_early_shadow_pud)
|
||||||
|
: kasan_alloc_zeroed_page(node);
|
||||||
__pgd_populate(pgdp, pud_phys, PMD_TYPE_TABLE);
|
__pgd_populate(pgdp, pud_phys, PMD_TYPE_TABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,8 +98,11 @@ static void __init kasan_pte_populate(pmd_t *pmdp, unsigned long addr,
|
||||||
pte_t *ptep = kasan_pte_offset(pmdp, addr, node, early);
|
pte_t *ptep = kasan_pte_offset(pmdp, addr, node, early);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
phys_addr_t page_phys = early ? __pa_symbol(kasan_zero_page)
|
phys_addr_t page_phys = early ?
|
||||||
: kasan_alloc_zeroed_page(node);
|
__pa_symbol(kasan_early_shadow_page)
|
||||||
|
: kasan_alloc_raw_page(node);
|
||||||
|
if (!early)
|
||||||
|
memset(__va(page_phys), KASAN_SHADOW_INIT, PAGE_SIZE);
|
||||||
next = addr + PAGE_SIZE;
|
next = addr + PAGE_SIZE;
|
||||||
set_pte(ptep, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL));
|
set_pte(ptep, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL));
|
||||||
} while (ptep++, addr = next, addr != end && pte_none(READ_ONCE(*ptep)));
|
} while (ptep++, addr = next, addr != end && pte_none(READ_ONCE(*ptep)));
|
||||||
|
@ -205,14 +219,14 @@ void __init kasan_init(void)
|
||||||
kasan_map_populate(kimg_shadow_start, kimg_shadow_end,
|
kasan_map_populate(kimg_shadow_start, kimg_shadow_end,
|
||||||
early_pfn_to_nid(virt_to_pfn(lm_alias(_text))));
|
early_pfn_to_nid(virt_to_pfn(lm_alias(_text))));
|
||||||
|
|
||||||
kasan_populate_zero_shadow((void *)KASAN_SHADOW_START,
|
kasan_populate_early_shadow((void *)KASAN_SHADOW_START,
|
||||||
(void *)mod_shadow_start);
|
(void *)mod_shadow_start);
|
||||||
kasan_populate_zero_shadow((void *)kimg_shadow_end,
|
kasan_populate_early_shadow((void *)kimg_shadow_end,
|
||||||
kasan_mem_to_shadow((void *)PAGE_OFFSET));
|
kasan_mem_to_shadow((void *)PAGE_OFFSET));
|
||||||
|
|
||||||
if (kimg_shadow_start > mod_shadow_end)
|
if (kimg_shadow_start > mod_shadow_end)
|
||||||
kasan_populate_zero_shadow((void *)mod_shadow_end,
|
kasan_populate_early_shadow((void *)mod_shadow_end,
|
||||||
(void *)kimg_shadow_start);
|
(void *)kimg_shadow_start);
|
||||||
|
|
||||||
for_each_memblock(memory, reg) {
|
for_each_memblock(memory, reg) {
|
||||||
void *start = (void *)__phys_to_virt(reg->base);
|
void *start = (void *)__phys_to_virt(reg->base);
|
||||||
|
@ -227,16 +241,19 @@ void __init kasan_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* KAsan may reuse the contents of kasan_zero_pte directly, so we
|
* KAsan may reuse the contents of kasan_early_shadow_pte directly,
|
||||||
* should make sure that it maps the zero page read-only.
|
* so we should make sure that it maps the zero page read-only.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < PTRS_PER_PTE; i++)
|
for (i = 0; i < PTRS_PER_PTE; i++)
|
||||||
set_pte(&kasan_zero_pte[i],
|
set_pte(&kasan_early_shadow_pte[i],
|
||||||
pfn_pte(sym_to_pfn(kasan_zero_page), PAGE_KERNEL_RO));
|
pfn_pte(sym_to_pfn(kasan_early_shadow_page),
|
||||||
|
PAGE_KERNEL_RO));
|
||||||
|
|
||||||
memset(kasan_zero_page, 0, PAGE_SIZE);
|
memset(kasan_early_shadow_page, KASAN_SHADOW_INIT, PAGE_SIZE);
|
||||||
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
|
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
|
||||||
|
|
||||||
|
kasan_init_tags();
|
||||||
|
|
||||||
/* At this point kasan is fully initialized. Enable error messages */
|
/* At this point kasan is fully initialized. Enable error messages */
|
||||||
init_task.kasan_depth = 0;
|
init_task.kasan_depth = 0;
|
||||||
pr_info("KernelAddressSanitizer initialized\n");
|
pr_info("KernelAddressSanitizer initialized\n");
|
||||||
|
|
|
@ -1003,10 +1003,8 @@ int pmd_free_pte_page(pmd_t *pmdp, unsigned long addr)
|
||||||
|
|
||||||
pmd = READ_ONCE(*pmdp);
|
pmd = READ_ONCE(*pmdp);
|
||||||
|
|
||||||
if (!pmd_present(pmd))
|
|
||||||
return 1;
|
|
||||||
if (!pmd_table(pmd)) {
|
if (!pmd_table(pmd)) {
|
||||||
VM_WARN_ON(!pmd_table(pmd));
|
VM_WARN_ON(1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1026,10 +1024,8 @@ int pud_free_pmd_page(pud_t *pudp, unsigned long addr)
|
||||||
|
|
||||||
pud = READ_ONCE(*pudp);
|
pud = READ_ONCE(*pudp);
|
||||||
|
|
||||||
if (!pud_present(pud))
|
|
||||||
return 1;
|
|
||||||
if (!pud_table(pud)) {
|
if (!pud_table(pud)) {
|
||||||
VM_WARN_ON(!pud_table(pud));
|
VM_WARN_ON(1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1047,6 +1043,11 @@ int pud_free_pmd_page(pud_t *pudp, unsigned long addr)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int p4d_free_pud_page(p4d_t *p4d, unsigned long addr)
|
||||||
|
{
|
||||||
|
return 0; /* Don't attempt a block mapping */
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||||
int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap,
|
int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap,
|
||||||
bool want_memblock)
|
bool want_memblock)
|
||||||
|
|
|
@ -47,6 +47,12 @@
|
||||||
/* PTWs cacheable, inner/outer WBWA */
|
/* PTWs cacheable, inner/outer WBWA */
|
||||||
#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA
|
#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA
|
||||||
|
|
||||||
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
|
#define TCR_KASAN_FLAGS TCR_TBI1
|
||||||
|
#else
|
||||||
|
#define TCR_KASAN_FLAGS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAIR(attr, mt) ((attr) << ((mt) * 8))
|
#define MAIR(attr, mt) ((attr) << ((mt) * 8))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -449,7 +455,7 @@ ENTRY(__cpu_setup)
|
||||||
*/
|
*/
|
||||||
ldr x10, =TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \
|
ldr x10, =TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \
|
||||||
TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \
|
TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \
|
||||||
TCR_TBI0 | TCR_A1
|
TCR_TBI0 | TCR_A1 | TCR_KASAN_FLAGS
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_USER_VA_BITS_52
|
#ifdef CONFIG_ARM64_USER_VA_BITS_52
|
||||||
ldr_l x9, vabits_user
|
ldr_l x9, vabits_user
|
||||||
|
|
|
@ -71,7 +71,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
|
||||||
ClearPageReserved(virt_to_page(start));
|
ClearPageReserved(virt_to_page(start));
|
||||||
init_page_count(virt_to_page(start));
|
init_page_count(virt_to_page(start));
|
||||||
free_page(start);
|
free_page(start);
|
||||||
totalram_pages++;
|
totalram_pages_inc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -88,7 +88,7 @@ void free_initmem(void)
|
||||||
ClearPageReserved(virt_to_page(addr));
|
ClearPageReserved(virt_to_page(addr));
|
||||||
init_page_count(virt_to_page(addr));
|
init_page_count(virt_to_page(addr));
|
||||||
free_page(addr);
|
free_page(addr);
|
||||||
totalram_pages++;
|
totalram_pages_inc();
|
||||||
addr += PAGE_SIZE;
|
addr += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -658,7 +658,7 @@ int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap)
|
int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
unsigned long start_pfn = start >> PAGE_SHIFT;
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
|
|
@ -139,7 +139,8 @@ int __meminit arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
int __meminit arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap)
|
int __meminit arch_remove_memory(int nid, u64 start, u64 size,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
unsigned long start_pfn = start >> PAGE_SHIFT;
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
|
|
@ -208,7 +208,7 @@ static long cmm_alloc_pages(long nr)
|
||||||
|
|
||||||
pa->page[pa->index++] = addr;
|
pa->page[pa->index++] = addr;
|
||||||
loaned_pages++;
|
loaned_pages++;
|
||||||
totalram_pages--;
|
totalram_pages_dec();
|
||||||
spin_unlock(&cmm_lock);
|
spin_unlock(&cmm_lock);
|
||||||
nr--;
|
nr--;
|
||||||
}
|
}
|
||||||
|
@ -247,7 +247,7 @@ static long cmm_free_pages(long nr)
|
||||||
free_page(addr);
|
free_page(addr);
|
||||||
loaned_pages--;
|
loaned_pages--;
|
||||||
nr--;
|
nr--;
|
||||||
totalram_pages++;
|
totalram_pages_inc();
|
||||||
}
|
}
|
||||||
spin_unlock(&cmm_lock);
|
spin_unlock(&cmm_lock);
|
||||||
cmm_dbg("End request with %ld pages unfulfilled\n", nr);
|
cmm_dbg("End request with %ld pages unfulfilled\n", nr);
|
||||||
|
@ -291,7 +291,7 @@ static void cmm_get_mpp(void)
|
||||||
int rc;
|
int rc;
|
||||||
struct hvcall_mpp_data mpp_data;
|
struct hvcall_mpp_data mpp_data;
|
||||||
signed long active_pages_target, page_loan_request, target;
|
signed long active_pages_target, page_loan_request, target;
|
||||||
signed long total_pages = totalram_pages + loaned_pages;
|
signed long total_pages = totalram_pages() + loaned_pages;
|
||||||
signed long min_mem_pages = (min_mem_mb * 1024 * 1024) / PAGE_SIZE;
|
signed long min_mem_pages = (min_mem_mb * 1024 * 1024) / PAGE_SIZE;
|
||||||
|
|
||||||
rc = h_get_mpp(&mpp_data);
|
rc = h_get_mpp(&mpp_data);
|
||||||
|
@ -322,7 +322,7 @@ static void cmm_get_mpp(void)
|
||||||
|
|
||||||
cmm_dbg("delta = %ld, loaned = %lu, target = %lu, oom = %lu, totalram = %lu\n",
|
cmm_dbg("delta = %ld, loaned = %lu, target = %lu, oom = %lu, totalram = %lu\n",
|
||||||
page_loan_request, loaned_pages, loaned_pages_target,
|
page_loan_request, loaned_pages, loaned_pages_target,
|
||||||
oom_freed_pages, totalram_pages);
|
oom_freed_pages, totalram_pages());
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct notifier_block cmm_oom_nb = {
|
static struct notifier_block cmm_oom_nb = {
|
||||||
|
@ -581,7 +581,7 @@ static int cmm_mem_going_offline(void *arg)
|
||||||
free_page(pa_curr->page[idx]);
|
free_page(pa_curr->page[idx]);
|
||||||
freed++;
|
freed++;
|
||||||
loaned_pages--;
|
loaned_pages--;
|
||||||
totalram_pages++;
|
totalram_pages_inc();
|
||||||
pa_curr->page[idx] = pa_last->page[--pa_last->index];
|
pa_curr->page[idx] = pa_last->page[--pa_last->index];
|
||||||
if (pa_last->index == 0) {
|
if (pa_last->index == 0) {
|
||||||
if (pa_curr == pa_last)
|
if (pa_curr == pa_last)
|
||||||
|
|
|
@ -111,11 +111,12 @@ static void note_page(struct seq_file *m, struct pg_state *st,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
static void note_kasan_zero_page(struct seq_file *m, struct pg_state *st)
|
static void note_kasan_early_shadow_page(struct seq_file *m,
|
||||||
|
struct pg_state *st)
|
||||||
{
|
{
|
||||||
unsigned int prot;
|
unsigned int prot;
|
||||||
|
|
||||||
prot = pte_val(*kasan_zero_pte) &
|
prot = pte_val(*kasan_early_shadow_pte) &
|
||||||
(_PAGE_PROTECT | _PAGE_INVALID | _PAGE_NOEXEC);
|
(_PAGE_PROTECT | _PAGE_INVALID | _PAGE_NOEXEC);
|
||||||
note_page(m, st, prot, 4);
|
note_page(m, st, prot, 4);
|
||||||
}
|
}
|
||||||
|
@ -154,8 +155,8 @@ static void walk_pmd_level(struct seq_file *m, struct pg_state *st,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
if ((pud_val(*pud) & PAGE_MASK) == __pa(kasan_zero_pmd)) {
|
if ((pud_val(*pud) & PAGE_MASK) == __pa(kasan_early_shadow_pmd)) {
|
||||||
note_kasan_zero_page(m, st);
|
note_kasan_early_shadow_page(m, st);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -185,8 +186,8 @@ static void walk_pud_level(struct seq_file *m, struct pg_state *st,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
if ((p4d_val(*p4d) & PAGE_MASK) == __pa(kasan_zero_pud)) {
|
if ((p4d_val(*p4d) & PAGE_MASK) == __pa(kasan_early_shadow_pud)) {
|
||||||
note_kasan_zero_page(m, st);
|
note_kasan_early_shadow_page(m, st);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -215,8 +216,8 @@ static void walk_p4d_level(struct seq_file *m, struct pg_state *st,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
if ((pgd_val(*pgd) & PAGE_MASK) == __pa(kasan_zero_p4d)) {
|
if ((pgd_val(*pgd) & PAGE_MASK) == __pa(kasan_early_shadow_p4d)) {
|
||||||
note_kasan_zero_page(m, st);
|
note_kasan_early_shadow_page(m, st);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -59,7 +59,7 @@ static void __init setup_zero_pages(void)
|
||||||
order = 7;
|
order = 7;
|
||||||
|
|
||||||
/* Limit number of empty zero pages for small memory sizes */
|
/* Limit number of empty zero pages for small memory sizes */
|
||||||
while (order > 2 && (totalram_pages >> 10) < (1UL << order))
|
while (order > 2 && (totalram_pages() >> 10) < (1UL << order))
|
||||||
order--;
|
order--;
|
||||||
|
|
||||||
empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order);
|
empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order);
|
||||||
|
@ -242,7 +242,7 @@ int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap)
|
int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* There is no hardware or firmware interface which could trigger a
|
* There is no hardware or firmware interface which could trigger a
|
||||||
|
|
|
@ -107,7 +107,8 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
if (mode == POPULATE_ZERO_SHADOW &&
|
if (mode == POPULATE_ZERO_SHADOW &&
|
||||||
IS_ALIGNED(address, PGDIR_SIZE) &&
|
IS_ALIGNED(address, PGDIR_SIZE) &&
|
||||||
end - address >= PGDIR_SIZE) {
|
end - address >= PGDIR_SIZE) {
|
||||||
pgd_populate(&init_mm, pg_dir, kasan_zero_p4d);
|
pgd_populate(&init_mm, pg_dir,
|
||||||
|
kasan_early_shadow_p4d);
|
||||||
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -120,7 +121,8 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
if (mode == POPULATE_ZERO_SHADOW &&
|
if (mode == POPULATE_ZERO_SHADOW &&
|
||||||
IS_ALIGNED(address, P4D_SIZE) &&
|
IS_ALIGNED(address, P4D_SIZE) &&
|
||||||
end - address >= P4D_SIZE) {
|
end - address >= P4D_SIZE) {
|
||||||
p4d_populate(&init_mm, p4_dir, kasan_zero_pud);
|
p4d_populate(&init_mm, p4_dir,
|
||||||
|
kasan_early_shadow_pud);
|
||||||
address = (address + P4D_SIZE) & P4D_MASK;
|
address = (address + P4D_SIZE) & P4D_MASK;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -133,7 +135,8 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
if (mode == POPULATE_ZERO_SHADOW &&
|
if (mode == POPULATE_ZERO_SHADOW &&
|
||||||
IS_ALIGNED(address, PUD_SIZE) &&
|
IS_ALIGNED(address, PUD_SIZE) &&
|
||||||
end - address >= PUD_SIZE) {
|
end - address >= PUD_SIZE) {
|
||||||
pud_populate(&init_mm, pu_dir, kasan_zero_pmd);
|
pud_populate(&init_mm, pu_dir,
|
||||||
|
kasan_early_shadow_pmd);
|
||||||
address = (address + PUD_SIZE) & PUD_MASK;
|
address = (address + PUD_SIZE) & PUD_MASK;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -146,7 +149,8 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
if (mode == POPULATE_ZERO_SHADOW &&
|
if (mode == POPULATE_ZERO_SHADOW &&
|
||||||
IS_ALIGNED(address, PMD_SIZE) &&
|
IS_ALIGNED(address, PMD_SIZE) &&
|
||||||
end - address >= PMD_SIZE) {
|
end - address >= PMD_SIZE) {
|
||||||
pmd_populate(&init_mm, pm_dir, kasan_zero_pte);
|
pmd_populate(&init_mm, pm_dir,
|
||||||
|
kasan_early_shadow_pte);
|
||||||
address = (address + PMD_SIZE) & PMD_MASK;
|
address = (address + PMD_SIZE) & PMD_MASK;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -188,7 +192,7 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
pte_val(*pt_dir) = __pa(page) | pgt_prot;
|
pte_val(*pt_dir) = __pa(page) | pgt_prot;
|
||||||
break;
|
break;
|
||||||
case POPULATE_ZERO_SHADOW:
|
case POPULATE_ZERO_SHADOW:
|
||||||
page = kasan_zero_page;
|
page = kasan_early_shadow_page;
|
||||||
pte_val(*pt_dir) = __pa(page) | pgt_prot_zero;
|
pte_val(*pt_dir) = __pa(page) | pgt_prot_zero;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -256,14 +260,14 @@ void __init kasan_early_init(void)
|
||||||
unsigned long vmax;
|
unsigned long vmax;
|
||||||
unsigned long pgt_prot = pgprot_val(PAGE_KERNEL_RO);
|
unsigned long pgt_prot = pgprot_val(PAGE_KERNEL_RO);
|
||||||
pte_t pte_z;
|
pte_t pte_z;
|
||||||
pmd_t pmd_z = __pmd(__pa(kasan_zero_pte) | _SEGMENT_ENTRY);
|
pmd_t pmd_z = __pmd(__pa(kasan_early_shadow_pte) | _SEGMENT_ENTRY);
|
||||||
pud_t pud_z = __pud(__pa(kasan_zero_pmd) | _REGION3_ENTRY);
|
pud_t pud_z = __pud(__pa(kasan_early_shadow_pmd) | _REGION3_ENTRY);
|
||||||
p4d_t p4d_z = __p4d(__pa(kasan_zero_pud) | _REGION2_ENTRY);
|
p4d_t p4d_z = __p4d(__pa(kasan_early_shadow_pud) | _REGION2_ENTRY);
|
||||||
|
|
||||||
kasan_early_detect_facilities();
|
kasan_early_detect_facilities();
|
||||||
if (!has_nx)
|
if (!has_nx)
|
||||||
pgt_prot &= ~_PAGE_NOEXEC;
|
pgt_prot &= ~_PAGE_NOEXEC;
|
||||||
pte_z = __pte(__pa(kasan_zero_page) | pgt_prot);
|
pte_z = __pte(__pa(kasan_early_shadow_page) | pgt_prot);
|
||||||
|
|
||||||
memsize = get_mem_detect_end();
|
memsize = get_mem_detect_end();
|
||||||
if (!memsize)
|
if (!memsize)
|
||||||
|
@ -292,10 +296,13 @@ void __init kasan_early_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* init kasan zero shadow */
|
/* init kasan zero shadow */
|
||||||
crst_table_init((unsigned long *)kasan_zero_p4d, p4d_val(p4d_z));
|
crst_table_init((unsigned long *)kasan_early_shadow_p4d,
|
||||||
crst_table_init((unsigned long *)kasan_zero_pud, pud_val(pud_z));
|
p4d_val(p4d_z));
|
||||||
crst_table_init((unsigned long *)kasan_zero_pmd, pmd_val(pmd_z));
|
crst_table_init((unsigned long *)kasan_early_shadow_pud,
|
||||||
memset64((u64 *)kasan_zero_pte, pte_val(pte_z), PTRS_PER_PTE);
|
pud_val(pud_z));
|
||||||
|
crst_table_init((unsigned long *)kasan_early_shadow_pmd,
|
||||||
|
pmd_val(pmd_z));
|
||||||
|
memset64((u64 *)kasan_early_shadow_pte, pte_val(pte_z), PTRS_PER_PTE);
|
||||||
|
|
||||||
shadow_alloc_size = memsize >> KASAN_SHADOW_SCALE_SHIFT;
|
shadow_alloc_size = memsize >> KASAN_SHADOW_SCALE_SHIFT;
|
||||||
pgalloc_low = round_up((unsigned long)_end, _SEGMENT_SIZE);
|
pgalloc_low = round_up((unsigned long)_end, _SEGMENT_SIZE);
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* ALPHAPROJECT AP-SH4A-3A Support.
|
* ALPHAPROJECT AP-SH4A-3A Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 ALPHAPROJECT Co.,Ltd.
|
* Copyright (C) 2010 ALPHAPROJECT Co.,Ltd.
|
||||||
* Copyright (C) 2008 Yoshihiro Shimoda
|
* Copyright (C) 2008 Yoshihiro Shimoda
|
||||||
* Copyright (C) 2009 Paul Mundt
|
* Copyright (C) 2009 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* ALPHAPROJECT AP-SH4AD-0A Support.
|
* ALPHAPROJECT AP-SH4AD-0A Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 ALPHAPROJECT Co.,Ltd.
|
* Copyright (C) 2010 ALPHAPROJECT Co.,Ltd.
|
||||||
* Copyright (C) 2010 Matt Fleming
|
* Copyright (C) 2010 Matt Fleming
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,22 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
/*
|
/*
|
||||||
* Renesas Europe EDOSK7760 Board Support
|
* Renesas Europe EDOSK7760 Board Support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 SPES Societa' Progettazione Elettronica e Software Ltd.
|
* Copyright (C) 2008 SPES Societa' Progettazione Elettronica e Software Ltd.
|
||||||
* Author: Luca Santini <luca.santini@spesonline.com>
|
* Author: Luca Santini <luca.santini@spesonline.com>
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Data Technology Inc. ESPT-GIGA board support
|
* Data Technology Inc. ESPT-GIGA board support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008, 2009 Renesas Solutions Corp.
|
* Copyright (C) 2008, 2009 Renesas Solutions Corp.
|
||||||
* Copyright (C) 2008, 2009 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
|
* Copyright (C) 2008, 2009 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/magicpanel/setup.c
|
* linux/arch/sh/boards/magicpanel/setup.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Markus Brunner, Mark Jonas
|
* Copyright (C) 2007 Markus Brunner, Mark Jonas
|
||||||
*
|
*
|
||||||
* Magic Panel Release 2 board setup
|
* Magic Panel Release 2 board setup
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas R0P7757LC0012RL Support.
|
* Renesas R0P7757LC0012RL Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 - 2010 Renesas Solutions Corp.
|
* Copyright (C) 2009 - 2010 Renesas Solutions Corp.
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Technology Corp. R0P7785LC0011RL Support.
|
* Renesas Technology Corp. R0P7785LC0011RL Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Yoshihiro Shimoda
|
* Copyright (C) 2008 Yoshihiro Shimoda
|
||||||
* Copyright (C) 2009 Paul Mundt
|
* Copyright (C) 2009 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/titan/setup.c - Setup for Titan
|
* arch/sh/boards/titan/setup.c - Setup for Titan
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Jamie Lenehan
|
* Copyright (C) 2006 Jamie Lenehan
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Technology Corp. SH7786 Urquell Support.
|
* Renesas Technology Corp. SH7786 Urquell Support.
|
||||||
*
|
*
|
||||||
|
@ -6,10 +7,6 @@
|
||||||
*
|
*
|
||||||
* Based on board-sh7785lcr.c
|
* Based on board-sh7785lcr.c
|
||||||
* Copyright (C) 2008 Yoshihiro Shimoda
|
* Copyright (C) 2008 Yoshihiro Shimoda
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := setup.o sdram.o
|
obj-y := setup.o sdram.o
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
/*
|
/* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*
|
||||||
* AP325RXA sdram self/auto-refresh setup code
|
* AP325RXA sdram self/auto-refresh setup code
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Magnus Damm
|
* Copyright (C) 2009 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sys.h>
|
#include <linux/sys.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the Hitachi Cayman specific parts of the kernel
|
# Makefile for the Hitachi Cayman specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/mach-cayman/irq.c - SH-5 Cayman Interrupt Support
|
* arch/sh/mach-cayman/irq.c - SH-5 Cayman Interrupt Support
|
||||||
*
|
*
|
||||||
* This file handles the board specific parts of the Cayman interrupt system
|
* This file handles the board specific parts of the Cayman interrupt system
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Stuart Menefy
|
* Copyright (C) 2002 Stuart Menefy
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2003 Richard Curnow, SuperH UK Limited
|
* Copyright (C) 2003 Richard Curnow, SuperH UK Limited
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/mach-cayman/setup.c
|
* arch/sh/mach-cayman/setup.c
|
||||||
*
|
*
|
||||||
|
@ -5,10 +6,6 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 David J. Mckay & Benedict Gaster
|
* Copyright (C) 2002 David J. Mckay & Benedict Gaster
|
||||||
* Copyright (C) 2003 - 2007 Paul Mundt
|
* Copyright (C) 2003 - 2007 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the Sega Dreamcast specific parts of the kernel
|
# Makefile for the Sega Dreamcast specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/dreamcast/irq.c
|
* arch/sh/boards/dreamcast/irq.c
|
||||||
*
|
*
|
||||||
|
@ -6,7 +7,6 @@
|
||||||
* Copyright (c) 2001, 2002 M. R. Brown <mrbrown@0xd6.org>
|
* Copyright (c) 2001, 2002 M. R. Brown <mrbrown@0xd6.org>
|
||||||
*
|
*
|
||||||
* This file is part of the LinuxDC project (www.linuxdc.org)
|
* This file is part of the LinuxDC project (www.linuxdc.org)
|
||||||
* Released under the terms of the GNU GPL v2.0
|
|
||||||
*/
|
*/
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/dreamcast/rtc.c
|
* arch/sh/boards/dreamcast/rtc.c
|
||||||
*
|
*
|
||||||
|
@ -5,9 +6,6 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001, 2002 M. R. Brown <mrbrown@0xd6.org>
|
* Copyright (c) 2001, 2002 M. R. Brown <mrbrown@0xd6.org>
|
||||||
* Copyright (c) 2002 Paul Mundt <lethal@chaoticdreams.org>
|
* Copyright (c) 2002 Paul Mundt <lethal@chaoticdreams.org>
|
||||||
*
|
|
||||||
* Released under the terms of the GNU GPL v2.0.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/dreamcast/setup.c
|
* arch/sh/boards/dreamcast/setup.c
|
||||||
*
|
*
|
||||||
|
@ -8,8 +9,6 @@
|
||||||
*
|
*
|
||||||
* This file is part of the LinuxDC project (www.linuxdc.org)
|
* This file is part of the LinuxDC project (www.linuxdc.org)
|
||||||
*
|
*
|
||||||
* Released under the terms of the GNU GPL v2.0.
|
|
||||||
*
|
|
||||||
* This file originally bore the message (with enclosed-$):
|
* This file originally bore the message (with enclosed-$):
|
||||||
* Id: setup_dc.c,v 1.5 2001/05/24 05:09:16 mrbrown Exp
|
* Id: setup_dc.c,v 1.5 2001/05/24 05:09:16 mrbrown Exp
|
||||||
* SEGA Dreamcast support
|
* SEGA Dreamcast support
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the R0P7724LC0011/21RL (EcoVec)
|
# Makefile for the R0P7724LC0011/21RL (EcoVec)
|
||||||
#
|
#
|
||||||
|
@ -6,4 +7,4 @@
|
||||||
# for more details.
|
# for more details.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := setup.o sdram.o
|
obj-y := setup.o sdram.o
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
/*
|
/* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*
|
||||||
* Ecovec24 sdram self/auto-refresh setup code
|
* Ecovec24 sdram self/auto-refresh setup code
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Magnus Damm
|
* Copyright (C) 2009 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sys.h>
|
#include <linux/sys.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2009 Renesas Solutions Corp.
|
* Copyright (C) 2009 Renesas Solutions Corp.
|
||||||
*
|
*
|
||||||
* Kuninori Morimoto <morimoto.kuninori@renesas.com>
|
* Kuninori Morimoto <morimoto.kuninori@renesas.com>
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <asm/clock.h>
|
#include <asm/clock.h>
|
||||||
#include <asm/heartbeat.h>
|
#include <asm/heartbeat.h>
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Solutions Highlander R7780MP Support.
|
* Renesas Solutions Highlander R7780MP Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
||||||
* Copyright (C) 2006 Paul Mundt
|
* Copyright (C) 2006 Paul Mundt
|
||||||
* Copyright (C) 2007 Magnus Damm
|
* Copyright (C) 2007 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Solutions Highlander R7780RP-1 Support.
|
* Renesas Solutions Highlander R7780RP-1 Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
||||||
* Copyright (C) 2006 Paul Mundt
|
* Copyright (C) 2006 Paul Mundt
|
||||||
* Copyright (C) 2008 Magnus Damm
|
* Copyright (C) 2008 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Solutions Highlander R7785RP Support.
|
* Renesas Solutions Highlander R7785RP Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
* Copyright (C) 2002 Atom Create Engineering Co., Ltd.
|
||||||
* Copyright (C) 2006 - 2008 Paul Mundt
|
* Copyright (C) 2006 - 2008 Paul Mundt
|
||||||
* Copyright (C) 2007 Magnus Damm
|
* Copyright (C) 2007 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2008 Paul Mundt
|
* Copyright (C) 2008 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/renesas/r7780rp/psw.c
|
* arch/sh/boards/renesas/r7780rp/psw.c
|
||||||
*
|
*
|
||||||
* push switch support for RDBRP-1/RDBREVRP-1 debug boards.
|
* push switch support for RDBRP-1/RDBREVRP-1 debug boards.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006 Paul Mundt
|
* Copyright (C) 2006 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/renesas/r7780rp/setup.c
|
* arch/sh/boards/renesas/r7780rp/setup.c
|
||||||
*
|
*
|
||||||
|
@ -8,10 +9,6 @@
|
||||||
*
|
*
|
||||||
* This contains support for the R7780RP-1, R7780MP, and R7785RP
|
* This contains support for the R7780RP-1, R7780MP, and R7785RP
|
||||||
* Highlander modules.
|
* Highlander modules.
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the HP6xx specific parts of the kernel
|
# Makefile for the HP6xx specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* bios-less APM driver for hp680
|
* bios-less APM driver for hp680
|
||||||
*
|
*
|
||||||
* Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com>
|
* Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com>
|
||||||
* Copyright 2008 (c) Kristoffer Ericson <kristoffer.ericson@gmail.com>
|
* Copyright 2008 (c) Kristoffer Ericson <kristoffer.ericson@gmail.com>
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* hp6x0 Power Management Routines
|
* hp6x0 Power Management Routines
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
|
* Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
/*
|
/* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*
|
||||||
* Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
|
* Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/hp6xx/setup.c
|
* linux/arch/sh/boards/hp6xx/setup.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Andriy Skulysh
|
* Copyright (C) 2002 Andriy Skulysh
|
||||||
* Copyright (C) 2007 Kristoffer Ericson <Kristoffer_e1@hotmail.com>
|
* Copyright (C) 2007 Kristoffer Ericson <Kristoffer_e1@hotmail.com>
|
||||||
*
|
*
|
||||||
* May be copied or modified under the terms of the GNU General Public
|
|
||||||
* License. See linux/COPYING for more information.
|
|
||||||
*
|
|
||||||
* Setup code for HP620/HP660/HP680/HP690 (internal peripherials only)
|
* Setup code for HP620/HP660/HP680/HP690 (internal peripherials only)
|
||||||
*/
|
*/
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := setup.o sdram.o
|
obj-y := setup.o sdram.o
|
||||||
ifneq ($(CONFIG_FB_SH_MOBILE_LCDC),)
|
ifneq ($(CONFIG_FB_SH_MOBILE_LCDC),)
|
||||||
obj-y += lcd_wqvga.o
|
obj-y += lcd_wqvga.o
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* KFR2R09 LCD panel support
|
* KFR2R09 LCD panel support
|
||||||
*
|
*
|
||||||
|
@ -5,10 +6,6 @@
|
||||||
*
|
*
|
||||||
* Register settings based on the out-of-tree t33fb.c driver
|
* Register settings based on the out-of-tree t33fb.c driver
|
||||||
* Copyright (C) 2008 Lineo Solutions, Inc.
|
* Copyright (C) 2008 Lineo Solutions, Inc.
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file COPYING in the main directory of this archive for
|
|
||||||
* more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
/*
|
/* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*
|
||||||
* KFR2R09 sdram self/auto-refresh setup code
|
* KFR2R09 sdram self/auto-refresh setup code
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Magnus Damm
|
* Copyright (C) 2009 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sys.h>
|
#include <linux/sys.h>
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/mfd/tmio.h>
|
#include <linux/mfd/tmio.h>
|
||||||
#include <linux/mmc/host.h>
|
#include <linux/mmc/host.h>
|
||||||
#include <linux/mtd/onenand.h>
|
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/platform_data/lv5207lp.h>
|
#include <linux/platform_data/lv5207lp.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
@ -478,7 +477,7 @@ extern char kfr2r09_sdram_leave_end;
|
||||||
|
|
||||||
static int __init kfr2r09_devices_setup(void)
|
static int __init kfr2r09_devices_setup(void)
|
||||||
{
|
{
|
||||||
static struct clk *camera_clk;
|
struct clk *camera_clk;
|
||||||
|
|
||||||
/* register board specific self-refresh code */
|
/* register board specific self-refresh code */
|
||||||
sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
|
sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for I-O DATA DEVICE, INC. "LANDISK Series"
|
# Makefile for I-O DATA DEVICE, INC. "LANDISK Series"
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/landisk/gio.c - driver for landisk
|
* arch/sh/boards/landisk/gio.c - driver for landisk
|
||||||
*
|
*
|
||||||
|
@ -6,11 +7,6 @@
|
||||||
*
|
*
|
||||||
* Copylight (C) 2006 kogiidena
|
* Copylight (C) 2006 kogiidena
|
||||||
* Copylight (C) 2002 Atom Create Engineering Co., Ltd. *
|
* Copylight (C) 2002 Atom Create Engineering Co., Ltd. *
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/mach-landisk/irq.c
|
* arch/sh/boards/mach-landisk/irq.c
|
||||||
*
|
*
|
||||||
|
@ -8,10 +9,6 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2001 Ian da Silva, Jeremy Siegel
|
* Copyright (C) 2001 Ian da Silva, Jeremy Siegel
|
||||||
* Based largely on io_se.c.
|
* Based largely on io_se.c.
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/landisk/psw.c
|
* arch/sh/boards/landisk/psw.c
|
||||||
*
|
*
|
||||||
|
@ -5,10 +6,6 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2007 Paul Mundt
|
* Copyright (C) 2006-2007 Paul Mundt
|
||||||
* Copyright (C) 2007 kogiidena
|
* Copyright (C) 2007 kogiidena
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/landisk/setup.c
|
* arch/sh/boards/landisk/setup.c
|
||||||
*
|
*
|
||||||
|
@ -7,10 +8,6 @@
|
||||||
* Copyright (C) 2002 Paul Mundt
|
* Copyright (C) 2002 Paul Mundt
|
||||||
* Copylight (C) 2002 Atom Create Engineering Co., Ltd.
|
* Copylight (C) 2002 Atom Create Engineering Co., Ltd.
|
||||||
* Copyright (C) 2005-2007 kogiidena
|
* Copyright (C) 2005-2007 kogiidena
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the L-BOX RE2 specific parts of the kernel
|
# Makefile for the L-BOX RE2 specific parts of the kernel
|
||||||
# Copyright (c) 2007 Nobuhiro Iwamatsu
|
# Copyright (c) 2007 Nobuhiro Iwamatsu
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/lboxre2/irq.c
|
* linux/arch/sh/boards/lboxre2/irq.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Nobuhiro Iwamatsu
|
* Copyright (C) 2007 Nobuhiro Iwamatsu
|
||||||
*
|
*
|
||||||
* NTT COMWARE L-BOX RE2 Support.
|
* NTT COMWARE L-BOX RE2 Support.
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/lbox/setup.c
|
* linux/arch/sh/boards/lbox/setup.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Nobuhiro Iwamatsu
|
* Copyright (C) 2007 Nobuhiro Iwamatsu
|
||||||
*
|
*
|
||||||
* NTT COMWARE L-BOX RE2 Support
|
* NTT COMWARE L-BOX RE2 Support
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the SuperH MicroDev specific parts of the kernel
|
# Makefile for the SuperH MicroDev specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
*
|
|
||||||
* Setup for the SMSC FDC37C93xAPM
|
* Setup for the SMSC FDC37C93xAPM
|
||||||
*
|
*
|
||||||
* Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
|
* Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
|
||||||
|
@ -7,9 +7,6 @@
|
||||||
* Copyright (C) 2004, 2005 Paul Mundt
|
* Copyright (C) 2004, 2005 Paul Mundt
|
||||||
*
|
*
|
||||||
* SuperH SH4-202 MicroDev board support.
|
* SuperH SH4-202 MicroDev board support.
|
||||||
*
|
|
||||||
* May be copied or modified under the terms of the GNU General Public
|
|
||||||
* License. See linux/COPYING for more information.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/superh/microdev/io.c
|
* linux/arch/sh/boards/superh/microdev/io.c
|
||||||
*
|
*
|
||||||
|
@ -6,9 +7,6 @@
|
||||||
* Copyright (C) 2004 Paul Mundt
|
* Copyright (C) 2004 Paul Mundt
|
||||||
*
|
*
|
||||||
* SuperH SH4-202 MicroDev board support.
|
* SuperH SH4-202 MicroDev board support.
|
||||||
*
|
|
||||||
* May be copied or modified under the terms of the GNU General Public
|
|
||||||
* License. See linux/COPYING for more information.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/superh/microdev/irq.c
|
* arch/sh/boards/superh/microdev/irq.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
|
* Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
|
||||||
*
|
*
|
||||||
* SuperH SH4-202 MicroDev board support.
|
* SuperH SH4-202 MicroDev board support.
|
||||||
*
|
|
||||||
* May be copied or modified under the terms of the GNU General Public
|
|
||||||
* License. See linux/COPYING for more information.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/superh/microdev/setup.c
|
* arch/sh/boards/superh/microdev/setup.c
|
||||||
*
|
*
|
||||||
|
@ -6,9 +7,6 @@
|
||||||
* Copyright (C) 2004, 2005 Paul Mundt
|
* Copyright (C) 2004, 2005 Paul Mundt
|
||||||
*
|
*
|
||||||
* SuperH SH4-202 MicroDev board support.
|
* SuperH SH4-202 MicroDev board support.
|
||||||
*
|
|
||||||
* May be copied or modified under the terms of the GNU General Public
|
|
||||||
* License. See linux/COPYING for more information.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := setup.o sdram.o
|
obj-y := setup.o sdram.o
|
||||||
obj-$(CONFIG_SH_MIGOR_QVGA) += lcd_qvga.o
|
obj-$(CONFIG_SH_MIGOR_QVGA) += lcd_qvga.o
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Support for SuperH MigoR Quarter VGA LCD Panel
|
* Support for SuperH MigoR Quarter VGA LCD Panel
|
||||||
*
|
*
|
||||||
|
@ -5,10 +6,6 @@
|
||||||
*
|
*
|
||||||
* Based on lcd_powertip.c from Kenati Technologies Pvt Ltd.
|
* Based on lcd_powertip.c from Kenati Technologies Pvt Ltd.
|
||||||
* Copyright (c) 2007 Ujjwal Pande <ujjwal@kenati.com>,
|
* Copyright (c) 2007 Ujjwal Pande <ujjwal@kenati.com>,
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
/*
|
/* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*
|
||||||
* Migo-R sdram self/auto-refresh setup code
|
* Migo-R sdram self/auto-refresh setup code
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Magnus Damm
|
* Copyright (C) 2009 Magnus Damm
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sys.h>
|
#include <linux/sys.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the RTS7751R2D specific parts of the kernel
|
# Makefile for the RTS7751R2D specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Technology Sales RTS7751R2D Support.
|
* Renesas Technology Sales RTS7751R2D Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 - 2006 Atom Create Engineering Co., Ltd.
|
* Copyright (C) 2002 - 2006 Atom Create Engineering Co., Ltd.
|
||||||
* Copyright (C) 2004 - 2007 Paul Mundt
|
* Copyright (C) 2004 - 2007 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := setup.o
|
obj-y := setup.o
|
||||||
obj-$(CONFIG_SH_RSK7203) += devices-rsk7203.o
|
obj-$(CONFIG_SH_RSK7203) += devices-rsk7203.o
|
||||||
obj-$(CONFIG_SH_RSK7264) += devices-rsk7264.o
|
obj-$(CONFIG_SH_RSK7264) += devices-rsk7264.o
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Technology Europe RSK+ 7203 Support.
|
* Renesas Technology Europe RSK+ 7203 Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 - 2010 Paul Mundt
|
* Copyright (C) 2008 - 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* RSK+SH7264 Support.
|
* RSK+SH7264 Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 Renesas Electronics Europe
|
* Copyright (C) 2012 Renesas Electronics Europe
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* RSK+SH7269 Support
|
* RSK+SH7269 Support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 Renesas Electronics Europe Ltd
|
* Copyright (C) 2012 Renesas Electronics Europe Ltd
|
||||||
* Copyright (C) 2012 Phil Edworthy
|
* Copyright (C) 2012 Phil Edworthy
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Technology Europe RSK+ Support.
|
* Renesas Technology Europe RSK+ Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Paul Mundt
|
* Copyright (C) 2008 Paul Mundt
|
||||||
* Copyright (C) 2008 Peter Griffin <pgriffin@mpc-data.co.uk>
|
* Copyright (C) 2008 Peter Griffin <pgriffin@mpc-data.co.uk>
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the SDK7780 specific parts of the kernel
|
# Makefile for the SDK7780 specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/renesas/sdk7780/irq.c
|
* linux/arch/sh/boards/renesas/sdk7780/irq.c
|
||||||
*
|
*
|
||||||
* Renesas Technology Europe SDK7780 Support.
|
* Renesas Technology Europe SDK7780 Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Nicholas Beck <nbeck@mpc-data.co.uk>
|
* Copyright (C) 2008 Nicholas Beck <nbeck@mpc-data.co.uk>
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* arch/sh/boards/renesas/sdk7780/setup.c
|
* arch/sh/boards/renesas/sdk7780/setup.c
|
||||||
*
|
*
|
||||||
* Renesas Solutions SH7780 SDK Support
|
* Renesas Solutions SH7780 SDK Support
|
||||||
* Copyright (C) 2008 Nicholas Beck <nbeck@mpc-data.co.uk>
|
* Copyright (C) 2008 Nicholas Beck <nbeck@mpc-data.co.uk>
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := fpga.o irq.o nmi.o setup.o
|
obj-y := fpga.o irq.o nmi.o setup.o
|
||||||
|
|
||||||
obj-$(CONFIG_GPIOLIB) += gpio.o
|
obj-$(CONFIG_GPIOLIB) += gpio.o
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SDK7786 FPGA Support.
|
* SDK7786 FPGA Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SDK7786 FPGA USRGPIR Support.
|
* SDK7786 FPGA USRGPIR Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SDK7786 FPGA IRQ Controller Support.
|
* SDK7786 FPGA IRQ Controller Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Matt Fleming
|
* Copyright (C) 2010 Matt Fleming
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <mach/fpga.h>
|
#include <mach/fpga.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SDK7786 FPGA NMI Support.
|
* SDK7786 FPGA NMI Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Technology Europe SDK7786 Support.
|
* Renesas Technology Europe SDK7786 Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Matt Fleming
|
* Copyright (C) 2010 Matt Fleming
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SDK7786 FPGA SRAM Support.
|
* SDK7786 FPGA SRAM Support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Paul Mundt
|
* Copyright (C) 2010 Paul Mundt
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the 7206 SolutionEngine specific parts of the kernel
|
# Makefile for the 7206 SolutionEngine specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the 7343 SolutionEngine specific parts of the kernel
|
# Makefile for the 7343 SolutionEngine specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Hitachi UL SolutionEngine 7343 FPGA IRQ Support.
|
* Hitachi UL SolutionEngine 7343 FPGA IRQ Support.
|
||||||
*
|
*
|
||||||
|
@ -6,10 +7,6 @@
|
||||||
*
|
*
|
||||||
* Based on linux/arch/sh/boards/se/7343/irq.c
|
* Based on linux/arch/sh/boards/se/7343/irq.c
|
||||||
* Copyright (C) 2007 Nobuhiro Iwamatsu
|
* Copyright (C) 2007 Nobuhiro Iwamatsu
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#define DRV_NAME "SE7343-FPGA"
|
#define DRV_NAME "SE7343-FPGA"
|
||||||
#define pr_fmt(fmt) DRV_NAME ": " fmt
|
#define pr_fmt(fmt) DRV_NAME ": " fmt
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
#
|
#
|
||||||
# Makefile for the 770x SolutionEngine specific parts of the kernel
|
# Makefile for the 770x SolutionEngine specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
obj-y := setup.o irq.o
|
obj-y := setup.o irq.o
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* linux/arch/sh/boards/se/7721/irq.c
|
* linux/arch/sh/boards/se/7721/irq.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Renesas Solutions Corp.
|
* Copyright (C) 2008 Renesas Solutions Corp.
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue