Merge "Add __riscv_flush_icache() to <sys/cachectl.h>." into main am: a09f741c2a
am: 953b78a72d
am: 1cb2c81563
am: 7a62037690
am: 6efb89a064
Original change: https://android-review.googlesource.com/c/platform/bionic/+/2655793 Change-Id: I4917bb4c2c8b139f6f99221e8b29305177b55054 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
commit
ab17456006
7 changed files with 70 additions and 7 deletions
|
@ -62,6 +62,7 @@ New libc functions in V (API level 35):
|
|||
functions for avoiding $TZ if you need to use multiple timezones in
|
||||
multi-threaded C).
|
||||
* `mbsrtowcs_l` and `wcsrtombs_l` aliases for `mbsrtowcs` and `wcsrtombs`.
|
||||
* New system call wrapper: `__riscv_flush_icache` (`<sys/cachectl.h>`).
|
||||
|
||||
New libc functions in U (API level 34):
|
||||
* `close_range` and `copy_file_range` (Linux-specific GNU extensions).
|
||||
|
|
|
@ -356,7 +356,7 @@ int __set_tls:__ARM_NR_set_tls(void*) arm
|
|||
int cacheflush:__ARM_NR_cacheflush(long start, long end, long flags) arm
|
||||
|
||||
# riscv64-specific
|
||||
int _flush_icache:riscv_flush_icache(void*, void*, unsigned long) riscv64
|
||||
int __riscv_flush_icache:riscv_flush_icache(void*, void*, unsigned long) riscv64
|
||||
|
||||
# x86-specific
|
||||
int __set_thread_area:set_thread_area(void*) x86
|
||||
|
|
|
@ -28,6 +28,27 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
* @file sys/cachectl.h
|
||||
* @brief Architecture-specific cache control.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
/* This header file is obsolete. */
|
||||
__BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* Flag for __riscv_flush_icache() to indicate that only the current
|
||||
* thread's instruction cache needs to be flushed (rather than the
|
||||
* default of all threads).
|
||||
*/
|
||||
#define SYS_RISCV_FLUSH_ICACHE_LOCAL 1UL
|
||||
|
||||
/**
|
||||
* __riscv_flush_icache(2) flushes the instruction cache for the given range of addresses.
|
||||
*
|
||||
* Returns 0 on success, and returns -1 and sets `errno` on failure.
|
||||
*/
|
||||
int __riscv_flush_icache(void* __start, void* __end, unsigned long __flags);
|
||||
|
||||
__END_DECLS
|
||||
|
|
|
@ -1589,6 +1589,7 @@ LIBC_V { # introduced=VanillaIceCream
|
|||
localtime_rz;
|
||||
mbsrtowcs_l;
|
||||
mktime_z;
|
||||
__riscv_flush_icache; # riscv64
|
||||
timespec_getres;
|
||||
tzalloc;
|
||||
tzfree;
|
||||
|
|
|
@ -227,11 +227,6 @@ def add_footer(pointer_length, stub, syscall):
|
|||
aliases = syscall["aliases"]
|
||||
for alias in aliases:
|
||||
stub += "\nALIAS_SYMBOL(%s, %s)\n" % (alias, syscall["func"])
|
||||
|
||||
# Use hidden visibility on LP64 for any functions beginning with underscores.
|
||||
if pointer_length == 64 and syscall["func"].startswith("__"):
|
||||
stub += '.hidden ' + syscall["func"] + '\n'
|
||||
|
||||
return stub
|
||||
|
||||
|
||||
|
|
|
@ -470,6 +470,7 @@ cc_test_library {
|
|||
"struct_layout_test.cpp",
|
||||
"sstream_test.cpp",
|
||||
"sys_auxv_test.cpp",
|
||||
"sys_cachectl_test.cpp",
|
||||
"sys_epoll_test.cpp",
|
||||
"sys_mman_test.cpp",
|
||||
"sys_msg_test.cpp",
|
||||
|
|
44
tests/sys_cachectl_test.cpp
Normal file
44
tests/sys_cachectl_test.cpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#if __has_include(<sys/cachectl.h>)
|
||||
#include <sys/cachectl.h>
|
||||
#endif
|
||||
|
||||
TEST(sys_cachectl, __riscv_flush_icache) {
|
||||
#if defined(__riscv) && __has_include(<sys/cachectl.h>)
|
||||
// As of Linux 6.4, the address range is ignored (so nullptr is fine),
|
||||
// and the flags you actually want are 0 ("all threads"),
|
||||
// but we test the unusual flag just to make sure it works.
|
||||
ASSERT_EQ(0, __riscv_flush_icache(nullptr, nullptr, SYS_RISCV_FLUSH_ICACHE_LOCAL));
|
||||
#else
|
||||
GTEST_SKIP() << "__riscv_flush_icache requires riscv64";
|
||||
#endif
|
||||
}
|
Loading…
Reference in a new issue