|
Revision tags: v6.15, v6.15-rc7, v6.15-rc6, v6.15-rc5, v6.15-rc4, v6.15-rc3, v6.15-rc2, v6.15-rc1, v6.14, v6.14-rc7, v6.14-rc6, v6.14-rc5, v6.14-rc4, v6.14-rc3, v6.14-rc2, v6.14-rc1 |
|
| #
01157ddc |
| 23-Jan-2025 |
Brian Gerst <[email protected]> |
kallsyms: Remove KALLSYMS_ABSOLUTE_PERCPU
x86-64 was the only user.
Signed-off-by: Brian Gerst <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Reviewed-by: Ard Biesheuvel <ardb@ke
kallsyms: Remove KALLSYMS_ABSOLUTE_PERCPU
x86-64 was the only user.
Signed-off-by: Brian Gerst <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Reviewed-by: Ard Biesheuvel <[email protected]> Cc: Linus Torvalds <[email protected]> Link: https://lore.kernel.org/r/[email protected]
show more ...
|
|
Revision tags: v6.13, v6.13-rc7, v6.13-rc6, v6.13-rc5, v6.13-rc4, v6.13-rc3, v6.13-rc2, v6.13-rc1, v6.12, v6.12-rc7, v6.12-rc6, v6.12-rc5, v6.12-rc4, v6.12-rc3, v6.12-rc2, v6.12-rc1, v6.11, v6.11-rc7 |
|
| #
9a418218 |
| 07-Sep-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: change overflow variable to bool type
Change the 'overflow' variable to bool. Also, remove unnecessary parentheses.
Signed-off-by: Masahiro Yamada <[email protected]>
|
| #
327df5bf |
| 07-Sep-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: squash output_address()
After commit 64e166099b69 ("kallsyms: get rid of code for absolute, kallsyms"), there is only one call site for output_address(). Squash it.
Signed-off-by: Masahir
kallsyms: squash output_address()
After commit 64e166099b69 ("kallsyms: get rid of code for absolute, kallsyms"), there is only one call site for output_address(). Squash it.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
|
Revision tags: v6.11-rc6, v6.11-rc5, v6.11-rc4 |
|
| #
aeaa4283 |
| 12-Aug-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: use xmalloc() and xrealloc()
When malloc() or realloc() fails, there is not much userspace programs can do. xmalloc() and xrealloc() are useful to bail out on a memory allocation failure.
kallsyms: use xmalloc() and xrealloc()
When malloc() or realloc() fails, there is not much userspace programs can do. xmalloc() and xrealloc() are useful to bail out on a memory allocation failure.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
|
Revision tags: v6.11-rc3 |
|
| #
020925ce |
| 07-Aug-2024 |
Song Liu <[email protected]> |
kallsyms: Do not cleanup .llvm.<hash> suffix before sorting symbols
Cleaning up the symbols causes various issues afterwards. Let's sort the list based on original name.
Signed-off-by: Song Liu <so
kallsyms: Do not cleanup .llvm.<hash> suffix before sorting symbols
Cleaning up the symbols causes various issues afterwards. Let's sort the list based on original name.
Signed-off-by: Song Liu <[email protected]> Fixes: 8cc32a9bbf29 ("kallsyms: strip LTO-only suffixes from promoted global functions") Reviewed-by: Masami Hiramatsu (Google) <[email protected]> Tested-by: Masami Hiramatsu (Google) <[email protected]> Acked-by: Petr Mladek <[email protected]> Reviewed-by: Sami Tolvanen <[email protected]> Reviewed-by: Luis Chamberlain <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Kees Cook <[email protected]>
show more ...
|
|
Revision tags: v6.11-rc2, v6.11-rc1 |
|
| #
1a7c8d24 |
| 20-Jul-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: change sym_entry::percpu_absolute to bool type
This field is boolean.
Signed-off-by: Masahiro Yamada <[email protected]>
|
| #
1d48f8fe |
| 20-Jul-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: unify seq and start_pos fields of struct sym_entry
The struct sym_entry uses the 'seq' and 'start_pos' fields to remember the index in the symbol table. They serve the same purpose and are
kallsyms: unify seq and start_pos fields of struct sym_entry
The struct sym_entry uses the 'seq' and 'start_pos' fields to remember the index in the symbol table. They serve the same purpose and are not used simultaneously. Unify them.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
f9c3d671 |
| 20-Jul-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: add more original symbol type/name in comment lines
Commit bea5b7450474 ("kallsyms: expand symbol name into comment for debugging") added the uncompressed type/name in the comment lines of
kallsyms: add more original symbol type/name in comment lines
Commit bea5b7450474 ("kallsyms: expand symbol name into comment for debugging") added the uncompressed type/name in the comment lines of kallsyms_offsets.
It would be useful to do the same for kallsyms_names and kallsyms_seqs_of_names.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
b07e1810 |
| 20-Jul-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: use \t instead of a tab in printf()
This string literal uses a mixture of \t escape sequences and a tab.
Use \t consistently.
Signed-off-by: Masahiro Yamada <[email protected]>
|
| #
bde6fb37 |
| 20-Jul-2024 |
Masahiro Yamada <[email protected]> |
kallsyms: avoid repeated calculation of array size for markers
Introduce the markers_cnt variable for readability.
No functional change intended.
Signed-off-by: Masahiro Yamada <[email protected]
kallsyms: avoid repeated calculation of array size for markers
Introduce the markers_cnt variable for readability.
No functional change intended.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
|
Revision tags: v6.10, v6.10-rc7, v6.10-rc6, v6.10-rc5, v6.10-rc4, v6.10-rc3, v6.10-rc2, v6.10-rc1, v6.9, v6.9-rc7, v6.9-rc6, v6.9-rc5, v6.9-rc4, v6.9-rc3, v6.9-rc2, v6.9-rc1, v6.8, v6.8-rc7, v6.8-rc6 |
|
| #
64e16609 |
| 21-Feb-2024 |
Jann Horn <[email protected]> |
kallsyms: get rid of code for absolute kallsyms
Commit cf8e8658100d ("arch: Remove Itanium (IA-64) architecture") removed the last use of the absolute kallsyms.
Signed-off-by: Jann Horn <jannh@goog
kallsyms: get rid of code for absolute kallsyms
Commit cf8e8658100d ("arch: Remove Itanium (IA-64) architecture") removed the last use of the absolute kallsyms.
Signed-off-by: Jann Horn <[email protected]> Acked-by: Arnd Bergmann <[email protected]> Link: https://lore.kernel.org/all/[email protected]/ [[email protected]: rebase the code and reword the commit description] Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
c442db3f |
| 10-Jun-2024 |
Masahiro Yamada <[email protected]> |
kbuild: remove PROVIDE() for kallsyms symbols
This reimplements commit 951bcae6c5a0 ("kallsyms: Avoid weak references for kallsyms symbols") because I am not a big fan of PROVIDE().
As an alternati
kbuild: remove PROVIDE() for kallsyms symbols
This reimplements commit 951bcae6c5a0 ("kallsyms: Avoid weak references for kallsyms symbols") because I am not a big fan of PROVIDE().
As an alternative solution, this commit prepends one more kallsyms step.
KSYMS .tmp_vmlinux.kallsyms0.S # added AS .tmp_vmlinux.kallsyms0.o # added LD .tmp_vmlinux.btf BTF .btf.vmlinux.bin.o LD .tmp_vmlinux.kallsyms1 NM .tmp_vmlinux.kallsyms1.syms KSYMS .tmp_vmlinux.kallsyms1.S AS .tmp_vmlinux.kallsyms1.o LD .tmp_vmlinux.kallsyms2 NM .tmp_vmlinux.kallsyms2.syms KSYMS .tmp_vmlinux.kallsyms2.S AS .tmp_vmlinux.kallsyms2.o LD vmlinux
Step 0 takes /dev/null as input, and generates .tmp_vmlinux.kallsyms0.o, which has a valid kallsyms format with the empty symbol list, and can be linked to vmlinux. Since it is really small, the added compile-time cost is negligible.
Signed-off-by: Masahiro Yamada <[email protected]> Acked-by: Ard Biesheuvel <[email protected]> Reviewed-by: Nicolas Schier <[email protected]>
show more ...
|
| #
a7f13d0f |
| 21-Mar-2024 |
Kent Overstreet <[email protected]> |
scripts/kallysms: always include __start and __stop symbols
These symbols are used to denote section boundaries: by always including them we can unify loading sections from modules with loading buil
scripts/kallysms: always include __start and __stop symbols
These symbols are used to denote section boundaries: by always including them we can unify loading sections from modules with loading built-in sections, which leads to some significant cleanup.
Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Kent Overstreet <[email protected]> Signed-off-by: Suren Baghdasaryan <[email protected]> Reviewed-by: Kees Cook <[email protected]> Reviewed-by: Pasha Tatashin <[email protected]> Tested-by: Kees Cook <[email protected]> Cc: Alexander Viro <[email protected]> Cc: Alex Gaynor <[email protected]> Cc: Alice Ryhl <[email protected]> Cc: Andreas Hindborg <[email protected]> Cc: Benno Lossin <[email protected]> Cc: "Björn Roy Baron" <[email protected]> Cc: Boqun Feng <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Dennis Zhou <[email protected]> Cc: Gary Guo <[email protected]> Cc: Miguel Ojeda <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Tejun Heo <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Wedson Almeida Filho <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
show more ...
|
|
Revision tags: v6.8-rc5, v6.8-rc4, v6.8-rc3, v6.8-rc2, v6.8-rc1, v6.7, v6.7-rc8, v6.7-rc7, v6.7-rc6, v6.7-rc5, v6.7-rc4, v6.7-rc3, v6.7-rc2, v6.7-rc1, v6.6, v6.6-rc7, v6.6-rc6, v6.6-rc5, v6.6-rc4, v6.6-rc3, v6.6-rc2, v6.6-rc1, v6.5, v6.5-rc7, v6.5-rc6, v6.5-rc5, v6.5-rc4 |
|
| #
23835308 |
| 25-Jul-2023 |
James Clark <[email protected]> |
scripts/kallsyms: Fix build failure by setting errno before calling getline()
getline() returns -1 at EOF as well as on error. It also doesn't set errno to 0 on success, so initialize it to 0 before
scripts/kallsyms: Fix build failure by setting errno before calling getline()
getline() returns -1 at EOF as well as on error. It also doesn't set errno to 0 on success, so initialize it to 0 before using errno to check for an error condition. See the paragraph here [1]:
For some system calls and library functions (e.g., getpriority(2)), -1 is a valid return on success. In such cases, a successful return can be distinguished from an error return by setting errno to zero before the call, and then, if the call returns a status that indicates that an error may have occurred, checking to see if errno has a nonzero value.
Bear has a bug [2] that launches processes with errno set and causes the following build failure:
$ bear -- make LLVM=1 ... LD .tmp_vmlinux.kallsyms1 NM .tmp_vmlinux.kallsyms1.syms KSYMS .tmp_vmlinux.kallsyms1.S read_symbol: Invalid argument
[1]: https://linux.die.net/man/3/errno [2]: https://github.com/rizsotto/Bear/issues/469
Fixes: 1c975da56a6f ("scripts/kallsyms: remove KSYM_NAME_LEN_BUFFER") Reviewed-by: Miguel Ojeda <[email protected]> Signed-off-by: James Clark <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
|
Revision tags: v6.5-rc3, v6.5-rc2, v6.5-rc1 |
|
| #
8cc32a9b |
| 28-Jun-2023 |
Yonghong Song <[email protected]> |
kallsyms: strip LTO-only suffixes from promoted global functions
Commit 6eb4bd92c1ce ("kallsyms: strip LTO suffixes from static functions") stripped all function/variable suffixes started with '.' r
kallsyms: strip LTO-only suffixes from promoted global functions
Commit 6eb4bd92c1ce ("kallsyms: strip LTO suffixes from static functions") stripped all function/variable suffixes started with '.' regardless of whether those suffixes are generated at LTO mode or not. In fact, as far as I know, in LTO mode, when a static function/variable is promoted to the global scope, '.llvm.<...>' suffix is added.
The existing mechanism breaks live patch for a LTO kernel even if no <symbol>.llvm.<...> symbols are involved. For example, for the following kernel symbols: $ grep bpf_verifier_vlog /proc/kallsyms ffffffff81549f60 t bpf_verifier_vlog ffffffff8268b430 d bpf_verifier_vlog._entry ffffffff8282a958 d bpf_verifier_vlog._entry_ptr ffffffff82e12a1f d bpf_verifier_vlog.__already_done 'bpf_verifier_vlog' is a static function. '_entry', '_entry_ptr' and '__already_done' are static variables used inside 'bpf_verifier_vlog', so llvm promotes them to file-level static with prefix 'bpf_verifier_vlog.'. Note that the func-level to file-level static function promotion also happens without LTO.
Given a symbol name 'bpf_verifier_vlog', with LTO kernel, current mechanism will return 4 symbols to live patch subsystem which current live patching subsystem cannot handle it. With non-LTO kernel, only one symbol is returned.
In [1], we have a lengthy discussion, the suggestion is to separate two cases: (1). new symbols with suffix which are generated regardless of whether LTO is enabled or not, and (2). new symbols with suffix generated only when LTO is enabled.
The cleanup_symbol_name() should only remove suffixes for case (2). Case (1) should not be changed so it can work uniformly with or without LTO.
This patch removed LTO-only suffix '.llvm.<...>' so live patching and tracing should work the same way for non-LTO kernel. The cleanup_symbol_name() in scripts/kallsyms.c is also changed to have the same filtering pattern so both kernel and kallsyms tool have the same expectation on the order of symbols.
[1] https://lore.kernel.org/live-patching/[email protected]/T/#u
Fixes: 6eb4bd92c1ce ("kallsyms: strip LTO suffixes from static functions") Reported-by: Song Liu <[email protected]> Signed-off-by: Yonghong Song <[email protected]> Reviewed-by: Zhen Lei <[email protected]> Reviewed-by: Nick Desaulniers <[email protected]> Acked-by: Song Liu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Kees Cook <[email protected]>
show more ...
|
|
Revision tags: v6.4, v6.4-rc7, v6.4-rc6 |
|
| #
1c975da5 |
| 05-Jun-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: remove KSYM_NAME_LEN_BUFFER
You do not need to decide the buffer size statically.
Use getline() to grow the line buffer as needed.
Signed-off-by: Masahiro Yamada <masahiroy@kerne
scripts/kallsyms: remove KSYM_NAME_LEN_BUFFER
You do not need to decide the buffer size statically.
Use getline() to grow the line buffer as needed.
Signed-off-by: Masahiro Yamada <[email protected]> Reviewed-by: Nicolas Schier <[email protected]>
show more ...
|
| #
92e74fb6 |
| 05-Jun-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: constify long_options
getopt_long() does not modify this.
Signed-off-by: Masahiro Yamada <[email protected]> Reviewed-by: Nicolas Schier <[email protected]>
|
|
Revision tags: v6.4-rc5, v6.4-rc4, v6.4-rc3, v6.4-rc2, v6.4-rc1, v6.3, v6.3-rc7, v6.3-rc6, v6.3-rc5, v6.3-rc4, v6.3-rc3, v6.3-rc2 |
|
| #
79549da6 |
| 08-Mar-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: update the usage in the comment block
Commit 010a0aad39fc ("kallsyms: Correctly sequence symbols when CONFIG_LTO_CLANG=y") added --lto-clang, and updated the usage() function, but
scripts/kallsyms: update the usage in the comment block
Commit 010a0aad39fc ("kallsyms: Correctly sequence symbols when CONFIG_LTO_CLANG=y") added --lto-clang, and updated the usage() function, but not the comment. Update it in the same way.
Signed-off-by: Masahiro Yamada <[email protected]> Reviewed-by: Nick Desaulniers <[email protected]>
show more ...
|
| #
dd1553b8 |
| 08-Mar-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: decrease expand_symbol() / cleanup_symbol_name() calls
Currently, expand_symbol() is called many times to get the uncompressed symbol names for sorting, and also for adding comment
scripts/kallsyms: decrease expand_symbol() / cleanup_symbol_name() calls
Currently, expand_symbol() is called many times to get the uncompressed symbol names for sorting, and also for adding comments.
With the output order shuffled in the previous commit, the symbol data are now written in the following order:
(1) kallsyms_num_syms (2) kallsyms_names <-- need compressed names (3) kallsyms_markers (4) kallsyms_token_table (5) kallsyms_token_index (6) kallsyms_addressed / kallsyms_offsets <-- need uncompressed names (for commenting) (7) kallsyms_relative_base (8) kallsyms_seq_of_names <-- need uncompressed names (for sorting)
The compressed names are only needed by (2).
Call expand_symbol() between (2) and (3) to restore the original symbol names. This requires just one expand_symbol() call for each symbol.
Call cleanup_symbol_name() between (7) and (8) instead of during sorting. It is allowed to overwrite the ->sym field because (8) just outputs the index instead of the name of each symbol. Again, this requires just one cleanup_symbol_name() call for each symbol.
This refactoring makes it ~30% faster.
[Before]
$ time scripts/kallsyms --all-symbols --absolute-percpu --base-relative \ .tmp_vmlinux.kallsyms2.syms >/dev/null
real 0m1.027s user 0m1.010s sys 0m0.016s
[After]
$ time scripts/kallsyms --all-symbols --absolute-percpu --base-relative \ .tmp_vmlinux.kallsyms2.syms >/dev/null
real 0m0.717s user 0m0.717s sys 0m0.000s
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
404bad70 |
| 08-Mar-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: change the output order
Currently, this tool outputs symbol data in the following order.
(1) kallsyms_addressed / kallsyms_offsets (2) kallsyms_relative_base (3) kallsyms_num_s
scripts/kallsyms: change the output order
Currently, this tool outputs symbol data in the following order.
(1) kallsyms_addressed / kallsyms_offsets (2) kallsyms_relative_base (3) kallsyms_num_syms (4) kallsyms_names (5) kallsyms_markers (6) kallsyms_seq_of_names (7) kallsyms_token_table (8) kallsyms_token_index
This commit changes the order as follows:
(1) kallsyms_num_syms (2) kallsyms_names (3) kallsyms_markers (4) kallsyms_token_table (5) kallsyms_token_index (6) kallsyms_addressed / kallsyms_offsets (7) kallsyms_relative_base (8) kallsyms_seq_of_names
The motivation is to decrease the number of function calls to expand_symbol() and cleanup_symbol_name().
The compressed names are only required for writing 'kallsyms_names'. If you do this first, we can restore the original symbol names. You do not need to repeat the same operation over again.
The actual refactoring will happen in the next commit.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
320e7c9d |
| 08-Mar-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: move compiler-generated symbol patterns to mksysmap
scripts/kallsyms.c maintains compiler-generated symbols, but we end up with something similar in scripts/mksysmap to avoid the "
scripts/kallsyms: move compiler-generated symbol patterns to mksysmap
scripts/kallsyms.c maintains compiler-generated symbols, but we end up with something similar in scripts/mksysmap to avoid the "Inconsistent kallsyms data" error. For example, commit c17a2538704f ("mksysmap: Fix the mismatch of 'L0' symbols in System.map").
They were separately maintained prior to commit 94ff2f63d6a3 ("kbuild: reuse mksysmap output for kallsyms").
Now that scripts/kallsyms.c parses the output of scripts/mksysmap, it makes more sense to collect all the ignored patterns to mksysmap.
Signed-off-by: Masahiro Yamada <[email protected]> Reviewed-by: Nick Desaulniers <[email protected]>
show more ...
|
| #
ca09bf48 |
| 08-Mar-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: exclude symbols generated by itself dynamically
Drop the symbols generated by scripts/kallsyms itself automatically instead of maintaining the symbol list manually.
Pass the kalls
scripts/kallsyms: exclude symbols generated by itself dynamically
Drop the symbols generated by scripts/kallsyms itself automatically instead of maintaining the symbol list manually.
Pass the kallsyms object from the previous kallsyms step (if it exists) as the third parameter of scripts/mksysmap, which will weed out the generated symbols from the input to the next kallsyms step.
Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
a7b00a18 |
| 08-Mar-2023 |
Masahiro Yamada <[email protected]> |
scripts/kallsyms: remove redundant code for omitting U and N
The symbol types 'U' and 'N' are already filtered out by the following line in scripts/mksysmap:
-e ' [aNUw] '
Signed-off-by: Masah
scripts/kallsyms: remove redundant code for omitting U and N
The symbol types 'U' and 'N' are already filtered out by the following line in scripts/mksysmap:
-e ' [aNUw] '
Signed-off-by: Masahiro Yamada <[email protected]> Reviewed-by: Nick Desaulniers <[email protected]>
show more ...
|
| #
bea5b745 |
| 06-Mar-2023 |
Arnd Bergmann <[email protected]> |
kallsyms: expand symbol name into comment for debugging
The assembler output of kallsyms.c is not meant for people to understand, and is generally not helpful when debugging "Inconsistent kallsyms d
kallsyms: expand symbol name into comment for debugging
The assembler output of kallsyms.c is not meant for people to understand, and is generally not helpful when debugging "Inconsistent kallsyms data" warnings. I have previously struggled with these, but found it helpful to list which symbols changed between the first and second pass in the .tmp_vmlinux.kallsyms*.S files.
As this file is preprocessed, it's possible to add a C-style multiline comment with the full type/name tuple.
Signed-off-by: Arnd Bergmann <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|
| #
ced0f245 |
| 06-Mar-2023 |
Arnd Bergmann <[email protected]> |
kallsyms: add kallsyms_seqs_of_names to list of special symbols
My randconfig build setup ran into another kallsyms warning:
Inconsistent kallsyms data Try make KALLSYMS_EXTRA_PASS=1 as a workaroun
kallsyms: add kallsyms_seqs_of_names to list of special symbols
My randconfig build setup ran into another kallsyms warning:
Inconsistent kallsyms data Try make KALLSYMS_EXTRA_PASS=1 as a workaround
After adding some debugging code to kallsyms.c, I saw that the recently added kallsyms_seqs_of_names symbol can sometimes cause the second stage table to be slightly longer than the first stage, which makes the build inconsistent.
Add it to the exception table that contains all other kallsyms-generated symbols.
Fixes: 60443c88f3a8 ("kallsyms: Improve the performance of kallsyms_lookup_name()") Signed-off-by: Arnd Bergmann <[email protected]> Reviewed-by: Zhen Lei <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
show more ...
|