diff -Nru gcr-3.38.1/AUTHORS gcr-3.40.0/AUTHORS --- gcr-3.38.1/AUTHORS 2021-01-12 22:55:54.635056000 +0000 +++ gcr-3.40.0/AUTHORS 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -Questions to: -Gnome Keyring Mailing List - -Main authors: -Stef Walter diff -Nru gcr-3.38.1/autogen.sh gcr-3.40.0/autogen.sh --- gcr-3.38.1/autogen.sh 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/autogen.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. -test -n "$srcdir" || srcdir=`dirname "$0"` -test -n "$srcdir" || srcdir=. - -olddir=`pwd` - -cd $srcdir - -(test -f configure.ac) || { - echo "*** ERROR: Directory "\`$srcdir\'" does not look like the top-level project directory ***" - exit 1 -} - -PKG_NAME=`autoconf --trace 'AC_INIT:$1' configure.ac` - -if [ "$#" = 0 -a "x$NOCONFIGURE" = "x" ]; then - echo "*** WARNING: I am going to run \`configure' with no arguments." >&2 - echo "*** If you wish to pass any to it, please specify them on the" >&2 - echo "*** \`$0\' command line." >&2 - echo "" >&2 -fi - -aclocal --install || exit 1 -gtkdocize --copy || exit 1 -autoreconf --verbose --force --install || exit 1 - -cd $olddir -if [ "$NOCONFIGURE" = "" ]; then - $srcdir/configure "$@" || exit 1 - - if [ "$1" = "--help" ]; then - exit 0 - else - echo "Now type \`make\' to compile $PKG_NAME" || exit 1 - fi -else - echo "Skipping configure process." -fi - -# Put a redirect makefile here -if [ ! -f $srcdir/Makefile ]; then - cat $srcdir/build/Makefile.redirect > $srcdir/Makefile - printf "\nREDIRECT = %s\n" "$(realpath $olddir)" >> $srcdir/Makefile -fi diff -Nru gcr-3.38.1/build/enum-template.c gcr-3.40.0/build/enum-template.c --- gcr-3.38.1/build/enum-template.c 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/enum-template.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/*** BEGIN file-header ***/ - -#include - -/*** END file-header ***/ - -/*** BEGIN file-production ***/ -#include "@filename@" -/* enumerations from "@filename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -GType @enum_name@_get_type (void) G_GNUC_CONST; - -GType -@enum_name@_get_type (void) -{ - static GType etype = 0; - if (G_UNLIKELY(etype == 0)) { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL } - }; - etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - } - return etype; -} - -/*** END value-tail ***/ - -/*** BEGIN file-tail ***/ - /**/ -/*** END file-tail ***/ diff -Nru gcr-3.38.1/build/enum-template.h gcr-3.40.0/build/enum-template.h --- gcr-3.38.1/build/enum-template.h 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/enum-template.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -/*** BEGIN file-header ***/ - -#include - -G_BEGIN_DECLS -/*** END file-header ***/ - -/*** BEGIN file-production ***/ - -/* enumerations from "@filename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -#ifndef @ENUMPREFIX@_TYPE_@ENUMSHORT@ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) -#endif - -/*** END value-header ***/ - -/*** BEGIN file-tail ***/ -G_END_DECLS - -/*** END file-tail ***/ diff -Nru gcr-3.38.1/build/gcr.supp gcr-3.40.0/build/gcr.supp --- gcr-3.38.1/build/gcr.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/gcr.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -{ - gcr_pkcs11_set_trust_store_uri - Memcheck:Leak - ... - fun:g_strdup - fun:gcr_pkcs11_set_trust_store_uri -} -{ - gcr_pkcs11_set_trust_lookup_uris - Memcheck:Leak - ... - fun:g_strdupv - fun:gcr_pkcs11_set_trust_lookup_uris -} diff -Nru gcr-3.38.1/build/gcrypt.supp gcr-3.40.0/build/gcrypt.supp --- gcr-3.38.1/build/gcrypt.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/gcrypt.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -{ - gpg_err_init - Memcheck:Leak - ... - fun:gpg_err_init -} -{ - _gcry_module_add - Memcheck:Leak - ... - fun:_gcry_module_add -} -{ - _gcry_rngcsprng_create_nonce - Memcheck:Leak - ... - fun:_gcry_malloc - ... - fun:initialize - fun:_gcry_rngcsprng_create_nonce -} -{ - _gcry_rngcsprng_create_nonce - Memcheck:Leak - ... - fun:_gcry_malloc - ... - fun:initialize - fun:_gcry_rngcsprng_randomize -} -{ - gcry_control__init - Memcheck:Leak - ... - fun:glib_thread_mutex_init - ... - fun:_gcry_vcontrol - fun:gcry_control -} diff -Nru gcr-3.38.1/build/gdbus-unbreak-codegen gcr-3.40.0/build/gdbus-unbreak-codegen --- gcr-3.38.1/build/gdbus-unbreak-codegen 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/gdbus-unbreak-codegen 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#!/bin/sh - -set -uef - -generate_c_code= -next_arg_is_name="no" - -for arg in "$@"; do - if [ "$next_arg_is_name" = "yes" ]; then - generate_c_code="$arg" - next_arg_is_name="no" - continue - fi - case "$arg" in - --generate-c-code) - next_arg_is_name="yes" - ;; - --generate-c-code=*) - generate_c_code="${arg#--generate-c-code=}" - ;; - esac -done - -gdbus-codegen "$@" - -if [ -n "$generate_c_code" ]; then - # HACK: This is a work around for gdbus-codegen crashing when - # we build with GLIB_VERSION_MAX_ALLOWED. See: - # https://bugzilla.gnome.org/show_bug.cgi?id=710133 - sed -e '1i\ -#ifdef GLIB_VERSION_MAX_ALLOWED\ -#undef GLIB_VERSION_MAX_ALLOWED\ -#endif' \ - "$generate_c_code.c" > "$generate_c_code.$$" - mv "$generate_c_code.$$" "$generate_c_code.c" -fi diff -Nru gcr-3.38.1/build/g-ir-unbreak.xsl gcr-3.40.0/build/g-ir-unbreak.xsl --- gcr-3.38.1/build/g-ir-unbreak.xsl 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/g-ir-unbreak.xsl 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - get_der_data - - - - - - - - - - - diff -Nru gcr-3.38.1/build/glibc.supp gcr-3.40.0/build/glibc.supp --- gcr-3.38.1/build/glibc.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/glibc.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -{ - dlclose - Memcheck:Leak - ... - fun:dlclose -} -{ - dlopen - Memcheck:Leak - ... - fun:_dlerror_run - fun:dlopen@@GLIBC_2.2.5 -} diff -Nru gcr-3.38.1/build/glib.supp gcr-3.40.0/build/glib.supp --- gcr-3.38.1/build/glib.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/glib.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,419 +0,0 @@ -{ - g_type_register_static_1 - Memcheck:Leak - ... - fun:g_type_register_static -} -{ - g_type_register_fundamental - Memcheck:Leak - ... - fun:g_type_register_fundamental -} -{ - g_type_init_with_debug_flags - Memcheck:Leak - ... - fun:g_type_init_with_debug_flags -} -{ - g_type_class_ref - Memcheck:Leak - ... - fun:g_type_class_ref -} -{ - g_type_add_interface_static - Memcheck:Leak - ... - fun:g_type_add_interface_static -} -{ - g_param_spec_internal - Memcheck:Leak - ... - fun:g_type_class_ref - fun:g_type_create_instance - fun:g_param_spec_internal -} -{ - g_param_spec_enum - Memcheck:Leak - ... - fun:g_type_class_ref - fun:g_param_spec_enum -} -{ - g_param_spec_flags - Memcheck:Leak - ... - fun:g_type_class_ref - fun:g_param_spec_flags -} -{ - g_quark_from_static_string - Memcheck:Leak - ... - fun:g_quark_from_static_string -} -{ - g_quark_from_string - Memcheck:Leak - ... - fun:g_quark_from_string -} -{ - g_value_register_transform_func - Memcheck:Leak - ... - fun:g_value_register_transform_func -} -{ - test_run_seed - Memcheck:Leak - ... - fun:g_rand_new_with_seed_array - fun:test_run_seed - ... - fun:g_test_run_suite -} -{ - g_test_init - Memcheck:Leak - ... - fun:g_test_init -} -{ - g_intern_static_string - Memcheck:Leak - ... - fun:g_intern_static_string -} -{ - g_main_context_push_thread_default - Memcheck:Leak - ... - fun:g_queue_new - fun:g_main_context_push_thread_default -} -{ - g_dbus_error_register_error - Memcheck:Leak - ... - fun:g_dbus_error_register_error -} -{ - g_param_spec_pool_insert - Memcheck:Leak - ... - fun:g_param_spec_pool_insert -} -{ - g_main_context_default - Memcheck:Leak - ... - fun:g_main_context_default -} -{ - g_main_context_check - Memcheck:Leak - ... - fun:g_ptr_array_add - fun:g_main_context_check -} -{ - g_test_run_suite - Memcheck:Leak - ... - fun:g_slist_copy - fun:g_test_run_suite_internal - fun:g_test_run_suite -} -{ - g_dbus_interface_info_cache_build - Memcheck:Leak - ... - fun:g_dbus_interface_info_cache_build -} -{ - g_cancellable_push_current - Memcheck:Leak - ... - fun:thread_memory_from_self - ... - fun:g_cancellable_push_current -} -{ - g_io_scheduler_push_job - Memcheck:Leak - ... - fun:init_scheduler - fun:g_once_impl - fun:g_io_scheduler_push_job -} -{ - g_io_scheduler_push_job_2 - Memcheck:Leak - ... - fun:g_system_thread_new - ... - fun:g_io_scheduler_push_job -} -{ - g_bus_get_sync__available_connections - Memcheck:Leak - ... - fun:g_hash_table_new - fun:initable_init - fun:g_initable_init - fun:g_bus_get_sync -} -{ - g_socket_connection_factory_register_type - Memcheck:Leak - ... - fun:g_socket_connection_factory_register_type -} -{ - g_test_add_vtable - Memcheck:Leak - ... - fun:g_test_add_vtable -} -{ - g_mutex_lock - Memcheck:Leak - ... - fun:g_mutex_impl_new - fun:g_mutex_get_impl - fun:g_mutex_lock -} -{ - g_thread_self - Memcheck:Leak - ... - fun:g_thread_self -} -{ - g_rec_mutex_lock - Memcheck:Leak - ... - fun:g_rec_mutex_impl_new - fun:g_rec_mutex_get_impl - fun:g_rec_mutex_lock -} -{ - test_case_run - Memcheck:Leak - ... - fun:g_malloc0 - fun:test_case_run - ... - fun:g_test_run_suite -} -{ - g_get_charset - Memcheck:Leak - ... - fun:g_get_charset -} -{ - g_test_run_suite__timer_new - Memcheck:Leak - ... - fun:g_timer_new - fun:test_case_run - ... - fun:g_test_run_suite -} -{ - g_test_run_suite__timer_new2 - Memcheck:Leak - ... - fun:g_timer_new - fun:test_case_run* - ... - fun:g_test_run_suite -} -{ - g_test_run_suite__strconcat - Memcheck:Leak - ... - fun:g_strconcat - fun:test_case_run - ... - fun:g_test_run_suite - fun:g_test_run -} -{ - g_type_interface_add_prerequisite - Memcheck:Leak - ... - fun:g_type_interface_add_prerequisite -} -{ - g_test_run_suite_2 - Memcheck:Leak - ... - fun:g_slist_copy - fun:g_test_run_suite_internal - ... - fun:g_test_run_suite -} -{ - g_test_run_suite_3 - Memcheck:Leak - ... - fun:g_malloc0 - fun:g_test_run_suite_internal - ... - fun:g_test_run_suite -} -{ - g_set_prgname - Memcheck:Leak - ... - fun:g_set_prgname -} -{ - g_test_run_suite__strconcat_2 - Memcheck:Leak - ... - fun:g_strconcat - fun:g_test_run_suite_internal -} -{ - g_test_run_suite__strdup - Memcheck:Leak - ... - fun:g_strdup - fun:g_test_run_suite_internal -} -{ - g_private_get - Memcheck:Leak - ... - fun:g_private_get -} -{ - g_private_set - Memcheck:Leak - ... - fun:g_private_set -} -{ - g_static_private_set_1 - Memcheck:Leak - ... - fun:g_array_set_size - fun:g_static_private_set -} -{ - g_static_private_set_2 - Memcheck:Leak - ... - fun:g_array_sized_new - fun:g_static_private_set -} -{ - g_static_mutex_get_mutex_impl - Memcheck:Leak - ... - fun:g_static_mutex_get_mutex_impl -} -{ - g_variant_type_info_unref - Memcheck:Leak - ... - fun:g_hash_table_remove - fun:g_variant_type_info_unref -} -{ - g_get_filename_charsets - Memcheck:Leak - ... - fun:g_get_filename_charsets -} -{ - g_intern_string - Memcheck:Leak - ... - fun:g_intern_string -} -{ - g_main_context_iterate - Memcheck:Leak - ... - fun:g_malloc - fun:g_main_context_iterate -} -{ - g_main_context_dispatch - Memcheck:Leak - ... - fun:get_dispatch - fun:g_main_context_dispatch -} -{ - g_log_set_handler - Memcheck:Leak - ... - fun:g_log_set_handler -} -{ - g_simple_async_result_complete - Memcheck:Leak - ... - fun:g_main_context_push_thread_default - fun:g_simple_async_result_complete -} -{ - - Memcheck:Leak - ... - fun:g_static_private_set - fun:g_module_open -} -{ - g_child_watch_source_new - Memcheck:Leak - ... - fun:ensure_unix_signal_handler_installed_unlocked - fun:g_child_watch_source_new -} -{ - g_thread_pool_thread_proxy - Memcheck:Leak - ... - fun:g_malloc - fun:g_cond_new_posix_impl - ... - fun:g_async_queue_timed_pop - fun:g_thread_pool_thread_proxy -} -{ - g_module_open - Memcheck:Leak - ... - fun:g_private_impl_new - ... - fun:g_module_open -} -{ - g_system_thread_new - Memcheck:Leak - ... - fun:g_system_thread_new -} -{ - thread_memory_from_self - Memcheck:Leak - ... - fun:thread_memory_from_self -} -{ - g_get_language_names - Memcheck:Leak - ... - fun:g_get_language_names -} diff -Nru gcr-3.38.1/build/m4/.gitignore gcr-3.40.0/build/m4/.gitignore --- gcr-3.38.1/build/m4/.gitignore 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/m4/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -*.m4 diff -Nru gcr-3.38.1/build/Makefile.redirect gcr-3.40.0/build/Makefile.redirect --- gcr-3.38.1/build/Makefile.redirect 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/Makefile.redirect 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -# This redirects all make targets to builddir -all: - $(MAKE) -C $(REDIRECT) all -%: - $(MAKE) -C $(REDIRECT) $@ -ifeq ($(MAKEFLAGS), ) -JOBARG = -j4 -endif -# REDIRECT=build diff -Nru gcr-3.38.1/build/p11-kit.supp gcr-3.40.0/build/p11-kit.supp --- gcr-3.38.1/build/p11-kit.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/p11-kit.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -{ - _p11_library_get_thread_local - Memcheck:Leak - ... - fun:_p11_library_get_thread_local -} diff -Nru gcr-3.38.1/build/pixman.supp gcr-3.40.0/build/pixman.supp --- gcr-3.38.1/build/pixman.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/pixman.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -{ - pixman - Memcheck:Leak - fun:malloc - obj:/usr/lib64/libpixman-1.so.0.22.2 -} diff -Nru gcr-3.38.1/build/pthread.supp gcr-3.40.0/build/pthread.supp --- gcr-3.38.1/build/pthread.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/pthread.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -{ - _dl_allocate_tls - Memcheck:Leak - ... - fun:_dl_allocate_tls - fun:pthread_create* -} diff -Nru gcr-3.38.1/build/tap-driver gcr-3.40.0/build/tap-driver --- gcr-3.38.1/build/tap-driver 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/tap-driver 1970-01-01 00:00:00.000000000 +0000 @@ -1,425 +0,0 @@ -#!/usr/bin/python3 -# This can also be run with Python 2. - -# Copyright (C) 2013 Red Hat, Inc. -# -# Cockpit is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; either version 2.1 of the License, or -# (at your option) any later version. -# -# Cockpit 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with Cockpit; If not, see . - -# -# This is a TAP driver for automake -# -# In particular it leaves stderr untouched, and is cleaner than the -# one implemented in shell that is making the rounds. -# -# This implements the automake "Custom Test Driver" protocol: -# https://www.gnu.org/software/automake/manual/html_node/Custom-Test-Drivers.html -# -# This consumes the Test Anything Protocol (ie: TAP) -# https://metacpan.org/pod/release/PETDANCE/Test-Harness-2.64/lib/Test/Harness/TAP.pod -# - -import argparse -import fcntl -import os -import select -import struct -import subprocess -import sys -import termios -import errno - -_PY3 = sys.version[0] >= '3' -_str = _PY3 and str or unicode - -def out(data, stream=None, flush=False): - if not isinstance(data, bytes): - data = data.encode("UTF-8") - if not stream: - stream = _PY3 and sys.stdout.buffer or sys.stdout - while True: - try: - if data: - stream.write(data) - data = None - if flush: - stream.flush() - flush = False - break - except IOError as e: - if e.errno == errno.EAGAIN: - continue - raise - -def terminal_width(): - try: - h, w, hp, wp = struct.unpack('HHHH', - fcntl.ioctl(1, termios.TIOCGWINSZ, - struct.pack('HHHH', 0, 0, 0, 0))) - return w - except IOError as e: - if e.errno != errno.ENOTTY: - sys.stderr.write("%i %s %s\n" % (e.errno, e.strerror, sys.exc_info())) - return sys.maxsize - -class Driver: - def __init__(self, args): - self.argv = args.command - self.test_name = args.test_name - self.log = open(args.log_file, "wb", 0) - self.log.write(("# %s\n" % " ".join(sys.argv)).encode("UTF-8")) - self.trs = open(args.trs_file, "w", 1) - self.color_tests = args.color_tests - self.expect_failure = args.expect_failure - self.width = terminal_width() - 9 - - def report(self, code, *args): - CODES = { - "XPASS": '\x1b[0;31m', # red - "FAIL": '\x1b[0;31m', # red - "PASS": '\x1b[0;32m', # grn - "XFAIL": '\x1b[1;32m', # lgn - "SKIP": '\x1b[1;34m', # blu - "ERROR": '\x1b[0;35m', # mgn - } - - # Print out to console - if self.color_tests: - if code in CODES: - out(CODES[code]) - out(code) - if self.color_tests: - out('\x1b[m') - out(": ") - msg = "".join([ self.test_name + " " ] + list(map(_str, args))) - if code == "PASS" and len(msg) > self.width: - out(msg[:self.width]) - out("...") - else: - out(msg) - out("\n", flush=True) - - # Book keeping - if code in CODES: - self.trs.write(":test-result: %s\n" % code) - - def result_pass(self, *args): - if self.expect_failure: - self.report("XPASS", *args) - else: - self.report("PASS", *args) - - def result_fail(self, *args): - if self.expect_failure: - self.report("XFAIL", *args) - else: - self.report("FAIL", *args) - - def result_skip(self, *args): - if self.expect_failure: - self.report("XFAIL", *args) - else: - self.report("SKIP", *args) - - def report_error(self, description=""): - self.report("ERROR", "", description) - - def process(self, output): - pass - - def execute(self): - try: - proc = subprocess.Popen(self.argv, close_fds=True, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - except OSError as ex: - self.report_error("Couldn't run %s: %s" % (self.argv[0], str(ex))) - return - - proc.stdin.close() - outf = proc.stdout.fileno() - errf = proc.stderr.fileno() - rset = [outf, errf] - while len(rset) > 0: - ret = select.select(rset, [], [], 10) - if outf in ret[0]: - data = os.read(outf, 1024) - if data == b"": - rset.remove(outf) - self.log.write(data) - self.process(data) - if errf in ret[0]: - data = os.read(errf, 1024) - if data == b"": - rset.remove(errf) - self.log.write(data) - stream = _PY3 and sys.stderr.buffer or sys.stderr - out(data, stream=stream, flush=True) - - proc.wait() - - # Make sure the test didn't change blocking output - assert fcntl.fcntl(0, fcntl.F_GETFL) & os.O_NONBLOCK == 0 - assert fcntl.fcntl(1, fcntl.F_GETFL) & os.O_NONBLOCK == 0 - assert fcntl.fcntl(2, fcntl.F_GETFL) & os.O_NONBLOCK == 0 - - return proc.returncode - - -class TapDriver(Driver): - def __init__(self, args): - Driver.__init__(self, args) - self.output = "" - self.reported = { } - self.test_plan = None - self.late_plan = False - self.errored = False - self.bail_out = False - self.skip_all_reason = None - - def report(self, code, num, *args): - if num: - Driver.report(self, code, num, " ", *args) - self.reported[num] = code - else: - Driver.report(self, code, *args) - if code == "ERROR": - self.errored = True - - def consume_test_line(self, ok, data): - # It's an error if the caller sends a test plan in the middle of tests - if self.late_plan: - self.report_error("Got tests after late TAP test plan") - self.late_plan = False - - # Parse out a number and then description - (num, unused, description) = data.partition(" ") - try: - num = int(num) - except ValueError: - self.report_error("Invalid test number: %s" % data) - return - description = description.lstrip() - - # Parse out a directive from description, if any - (description, unused, directive) = description.partition("#") - - # Special case if directive starts with this, then skip - if directive.lstrip().lower().startswith("skip"): - self.result_skip(num, description) - elif ok: - self.result_pass(num, description) - else: - self.result_fail(num, description) - - def consume_test_plan(self, line): - # Only one test plan is supported - if self.test_plan: - self.report_error("Get a second TAP test plan") - return - - if line.lower().startswith('1..0 # skip'): - self.skip_all_reason = line[5:].strip() - self.bail_out = True - return - - try: - (first, unused, last) = line.partition("..") - first = int(first) - last = int(last) - except ValueError: - self.report_error("Invalid test plan: %s..%s" % (first, last)) - return - - self.test_plan = (first, last) - self.late_plan = self.reported and True or False - - def consume_bail_out(self, line): - self.bail_out = True - self.report("SKIP", 0, line) - - def process(self, output): - if output: - self.output += output.decode("UTF-8") - elif self.output: - self.output += "\n" - (ready, unused, self.output) = self.output.rpartition("\n") - for line in ready.split("\n"): - if line.startswith("ok "): - self.consume_test_line(True, line[3:]) - elif line.startswith("not ok "): - self.consume_test_line(False, line[7:]) - elif line and line[0].isdigit() and ".." in line: - self.consume_test_plan(line) - elif line.lower().startswith("bail out!"): - self.consume_bail_out(line) - - def run(self): - returncode = self.execute() - - failed = False - skipped = True - - if self.skip_all_reason is not None: - self.result_skip("skipping:", self.skip_all_reason) - self.trs.write(":global-test-result: SKIP\n") - self.trs.write(":test-global-result: SKIP\n") - self.trs.write(":recheck: no\n") - return 0 - - # Basic collation of results - for (num, code) in self.reported.items(): - if code == "ERROR": - self.errored = True - elif code == "FAIL" or code == "XPASS": - failed = True - if code != "SKIP": - skipped = False - - if not self.errored: - if returncode == 77: - skipped = True - elif returncode: - self.report_error("process failed: %d" % returncode) - self.errored = True - - # Check the plan - if not self.errored: - if not self.test_plan: - if not self.bail_out: - self.report_error("Didn't receive a TAP test plan") - else: - for i in range(self.test_plan[0], self.test_plan[1] + 1): - if i not in self.reported: - if self.bail_out: - self.report("SKIP", i, "- bailed out") - else: - self.report("ERROR", i, "- missing test") - skipped = False - self.errored = True - - if self.errored: - self.trs.write(":global-test-result: ERROR\n") - self.trs.write(":test-global-result: ERROR\n") - self.trs.write(":recheck: yes\n") - elif failed: - self.trs.write(":global-test-result: FAIL\n") - self.trs.write(":test-global-result: FAIL\n") - self.trs.write(":recheck: yes\n") - elif skipped: - self.trs.write(":global-test-result: SKIP\n") - self.trs.write(":test-global-result: SKIP\n") - self.trs.write(":recheck: no\n") - else: - self.trs.write(":global-test-result: PASS\n") - self.trs.write(":test-global-result: PASS\n") - self.trs.write(":recheck: no\n") - if self.errored or failed: - self.trs.write(":copy-in-global-log: yes\n") - - # Process result code - return 0 - - -class SimpleDriver(Driver): - def __init__(self, args): - Driver.__init__(self, args) - - def run(self): - returncode = self.execute() - if returncode == 0: - self.result_pass() - self.trs.write(":global-test-result: PASS\n") - self.trs.write(":test-global-result: PASS\n") - self.trs.write(":recheck: no\n") - elif returncode == 77: - self.result_skip() - self.trs.write(":global-test-result: SKIP\n") - self.trs.write(":test-global-result: SKIP\n") - self.trs.write(":recheck: no\n") - elif returncode == 99: - self.report_error() - self.trs.write(":global-test-result: ERROR\n") - self.trs.write(":test-global-result: ERROR\n") - self.trs.write(":copy-in-global-log: yes\n") - self.trs.write(":recheck: yes\n") - else: - self.result_fail() - self.trs.write(":global-test-result: FAIL\n") - self.trs.write(":test-global-result: FAIL\n") - self.trs.write(":copy-in-global-log: yes\n") - self.trs.write(":recheck: yes\n") - - # Process result code - return 0 - - -class MissingDriver(Driver): - def __init__(self, args): - Driver.__init__(self, args) - self.missing = args.missing - - def run(self): - self.result_skip("skipping due to: ", self.missing) - self.trs.write(":global-test-result: SKIP\n") - self.trs.write(":test-global-result: SKIP\n") - self.trs.write(":recheck: no\n") - return 0 - - -class YesNoAction(argparse.Action): - def __init__(self, option_strings, dest, **kwargs): - argparse.Action.__init__(self, option_strings, dest, **kwargs) - self.metavar = "[yes|no]" - def __call__(self, parser, namespace, values, option_string=None): - if not values or "yes" in values: - setattr(namespace, self.dest, True) - else: - setattr(namespace, self.dest, False) - - -def main(argv): - parser = argparse.ArgumentParser(description='Automake TAP driver') - parser.add_argument('--format', metavar='FORMAT', choices=[ "simple", "tap" ], - default="tap", help='The type of test to drive') - parser.add_argument('--missing', metavar="TOOL", nargs='?', - help="Force the test to skip due to missing tool") - parser.add_argument('--test-name', metavar='NAME', - help='The name of the test') - parser.add_argument('--log-file', metavar='PATH.log', required=True, - help='The .log file the driver creates') - parser.add_argument('--trs-file', metavar='PATH.trs', required=True, - help='The .trs file the driver creates') - parser.add_argument('--color-tests', default=True, action=YesNoAction, - help='Whether the console output should be colorized or not') - parser.add_argument('--expect-failure', default=False, action=YesNoAction, - help="Whether the tested program is expected to fail") - parser.add_argument('--enable-hard-errors', default=False, action=YesNoAction, - help="Whether hard errors in the tested program are treated differently") - parser.add_argument('command', nargs='+', - help="A test command line to run") - args = parser.parse_args(argv[1:]) - - if not args.test_name: - args.test_name = os.path.basename(args.command[0]) - if args.missing: - driver = MissingDriver(args) - elif args.format == "simple": - driver = SimpleDriver(args) - elif args.format == "tap": - driver = TapDriver(args) - return driver.run() - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff -Nru gcr-3.38.1/build/tap-gtester gcr-3.40.0/build/tap-gtester --- gcr-3.38.1/build/tap-gtester 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/tap-gtester 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -#!/bin/sh -set -eu -executable="$1" -shift -exec "$executable" -k --tap "$@" diff -Nru gcr-3.38.1/build/unknown.supp gcr-3.40.0/build/unknown.supp --- gcr-3.38.1/build/unknown.supp 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/unknown.supp 1970-01-01 00:00:00.000000000 +0000 @@ -1,420 +0,0 @@ -{ - _g_dbus_shared_thread_ref - Memcheck:Leak - ... - fun:_g_dbus_shared_thread_ref -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_slice_alloc - fun:g_slice_alloc0 - fun:g_type_create_instance - fun:g_object_constructor - fun:g_object_newv - fun:g_object_new - fun:g_dbus_message_new - fun:g_dbus_message_new_from_blob - fun:_g_dbus_worker_do_read_cb - fun:g_simple_async_result_complete - fun:complete_in_idle_cb - fun:g_idle_dispatch - fun:g_main_dispatch -} -{ - - Memcheck:Leak - fun:malloc - ... - obj:/lib64/libgcrypt.so.11.7.0 - fun:egg_dh_gen_pair -} -{ - - Memcheck:Leak - ... - fun:parse_value_from_blob - fun:g_dbus_message_new_from_blob - fun:_g_dbus_worker_do_read_cb -} -{ - - Memcheck:Leak - ... - fun:g_dbus_message_new - fun:g_dbus_message_new_from_blob - fun:_g_dbus_worker_do_read_cb - fun:g_simple_async_result_complete - fun:complete_in_idle_cb - fun:g_idle_dispatch -} -{ - - Memcheck:Leak - ... - fun:g_variant_get - fun:g_dbus_message_to_gerror - fun:decode_method_reply - fun:g_dbus_connection_call_done -} -{ - - Memcheck:Leak - ... - fun:g_dbus_message_set_header - fun:g_dbus_message_new_from_blob - fun:_g_dbus_worker_do_read_cb -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_malloc_n - fun:g_main_context_iterate - fun:g_main_loop_run - fun:gdbus_shared_thread_func - fun:g_thread_proxy - fun:start_thread - fun:clone -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_slice_alloc - fun:g_list_prepend - fun:g_queue_push_head - fun:g_main_context_push_thread_default - fun:gdbus_shared_thread_func - fun:g_thread_proxy - fun:start_thread - fun:clone -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_slice_alloc - fun:g_slice_alloc0 - fun:get_dispatch - fun:g_main_dispatch - fun:g_main_context_dispatch - fun:g_main_context_iterate - fun:g_main_loop_run - fun:g_dbus_connection_send_message_with_reply_sync - fun:g_dbus_connection_call_sync_internal - fun:g_dbus_connection_call_sync - fun:initable_init - fun:g_initable_init - fun:g_bus_get_sync -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_slice_alloc - fun:g_slice_alloc0 - fun:get_dispatch - fun:g_main_dispatch - fun:g_main_context_dispatch - fun:g_main_context_iterate - fun:g_main_loop_run - fun:gdbus_shared_thread_func - fun:g_thread_proxy - fun:start_thread - fun:clone -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_malloc_n - fun:g_main_context_iterate -} -{ - - Memcheck:Leak - fun:malloc - fun:realloc - fun:standard_realloc - fun:g_realloc - fun:_g_dbus_worker_do_read_unlocked - fun:_g_dbus_worker_do_initial_read -} -{ - - Memcheck:Leak - ... - fun:_g_socket_output_stream_new - fun:g_socket_connection_get_output_stream - fun:g_io_stream_get_output_stream - fun:_g_dbus_auth_run_client -} -{ - _g_dbus_worker_do_initial_read - Memcheck:Leak - ... - fun:_g_dbus_worker_do_read_unlocked - fun:_g_dbus_worker_do_initial_read -} -{ - - Memcheck:Leak - ... - fun:g_unix_socket_address_new_with_type - fun:g_dbus_address_connect - fun:g_dbus_address_try_connect_one - fun:g_dbus_address_get_stream_sync -} -{ - - Memcheck:Leak - ... - fun:_g_socket_input_stream_new - fun:g_socket_connection_get_input_stream - fun:g_io_stream_get_input_stream - fun:_g_dbus_auth_run_client -} -{ - - Memcheck:Leak - ... - fun:_g_dbus_worker_close - fun:_g_dbus_worker_stop -} -{ - - Memcheck:Leak - ... - fun:g_simple_async_result_complete_in_idle - fun:_g_socket_read_with_control_messages_ready - fun:_g_socket_read_with_control_messages - fun:_g_dbus_worker_do_read_unlocked - fun:_g_dbus_worker_do_read_cb -} -{ - - Memcheck:Leak - ... - fun:g_source_new - fun:g_idle_source_new - fun:g_simple_async_result_complete_in_idle - fun:g_socket_connection_close_async - fun:g_io_stream_close_async - ... - fun:gdbus_shared_thread_func -} -{ - - Memcheck:Leak - ... - fun:g_simple_async_result_new - fun:g_socket_connection_close_async - fun:g_io_stream_close_async - fun:maybe_write_next_message - fun:write_message_in_idle_cb -} -{ - - Memcheck:Leak - ... - fun:g_socket_connection_factory_create_connection - ... - fun:initable_init -} -{ - - Memcheck:Leak - ... - fun:g_socket_client_connect - fun:g_dbus_address_connect - fun:g_dbus_address_try_connect_one -} -{ - - Memcheck:Leak - ... - fun:_g_dbus_worker_new -} -{ - - Memcheck:Leak - ... - fun:_g_socket_read_with_control_messages - fun:_g_dbus_worker_do_read_unlocked - fun:_g_dbus_worker_do_read_cb -} -{ - - Memcheck:Leak - ... - fun:g_socket_receive_message - fun:_g_socket_read_with_control_messages_ready - fun:_g_socket_read_with_control_messages - fun:_g_dbus_worker_do_read_unlocked - fun:_g_dbus_worker_do_read_cb -} -{ - - Memcheck:Leak - ... - fun:maybe_write_next_message - ... - fun:gdbus_shared_thread_func -} -{ - - Memcheck:Leak - ... - fun:remove_match_rule - fun:unsubscribe_id_internal -} -{ - - Memcheck:Leak - ... - fun:g_object_new - fun:get_uninitialized_connection - fun:g_bus_get_sync -} -{ - - Memcheck:Leak - ... - fun:g_dbus_connection_signal_subscribe - fun:async_initable_init_first -} -{ - - Memcheck:Leak - ... - fun:g_dbus_connection_send_message_with_reply_unlocked - fun:g_dbus_connection_send_message_with_reply - fun:g_dbus_connection_send_message_with_reply_sync - fun:g_dbus_connection_call_sync_internal - fun:g_dbus_connection_call_sync -} -{ - - Memcheck:Leak - ... - fun:_g_dbus_auth_new -} -{ - - Memcheck:Leak - ... - fun:_g_dbus_auth_run_client -} -{ - - Memcheck:Leak - ... - fun:_g_dbus_auth_init -} -{ - - Memcheck:Leak - ... - fun:g_variant_dup_string - ... - fun:g_variant_get - ... - fun:g_initable_init - fun:g_bus_get_sync -} -{ - - Memcheck:Leak - ... - fun:g_main_context_push_thread_default - ... - fun:gdbus_shared_thread_func -} -{ - - Memcheck:Leak - ... - fun:g_main_context_add_poll_unlocked - ... - fun:g_main_loop_run - fun:gdbus_shared_thread_func -} -{ - - Memcheck:Leak - fun:malloc - fun:g_malloc - fun:g_memdup - fun:g_hash_table_insert_node - fun:handler_insert - fun:g_signal_connect_data -} -{ - - Memcheck:Leak - ... - fun:g_cond_new_posix_impl - fun:g_async_queue_pop_intern_unlocked - fun:g_thread_pool_thread_proxy - fun:g_thread_create_proxy - fun:start_thread - fun:clone -} -{ - - Memcheck:Leak - ... - fun:g_thread_create_full - fun:g_thread_pool_start_thread - fun:g_thread_pool_push -} -{ - thread_memory_from_self - Memcheck:Leak - ... - fun:thread_memory_from_self - ... - fun:g_object_new -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_slice_alloc - fun:g_slice_alloc0 - fun:get_dispatch - fun:g_main_dispatch - fun:g_main_context_dispatch - fun:g_main_context_iterate - fun:g_main_loop_run -} -{ - - Memcheck:Leak - fun:malloc - fun:standard_malloc - fun:g_malloc - fun:g_memdup - fun:g_hash_table_insert_node - fun:g_hash_table_insert_internal - fun:g_hash_table_insert - fun:handler_list_ensure - fun:handler_insert - fun:g_signal_connect_data -} diff -Nru gcr-3.38.1/build/valgrind/memcheck.h gcr-3.40.0/build/valgrind/memcheck.h --- gcr-3.38.1/build/valgrind/memcheck.h 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/build/valgrind/memcheck.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,287 +0,0 @@ - -/* - ---------------------------------------------------------------- - - Notice that the following BSD-style license applies to this one - file (memcheck.h) only. The rest of Valgrind is licensed under the - terms of the GNU General Public License, version 2, unless - otherwise indicated. See the COPYING file in the source - distribution for details. - - ---------------------------------------------------------------- - - This file is part of MemCheck, a heavyweight Valgrind tool for - detecting memory errors. - - Copyright (C) 2000-2013 Julian Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - - ---------------------------------------------------------------- - - Notice that the above BSD-style license applies to this one file - (memcheck.h) only. The entire rest of Valgrind is licensed under - the terms of the GNU General Public License, version 2. See the - COPYING file in the source distribution for details. - - ---------------------------------------------------------------- -*/ - - -#ifndef __MEMCHECK_H -#define __MEMCHECK_H - - -/* This file is for inclusion into client (your!) code. - - You can use these macros to manipulate and query memory permissions - inside your own programs. - - See comment near the top of valgrind.h on how to use them. -*/ - -#include "valgrind.h" - -/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! - This enum comprises an ABI exported by Valgrind to programs - which use client requests. DO NOT CHANGE THE ORDER OF THESE - ENTRIES, NOR DELETE ANY -- add new ones at the end. */ -typedef - enum { - VG_USERREQ__MAKE_MEM_NOACCESS = VG_USERREQ_TOOL_BASE('M','C'), - VG_USERREQ__MAKE_MEM_UNDEFINED, - VG_USERREQ__MAKE_MEM_DEFINED, - VG_USERREQ__DISCARD, - VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, - VG_USERREQ__CHECK_MEM_IS_DEFINED, - VG_USERREQ__DO_LEAK_CHECK, - VG_USERREQ__COUNT_LEAKS, - - VG_USERREQ__GET_VBITS, - VG_USERREQ__SET_VBITS, - - VG_USERREQ__CREATE_BLOCK, - - VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, - - /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */ - VG_USERREQ__COUNT_LEAK_BLOCKS, - - /* This is just for memcheck's internal use - don't use it */ - _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR - = VG_USERREQ_TOOL_BASE('M','C') + 256 - } Vg_MemCheckClientRequest; - - - -/* Client-code macros to manipulate the state of memory. */ - -/* Mark memory at _qzz_addr as unaddressable for _qzz_len bytes. */ -#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__MAKE_MEM_NOACCESS, \ - (_qzz_addr), (_qzz_len), 0, 0, 0) - -/* Similarly, mark memory at _qzz_addr as addressable but undefined - for _qzz_len bytes. */ -#define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__MAKE_MEM_UNDEFINED, \ - (_qzz_addr), (_qzz_len), 0, 0, 0) - -/* Similarly, mark memory at _qzz_addr as addressable and defined - for _qzz_len bytes. */ -#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__MAKE_MEM_DEFINED, \ - (_qzz_addr), (_qzz_len), 0, 0, 0) - -/* Similar to VALGRIND_MAKE_MEM_DEFINED except that addressability is - not altered: bytes which are addressable are marked as defined, - but those which are not addressable are left unchanged. */ -#define VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, \ - (_qzz_addr), (_qzz_len), 0, 0, 0) - -/* Create a block-description handle. The description is an ascii - string which is included in any messages pertaining to addresses - within the specified memory range. Has no other effect on the - properties of the memory range. */ -#define VALGRIND_CREATE_BLOCK(_qzz_addr,_qzz_len, _qzz_desc) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__CREATE_BLOCK, \ - (_qzz_addr), (_qzz_len), (_qzz_desc), \ - 0, 0) - -/* Discard a block-description-handle. Returns 1 for an - invalid handle, 0 for a valid handle. */ -#define VALGRIND_DISCARD(_qzz_blkindex) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__DISCARD, \ - 0, (_qzz_blkindex), 0, 0, 0) - - -/* Client-code macros to check the state of memory. */ - -/* Check that memory at _qzz_addr is addressable for _qzz_len bytes. - If suitable addressibility is not established, Valgrind prints an - error message and returns the address of the first offending byte. - Otherwise it returns zero. */ -#define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, \ - (_qzz_addr), (_qzz_len), 0, 0, 0) - -/* Check that memory at _qzz_addr is addressable and defined for - _qzz_len bytes. If suitable addressibility and definedness are not - established, Valgrind prints an error message and returns the - address of the first offending byte. Otherwise it returns zero. */ -#define VALGRIND_CHECK_MEM_IS_DEFINED(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__CHECK_MEM_IS_DEFINED, \ - (_qzz_addr), (_qzz_len), 0, 0, 0) - -/* Use this macro to force the definedness and addressibility of an - lvalue to be checked. If suitable addressibility and definedness - are not established, Valgrind prints an error message and returns - the address of the first offending byte. Otherwise it returns - zero. */ -#define VALGRIND_CHECK_VALUE_IS_DEFINED(__lvalue) \ - VALGRIND_CHECK_MEM_IS_DEFINED( \ - (volatile unsigned char *)&(__lvalue), \ - (unsigned long)(sizeof (__lvalue))) - - -/* Do a full memory leak check (like --leak-check=full) mid-execution. */ -#define VALGRIND_DO_LEAK_CHECK \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ - 0, 0, 0, 0, 0) - -/* Same as VALGRIND_DO_LEAK_CHECK but only showing the entries for - which there was an increase in leaked bytes or leaked nr of blocks - since the previous leak search. */ -#define VALGRIND_DO_ADDED_LEAK_CHECK \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ - 0, 1, 0, 0, 0) - -/* Same as VALGRIND_DO_ADDED_LEAK_CHECK but showing entries with - increased or decreased leaked bytes/blocks since previous leak - search. */ -#define VALGRIND_DO_CHANGED_LEAK_CHECK \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ - 0, 2, 0, 0, 0) - -/* Do a summary memory leak check (like --leak-check=summary) mid-execution. */ -#define VALGRIND_DO_QUICK_LEAK_CHECK \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ - 1, 0, 0, 0, 0) - -/* Return number of leaked, dubious, reachable and suppressed bytes found by - all previous leak checks. They must be lvalues. */ -#define VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed) \ - /* For safety on 64-bit platforms we assign the results to private - unsigned long variables, then assign these to the lvalues the user - specified, which works no matter what type 'leaked', 'dubious', etc - are. We also initialise '_qzz_leaked', etc because - VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as - defined. */ \ - { \ - unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \ - unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \ - VALGRIND_DO_CLIENT_REQUEST_STMT( \ - VG_USERREQ__COUNT_LEAKS, \ - &_qzz_leaked, &_qzz_dubious, \ - &_qzz_reachable, &_qzz_suppressed, 0); \ - leaked = _qzz_leaked; \ - dubious = _qzz_dubious; \ - reachable = _qzz_reachable; \ - suppressed = _qzz_suppressed; \ - } - -/* Return number of leaked, dubious, reachable and suppressed bytes found by - all previous leak checks. They must be lvalues. */ -#define VALGRIND_COUNT_LEAK_BLOCKS(leaked, dubious, reachable, suppressed) \ - /* For safety on 64-bit platforms we assign the results to private - unsigned long variables, then assign these to the lvalues the user - specified, which works no matter what type 'leaked', 'dubious', etc - are. We also initialise '_qzz_leaked', etc because - VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as - defined. */ \ - { \ - unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \ - unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \ - VALGRIND_DO_CLIENT_REQUEST_STMT( \ - VG_USERREQ__COUNT_LEAK_BLOCKS, \ - &_qzz_leaked, &_qzz_dubious, \ - &_qzz_reachable, &_qzz_suppressed, 0); \ - leaked = _qzz_leaked; \ - dubious = _qzz_dubious; \ - reachable = _qzz_reachable; \ - suppressed = _qzz_suppressed; \ - } - - -/* Get the validity data for addresses [zza..zza+zznbytes-1] and copy it - into the provided zzvbits array. Return values: - 0 if not running on valgrind - 1 success - 2 [previously indicated unaligned arrays; these are now allowed] - 3 if any parts of zzsrc/zzvbits are not addressable. - The metadata is not copied in cases 0, 2 or 3 so it should be - impossible to segfault your system by using this call. -*/ -#define VALGRIND_GET_VBITS(zza,zzvbits,zznbytes) \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__GET_VBITS, \ - (const char*)(zza), \ - (char*)(zzvbits), \ - (zznbytes), 0, 0) - -/* Set the validity data for addresses [zza..zza+zznbytes-1], copying it - from the provided zzvbits array. Return values: - 0 if not running on valgrind - 1 success - 2 [previously indicated unaligned arrays; these are now allowed] - 3 if any parts of zza/zzvbits are not addressable. - The metadata is not copied in cases 0, 2 or 3 so it should be - impossible to segfault your system by using this call. -*/ -#define VALGRIND_SET_VBITS(zza,zzvbits,zznbytes) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__SET_VBITS, \ - (const char*)(zza), \ - (const char*)(zzvbits), \ - (zznbytes), 0, 0 ) - -#endif - diff -Nru gcr-3.38.1/build/valgrind/valgrind.h gcr-3.40.0/build/valgrind/valgrind.h --- gcr-3.38.1/build/valgrind/valgrind.h 2021-01-12 22:55:54.637056000 +0000 +++ gcr-3.40.0/build/valgrind/valgrind.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,5413 +0,0 @@ -/* -*- c -*- - ---------------------------------------------------------------- - - Notice that the following BSD-style license applies to this one - file (valgrind.h) only. The rest of Valgrind is licensed under the - terms of the GNU General Public License, version 2, unless - otherwise indicated. See the COPYING file in the source - distribution for details. - - ---------------------------------------------------------------- - - This file is part of Valgrind, a dynamic binary instrumentation - framework. - - Copyright (C) 2000-2013 Julian Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - - ---------------------------------------------------------------- - - Notice that the above BSD-style license applies to this one file - (valgrind.h) only. The entire rest of Valgrind is licensed under - the terms of the GNU General Public License, version 2. See the - COPYING file in the source distribution for details. - - ---------------------------------------------------------------- -*/ - - -/* This file is for inclusion into client (your!) code. - - You can use these macros to manipulate and query Valgrind's - execution inside your own programs. - - The resulting executables will still run without Valgrind, just a - little bit more slowly than they otherwise would, but otherwise - unchanged. When not running on valgrind, each client request - consumes very few (eg. 7) instructions, so the resulting performance - loss is negligible unless you plan to execute client requests - millions of times per second. Nevertheless, if that is still a - problem, you can compile with the NVALGRIND symbol defined (gcc - -DNVALGRIND) so that client requests are not even compiled in. */ - -#ifndef __VALGRIND_H -#define __VALGRIND_H - - -/* ------------------------------------------------------------------ */ -/* VERSION NUMBER OF VALGRIND */ -/* ------------------------------------------------------------------ */ - -/* Specify Valgrind's version number, so that user code can - conditionally compile based on our version number. Note that these - were introduced at version 3.6 and so do not exist in version 3.5 - or earlier. The recommended way to use them to check for "version - X.Y or later" is (eg) - -#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \ - && (__VALGRIND_MAJOR__ > 3 \ - || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) -*/ -#define __VALGRIND_MAJOR__ 3 -#define __VALGRIND_MINOR__ 8 - - -#include - -/* Nb: this file might be included in a file compiled with -ansi. So - we can't use C++ style "//" comments nor the "asm" keyword (instead - use "__asm__"). */ - -/* Derive some tags indicating what the target platform is. Note - that in this file we're using the compiler's CPP symbols for - identifying architectures, which are different to the ones we use - within the rest of Valgrind. Note, __powerpc__ is active for both - 32 and 64-bit PPC, whereas __powerpc64__ is only active for the - latter (on Linux, that is). - - Misc note: how to find out what's predefined in gcc by default: - gcc -Wp,-dM somefile.c -*/ -#undef PLAT_x86_darwin -#undef PLAT_amd64_darwin -#undef PLAT_x86_win32 -#undef PLAT_amd64_win64 -#undef PLAT_x86_linux -#undef PLAT_amd64_linux -#undef PLAT_ppc32_linux -#undef PLAT_ppc64_linux -#undef PLAT_arm_linux -#undef PLAT_s390x_linux -#undef PLAT_mips32_linux -#undef PLAT_mips64_linux - - -#if defined(__APPLE__) && defined(__i386__) -# define PLAT_x86_darwin 1 -#elif defined(__APPLE__) && defined(__x86_64__) -# define PLAT_amd64_darwin 1 -#elif defined(__MINGW32__) || defined(__CYGWIN32__) \ - || (defined(_WIN32) && defined(_M_IX86)) -# define PLAT_x86_win32 1 -#elif defined(__MINGW64__) || (defined(_WIN64) && defined(_M_X64)) -# define PLAT_amd64_win64 1 -#elif defined(__linux__) && defined(__i386__) -# define PLAT_x86_linux 1 -#elif defined(__linux__) && defined(__x86_64__) -# define PLAT_amd64_linux 1 -#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) -# define PLAT_ppc32_linux 1 -#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) -# define PLAT_ppc64_linux 1 -#elif defined(__linux__) && defined(__arm__) -# define PLAT_arm_linux 1 -#elif defined(__linux__) && defined(__s390__) && defined(__s390x__) -# define PLAT_s390x_linux 1 -#elif defined(__linux__) && defined(__mips__) -#if (__mips==64) -# define PLAT_mips64_linux 1 -#else -# define PLAT_mips32_linux 1 -#endif -#else -/* If we're not compiling for our target platform, don't generate - any inline asms. */ -# if !defined(NVALGRIND) -# define NVALGRIND 1 -# endif -#endif - - -/* ------------------------------------------------------------------ */ -/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */ -/* in here of use to end-users -- skip to the next section. */ -/* ------------------------------------------------------------------ */ - -/* - * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client - * request. Accepts both pointers and integers as arguments. - * - * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind - * client request that does not return a value. - - * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind - * client request and whose value equals the client request result. Accepts - * both pointers and integers as arguments. Note that such calls are not - * necessarily pure functions -- they may have side effects. - */ - -#define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \ - _zzq_request, _zzq_arg1, _zzq_arg2, \ - _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \ - (_zzq_request), (_zzq_arg1), (_zzq_arg2), \ - (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0) - -#define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \ - _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - (_zzq_request), (_zzq_arg1), (_zzq_arg2), \ - (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0) - -#if defined(NVALGRIND) - -/* Define NVALGRIND to completely remove the Valgrind magic sequence - from the compiled code (analogous to NDEBUG's effects on - assert()) */ -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - (_zzq_default) - -#else /* ! NVALGRIND */ - -/* The following defines the magic code sequences which the JITter - spots and handles magically. Don't look too closely at them as - they will rot your brain. - - The assembly code sequences for all architectures is in this one - file. This is because this file must be stand-alone, and we don't - want to have multiple files. - - For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default - value gets put in the return slot, so that everything works when - this is executed not under Valgrind. Args are passed in a memory - block, and so there's no intrinsic limit to the number that could - be passed, but it's currently five. - - The macro args are: - _zzq_rlval result lvalue - _zzq_default default value (result returned when running on real CPU) - _zzq_request request code - _zzq_arg1..5 request params - - The other two macros are used to support function wrapping, and are - a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the - guest's NRADDR pseudo-register and whatever other information is - needed to safely run the call original from the wrapper: on - ppc64-linux, the R2 value at the divert point is also needed. This - information is abstracted into a user-visible type, OrigFn. - - VALGRIND_CALL_NOREDIR_* behaves the same as the following on the - guest, but guarantees that the branch instruction will not be - redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: - branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a - complete inline asm, since it needs to be combined with more magic - inline asm stuff to be useful. -*/ - -/* ------------------------- x86-{linux,darwin} ---------------- */ - -#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ - || (defined(PLAT_x86_win32) && defined(__GNUC__)) - -typedef - struct { - unsigned int nraddr; /* where's the code? */ - } - OrigFn; - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "roll $3, %%edi ; roll $13, %%edi\n\t" \ - "roll $29, %%edi ; roll $19, %%edi\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - __extension__ \ - ({volatile unsigned int _zzq_args[6]; \ - volatile unsigned int _zzq_result; \ - _zzq_args[0] = (unsigned int)(_zzq_request); \ - _zzq_args[1] = (unsigned int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned int)(_zzq_arg5); \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %EDX = client_request ( %EAX ) */ \ - "xchgl %%ebx,%%ebx" \ - : "=d" (_zzq_result) \ - : "a" (&_zzq_args[0]), "0" (_zzq_default) \ - : "cc", "memory" \ - ); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %EAX = guest_NRADDR */ \ - "xchgl %%ecx,%%ecx" \ - : "=a" (__addr) \ - : \ - : "cc", "memory" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_EAX \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* call-noredir *%EAX */ \ - "xchgl %%edx,%%edx\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "xchgl %%edi,%%edi\n\t" \ - : : : "cc", "memory" \ - ); \ - } while (0) - -#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */ - -/* ------------------------- x86-Win32 ------------------------- */ - -#if defined(PLAT_x86_win32) && !defined(__GNUC__) - -typedef - struct { - unsigned int nraddr; /* where's the code? */ - } - OrigFn; - -#if defined(_MSC_VER) - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - __asm rol edi, 3 __asm rol edi, 13 \ - __asm rol edi, 29 __asm rol edi, 19 - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \ - (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \ - (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \ - (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5)) - -static __inline uintptr_t -valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request, - uintptr_t _zzq_arg1, uintptr_t _zzq_arg2, - uintptr_t _zzq_arg3, uintptr_t _zzq_arg4, - uintptr_t _zzq_arg5) -{ - volatile uintptr_t _zzq_args[6]; - volatile unsigned int _zzq_result; - _zzq_args[0] = (uintptr_t)(_zzq_request); - _zzq_args[1] = (uintptr_t)(_zzq_arg1); - _zzq_args[2] = (uintptr_t)(_zzq_arg2); - _zzq_args[3] = (uintptr_t)(_zzq_arg3); - _zzq_args[4] = (uintptr_t)(_zzq_arg4); - _zzq_args[5] = (uintptr_t)(_zzq_arg5); - __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default - __SPECIAL_INSTRUCTION_PREAMBLE - /* %EDX = client_request ( %EAX ) */ - __asm xchg ebx,ebx - __asm mov _zzq_result, edx - } - return _zzq_result; -} - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned int __addr; \ - __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ - /* %EAX = guest_NRADDR */ \ - __asm xchg ecx,ecx \ - __asm mov __addr, eax \ - } \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_EAX ERROR - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ - __asm xchg edi,edi \ - } \ - } while (0) - -#else -#error Unsupported compiler. -#endif - -#endif /* PLAT_x86_win32 */ - -/* ------------------------ amd64-{linux,darwin} --------------- */ - -#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) - -typedef - struct { - unsigned long long int nraddr; /* where's the code? */ - } - OrigFn; - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ - "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - __extension__ \ - ({ volatile unsigned long long int _zzq_args[6]; \ - volatile unsigned long long int _zzq_result; \ - _zzq_args[0] = (unsigned long long int)(_zzq_request); \ - _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %RDX = client_request ( %RAX ) */ \ - "xchgq %%rbx,%%rbx" \ - : "=d" (_zzq_result) \ - : "a" (&_zzq_args[0]), "0" (_zzq_default) \ - : "cc", "memory" \ - ); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned long long int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %RAX = guest_NRADDR */ \ - "xchgq %%rcx,%%rcx" \ - : "=a" (__addr) \ - : \ - : "cc", "memory" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_RAX \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* call-noredir *%RAX */ \ - "xchgq %%rdx,%%rdx\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "xchgq %%rdi,%%rdi\n\t" \ - : : : "cc", "memory" \ - ); \ - } while (0) - -#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ - -/* ------------------------ ppc32-linux ------------------------ */ - -#if defined(PLAT_ppc32_linux) - -typedef - struct { - unsigned int nraddr; /* where's the code? */ - } - OrigFn; - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ - "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - \ - __extension__ \ - ({ unsigned int _zzq_args[6]; \ - unsigned int _zzq_result; \ - unsigned int* _zzq_ptr; \ - _zzq_args[0] = (unsigned int)(_zzq_request); \ - _zzq_args[1] = (unsigned int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned int)(_zzq_arg5); \ - _zzq_ptr = _zzq_args; \ - __asm__ volatile("mr 3,%1\n\t" /*default*/ \ - "mr 4,%2\n\t" /*ptr*/ \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* %R3 = client_request ( %R4 ) */ \ - "or 1,1,1\n\t" \ - "mr %0,3" /*result*/ \ - : "=b" (_zzq_result) \ - : "b" (_zzq_default), "b" (_zzq_ptr) \ - : "cc", "memory", "r3", "r4", "r0"); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - unsigned int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %R3 = guest_NRADDR */ \ - "or 2,2,2\n\t" \ - "mr %0,3" \ - : "=b" (__addr) \ - : \ - : "cc", "memory", "r3", "r0" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* branch-and-link-to-noredir *%R11 */ \ - "or 3,3,3\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "or 5,5,5\n\t" \ - ); \ - } while (0) - -#endif /* PLAT_ppc32_linux */ - -/* ------------------------ ppc64-linux ------------------------ */ - -#if defined(PLAT_ppc64_linux) - -typedef - struct { - unsigned long long int nraddr; /* where's the code? */ - unsigned long long int r2; /* what tocptr do we need? */ - } - OrigFn; - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ - "rotldi 0,0,61 ; rotldi 0,0,51\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - \ - __extension__ \ - ({ unsigned long long int _zzq_args[6]; \ - unsigned long long int _zzq_result; \ - unsigned long long int* _zzq_ptr; \ - _zzq_args[0] = (unsigned long long int)(_zzq_request); \ - _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ - _zzq_ptr = _zzq_args; \ - __asm__ volatile("mr 3,%1\n\t" /*default*/ \ - "mr 4,%2\n\t" /*ptr*/ \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* %R3 = client_request ( %R4 ) */ \ - "or 1,1,1\n\t" \ - "mr %0,3" /*result*/ \ - : "=b" (_zzq_result) \ - : "b" (_zzq_default), "b" (_zzq_ptr) \ - : "cc", "memory", "r3", "r4", "r0"); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - unsigned long long int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %R3 = guest_NRADDR */ \ - "or 2,2,2\n\t" \ - "mr %0,3" \ - : "=b" (__addr) \ - : \ - : "cc", "memory", "r3", "r0" \ - ); \ - _zzq_orig->nraddr = __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %R3 = guest_NRADDR_GPR2 */ \ - "or 4,4,4\n\t" \ - "mr %0,3" \ - : "=b" (__addr) \ - : \ - : "cc", "memory", "r3", "r0" \ - ); \ - _zzq_orig->r2 = __addr; \ - } - -#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* branch-and-link-to-noredir *%R11 */ \ - "or 3,3,3\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "or 5,5,5\n\t" \ - ); \ - } while (0) - -#endif /* PLAT_ppc64_linux */ - -/* ------------------------- arm-linux ------------------------- */ - -#if defined(PLAT_arm_linux) - -typedef - struct { - unsigned int nraddr; /* where's the code? */ - } - OrigFn; - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \ - "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - \ - __extension__ \ - ({volatile unsigned int _zzq_args[6]; \ - volatile unsigned int _zzq_result; \ - _zzq_args[0] = (unsigned int)(_zzq_request); \ - _zzq_args[1] = (unsigned int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned int)(_zzq_arg5); \ - __asm__ volatile("mov r3, %1\n\t" /*default*/ \ - "mov r4, %2\n\t" /*ptr*/ \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* R3 = client_request ( R4 ) */ \ - "orr r10, r10, r10\n\t" \ - "mov %0, r3" /*result*/ \ - : "=r" (_zzq_result) \ - : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "cc","memory", "r3", "r4"); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - unsigned int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* R3 = guest_NRADDR */ \ - "orr r11, r11, r11\n\t" \ - "mov %0, r3" \ - : "=r" (__addr) \ - : \ - : "cc", "memory", "r3" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* branch-and-link-to-noredir *%R4 */ \ - "orr r12, r12, r12\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "orr r9, r9, r9\n\t" \ - : : : "cc", "memory" \ - ); \ - } while (0) - -#endif /* PLAT_arm_linux */ - -/* ------------------------ s390x-linux ------------------------ */ - -#if defined(PLAT_s390x_linux) - -typedef - struct { - unsigned long long int nraddr; /* where's the code? */ - } - OrigFn; - -/* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific - * code. This detection is implemented in platform specific toIR.c - * (e.g. VEX/priv/guest_s390_decoder.c). - */ -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "lr 15,15\n\t" \ - "lr 1,1\n\t" \ - "lr 2,2\n\t" \ - "lr 3,3\n\t" - -#define __CLIENT_REQUEST_CODE "lr 2,2\n\t" -#define __GET_NR_CONTEXT_CODE "lr 3,3\n\t" -#define __CALL_NO_REDIR_CODE "lr 4,4\n\t" -#define __VEX_INJECT_IR_CODE "lr 5,5\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - __extension__ \ - ({volatile unsigned long long int _zzq_args[6]; \ - volatile unsigned long long int _zzq_result; \ - _zzq_args[0] = (unsigned long long int)(_zzq_request); \ - _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ - __asm__ volatile(/* r2 = args */ \ - "lgr 2,%1\n\t" \ - /* r3 = default */ \ - "lgr 3,%2\n\t" \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - __CLIENT_REQUEST_CODE \ - /* results = r3 */ \ - "lgr %0, 3\n\t" \ - : "=d" (_zzq_result) \ - : "a" (&_zzq_args[0]), "0" (_zzq_default) \ - : "cc", "2", "3", "memory" \ - ); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned long long int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - __GET_NR_CONTEXT_CODE \ - "lgr %0, 3\n\t" \ - : "=a" (__addr) \ - : \ - : "cc", "3", "memory" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_R1 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - __CALL_NO_REDIR_CODE - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - __VEX_INJECT_IR_CODE); \ - } while (0) - -#endif /* PLAT_s390x_linux */ - -/* ------------------------- mips32-linux ---------------- */ - -#if defined(PLAT_mips32_linux) - -typedef - struct { - unsigned int nraddr; /* where's the code? */ - } - OrigFn; - -/* .word 0x342 - * .word 0x742 - * .word 0xC2 - * .word 0x4C2*/ -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "srl $0, $0, 13\n\t" \ - "srl $0, $0, 29\n\t" \ - "srl $0, $0, 3\n\t" \ - "srl $0, $0, 19\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - __extension__ \ - ({ volatile unsigned int _zzq_args[6]; \ - volatile unsigned int _zzq_result; \ - _zzq_args[0] = (unsigned int)(_zzq_request); \ - _zzq_args[1] = (unsigned int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned int)(_zzq_arg5); \ - __asm__ volatile("move $11, %1\n\t" /*default*/ \ - "move $12, %2\n\t" /*ptr*/ \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* T3 = client_request ( T4 ) */ \ - "or $13, $13, $13\n\t" \ - "move %0, $11\n\t" /*result*/ \ - : "=r" (_zzq_result) \ - : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "$11", "$12"); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* %t9 = guest_NRADDR */ \ - "or $14, $14, $14\n\t" \ - "move %0, $11" /*result*/ \ - : "=r" (__addr) \ - : \ - : "$11" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_T9 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* call-noredir *%t9 */ \ - "or $15, $15, $15\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "or $11, $11, $11\n\t" \ - ); \ - } while (0) - - -#endif /* PLAT_mips32_linux */ - -/* ------------------------- mips64-linux ---------------- */ - -#if defined(PLAT_mips64_linux) - -typedef - struct { - unsigned long long nraddr; /* where's the code? */ - } - OrigFn; - -/* dsll $0,$0, 3 - * dsll $0,$0, 13 - * dsll $0,$0, 29 - * dsll $0,$0, 19*/ -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \ - "dsll $0,$0,29 ; dsll $0,$0,19\n\t" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - __extension__ \ - ({ volatile unsigned long long int _zzq_args[6]; \ - volatile unsigned long long int _zzq_result; \ - _zzq_args[0] = (unsigned long long int)(_zzq_request); \ - _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ - __asm__ volatile("move $11, %1\n\t" /*default*/ \ - "move $12, %2\n\t" /*ptr*/ \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* $11 = client_request ( $12 ) */ \ - "or $13, $13, $13\n\t" \ - "move %0, $11\n\t" /*result*/ \ - : "=r" (_zzq_result) \ - : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "$11", "$12"); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned long long int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* $11 = guest_NRADDR */ \ - "or $14, $14, $14\n\t" \ - "move %0, $11" /*result*/ \ - : "=r" (__addr) \ - : \ - : "$11"); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_T9 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* call-noredir $25 */ \ - "or $15, $15, $15\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "or $11, $11, $11\n\t" \ - ); \ - } while (0) - -#endif /* PLAT_mips64_linux */ - -/* Insert assembly code for other platforms here... */ - -#endif /* NVALGRIND */ - - -/* ------------------------------------------------------------------ */ -/* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */ -/* ugly. It's the least-worst tradeoff I can think of. */ -/* ------------------------------------------------------------------ */ - -/* This section defines magic (a.k.a appalling-hack) macros for doing - guaranteed-no-redirection macros, so as to get from function - wrappers to the functions they are wrapping. The whole point is to - construct standard call sequences, but to do the call itself with a - special no-redirect call pseudo-instruction that the JIT - understands and handles specially. This section is long and - repetitious, and I can't see a way to make it shorter. - - The naming scheme is as follows: - - CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc} - - 'W' stands for "word" and 'v' for "void". Hence there are - different macros for calling arity 0, 1, 2, 3, 4, etc, functions, - and for each, the possibility of returning a word-typed result, or - no result. -*/ - -/* Use these to write the name of your wrapper. NOTE: duplicates - VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. NOTE also: inserts - the default behaviour equivalance class tag "0000" into the name. - See pub_tool_redir.h for details -- normally you don't need to - think about this, though. */ - -/* Use an extra level of macroisation so as to ensure the soname/fnname - args are fully macro-expanded before pasting them together. */ -#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd - -#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ - VG_CONCAT4(_vgw00000ZU_,soname,_,fnname) - -#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ - VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname) - -/* Use this macro from within a wrapper function to collect the - context (address and possibly other info) of the original function. - Once you have that you can then use it in one of the CALL_FN_ - macros. The type of the argument _lval is OrigFn. */ -#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) - -/* Also provide end-user facilities for function replacement, rather - than wrapping. A replacement function differs from a wrapper in - that it has no way to get hold of the original function being - called, and hence no way to call onwards to it. In a replacement - function, VALGRIND_GET_ORIG_FN always returns zero. */ - -#define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \ - VG_CONCAT4(_vgr00000ZU_,soname,_,fnname) - -#define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \ - VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname) - -/* Derivatives of the main macros below, for calling functions - returning void. */ - -#define CALL_FN_v_v(fnptr) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_v(_junk,fnptr); } while (0) - -#define CALL_FN_v_W(fnptr, arg1) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_W(_junk,fnptr,arg1); } while (0) - -#define CALL_FN_v_WW(fnptr, arg1,arg2) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) - -#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) - -#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0) - -#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0) - -#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0) - -#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \ - do { volatile unsigned long _junk; \ - CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0) - -/* ------------------------- x86-{linux,darwin} ---------------- */ - -#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) - -/* These regs are trashed by the hidden call. No need to mention eax - as gcc can already see that, plus causes gcc to bomb. */ -#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx" - -/* Macros to save and align the stack before making a function - call and restore it afterwards as gcc may not keep the stack - pointer aligned if it doesn't realise calls are being made - to other functions. */ - -#define VALGRIND_ALIGN_STACK \ - "movl %%esp,%%edi\n\t" \ - "andl $0xfffffff0,%%esp\n\t" -#define VALGRIND_RESTORE_STACK \ - "movl %%edi,%%esp\n\t" - -/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned - long) == 4. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $12, %%esp\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $8, %%esp\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $4, %%esp\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $12, %%esp\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $8, %%esp\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $4, %%esp\n\t" \ - "pushl 28(%%eax)\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "pushl 32(%%eax)\n\t" \ - "pushl 28(%%eax)\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $12, %%esp\n\t" \ - "pushl 36(%%eax)\n\t" \ - "pushl 32(%%eax)\n\t" \ - "pushl 28(%%eax)\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $8, %%esp\n\t" \ - "pushl 40(%%eax)\n\t" \ - "pushl 36(%%eax)\n\t" \ - "pushl 32(%%eax)\n\t" \ - "pushl 28(%%eax)\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "subl $4, %%esp\n\t" \ - "pushl 44(%%eax)\n\t" \ - "pushl 40(%%eax)\n\t" \ - "pushl 36(%%eax)\n\t" \ - "pushl 32(%%eax)\n\t" \ - "pushl 28(%%eax)\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "pushl 48(%%eax)\n\t" \ - "pushl 44(%%eax)\n\t" \ - "pushl 40(%%eax)\n\t" \ - "pushl 36(%%eax)\n\t" \ - "pushl 32(%%eax)\n\t" \ - "pushl 28(%%eax)\n\t" \ - "pushl 24(%%eax)\n\t" \ - "pushl 20(%%eax)\n\t" \ - "pushl 16(%%eax)\n\t" \ - "pushl 12(%%eax)\n\t" \ - "pushl 8(%%eax)\n\t" \ - "pushl 4(%%eax)\n\t" \ - "movl (%%eax), %%eax\n\t" /* target->%eax */ \ - VALGRIND_CALL_NOREDIR_EAX \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_x86_linux || PLAT_x86_darwin */ - -/* ------------------------ amd64-{linux,darwin} --------------- */ - -#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) - -/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \ - "rdi", "r8", "r9", "r10", "r11" - -/* This is all pretty complex. It's so as to make stack unwinding - work reliably. See bug 243270. The basic problem is the sub and - add of 128 of %rsp in all of the following macros. If gcc believes - the CFA is in %rsp, then unwinding may fail, because what's at the - CFA is not what gcc "expected" when it constructs the CFIs for the - places where the macros are instantiated. - - But we can't just add a CFI annotation to increase the CFA offset - by 128, to match the sub of 128 from %rsp, because we don't know - whether gcc has chosen %rsp as the CFA at that point, or whether it - has chosen some other register (eg, %rbp). In the latter case, - adding a CFI annotation to change the CFA offset is simply wrong. - - So the solution is to get hold of the CFA using - __builtin_dwarf_cfa(), put it in a known register, and add a - CFI annotation to say what the register is. We choose %rbp for - this (perhaps perversely), because: - - (1) %rbp is already subject to unwinding. If a new register was - chosen then the unwinder would have to unwind it in all stack - traces, which is expensive, and - - (2) %rbp is already subject to precise exception updates in the - JIT. If a new register was chosen, we'd have to have precise - exceptions for it too, which reduces performance of the - generated code. - - However .. one extra complication. We can't just whack the result - of __builtin_dwarf_cfa() into %rbp and then add %rbp to the - list of trashed registers at the end of the inline assembly - fragments; gcc won't allow %rbp to appear in that list. Hence - instead we need to stash %rbp in %r15 for the duration of the asm, - and say that %r15 is trashed instead. gcc seems happy to go with - that. - - Oh .. and this all needs to be conditionalised so that it is - unchanged from before this commit, when compiled with older gccs - that don't support __builtin_dwarf_cfa. Furthermore, since - this header file is freestanding, it has to be independent of - config.h, and so the following conditionalisation cannot depend on - configure time checks. - - Although it's not clear from - 'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)', - this expression excludes Darwin. - .cfi directives in Darwin assembly appear to be completely - different and I haven't investigated how they work. - - For even more entertainment value, note we have to use the - completely undocumented __builtin_dwarf_cfa(), which appears to - really compute the CFA, whereas __builtin_frame_address(0) claims - to but actually doesn't. See - https://bugs.kde.org/show_bug.cgi?id=243270#c47 -*/ -#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) -# define __FRAME_POINTER \ - ,"r"(__builtin_dwarf_cfa()) -# define VALGRIND_CFI_PROLOGUE \ - "movq %%rbp, %%r15\n\t" \ - "movq %2, %%rbp\n\t" \ - ".cfi_remember_state\n\t" \ - ".cfi_def_cfa rbp, 0\n\t" -# define VALGRIND_CFI_EPILOGUE \ - "movq %%r15, %%rbp\n\t" \ - ".cfi_restore_state\n\t" -#else -# define __FRAME_POINTER -# define VALGRIND_CFI_PROLOGUE -# define VALGRIND_CFI_EPILOGUE -#endif - -/* Macros to save and align the stack before making a function - call and restore it afterwards as gcc may not keep the stack - pointer aligned if it doesn't realise calls are being made - to other functions. */ - -#define VALGRIND_ALIGN_STACK \ - "movq %%rsp,%%r14\n\t" \ - "andq $0xfffffffffffffff0,%%rsp\n\t" -#define VALGRIND_RESTORE_STACK \ - "movq %%r14,%%rsp\n\t" - -/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned - long) == 8. */ - -/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_ - macros. In order not to trash the stack redzone, we need to drop - %rsp by 128 before the hidden call, and restore afterwards. The - nastyness is that it is only by luck that the stack still appears - to be unwindable during the hidden call - since then the behaviour - of any routine using this macro does not match what the CFI data - says. Sigh. - - Why is this important? Imagine that a wrapper has a stack - allocated local, and passes to the hidden call, a pointer to it. - Because gcc does not know about the hidden call, it may allocate - that local in the redzone. Unfortunately the hidden call may then - trash it before it comes to use it. So we must step clear of the - redzone, for the duration of the hidden call, to make it safe. - - Probably the same problem afflicts the other redzone-style ABIs too - (ppc64-linux); but for those, the stack is - self describing (none of this CFI nonsense) so at least messing - with the stack pointer doesn't give a danger of non-unwindable - stack. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $136,%%rsp\n\t" \ - "pushq 56(%%rax)\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "pushq 64(%%rax)\n\t" \ - "pushq 56(%%rax)\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $136,%%rsp\n\t" \ - "pushq 72(%%rax)\n\t" \ - "pushq 64(%%rax)\n\t" \ - "pushq 56(%%rax)\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "pushq 80(%%rax)\n\t" \ - "pushq 72(%%rax)\n\t" \ - "pushq 64(%%rax)\n\t" \ - "pushq 56(%%rax)\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10,arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $136,%%rsp\n\t" \ - "pushq 88(%%rax)\n\t" \ - "pushq 80(%%rax)\n\t" \ - "pushq 72(%%rax)\n\t" \ - "pushq 64(%%rax)\n\t" \ - "pushq 56(%%rax)\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10,arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - VALGRIND_ALIGN_STACK \ - "subq $128,%%rsp\n\t" \ - "pushq 96(%%rax)\n\t" \ - "pushq 88(%%rax)\n\t" \ - "pushq 80(%%rax)\n\t" \ - "pushq 72(%%rax)\n\t" \ - "pushq 64(%%rax)\n\t" \ - "pushq 56(%%rax)\n\t" \ - "movq 48(%%rax), %%r9\n\t" \ - "movq 40(%%rax), %%r8\n\t" \ - "movq 32(%%rax), %%rcx\n\t" \ - "movq 24(%%rax), %%rdx\n\t" \ - "movq 16(%%rax), %%rsi\n\t" \ - "movq 8(%%rax), %%rdi\n\t" \ - "movq (%%rax), %%rax\n\t" /* target->%rax */ \ - VALGRIND_CALL_NOREDIR_RAX \ - VALGRIND_RESTORE_STACK \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=a" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ - -/* ------------------------ ppc32-linux ------------------------ */ - -#if defined(PLAT_ppc32_linux) - -/* This is useful for finding out about the on-stack stuff: - - extern int f9 ( int,int,int,int,int,int,int,int,int ); - extern int f10 ( int,int,int,int,int,int,int,int,int,int ); - extern int f11 ( int,int,int,int,int,int,int,int,int,int,int ); - extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int ); - - int g9 ( void ) { - return f9(11,22,33,44,55,66,77,88,99); - } - int g10 ( void ) { - return f10(11,22,33,44,55,66,77,88,99,110); - } - int g11 ( void ) { - return f11(11,22,33,44,55,66,77,88,99,110,121); - } - int g12 ( void ) { - return f12(11,22,33,44,55,66,77,88,99,110,121,132); - } -*/ - -/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS \ - "lr", "ctr", "xer", \ - "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ - "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ - "r11", "r12", "r13" - -/* Macros to save and align the stack before making a function - call and restore it afterwards as gcc may not keep the stack - pointer aligned if it doesn't realise calls are being made - to other functions. */ - -#define VALGRIND_ALIGN_STACK \ - "mr 28,1\n\t" \ - "rlwinm 1,1,0,0,27\n\t" -#define VALGRIND_RESTORE_STACK \ - "mr 1,28\n\t" - -/* These CALL_FN_ macros assume that on ppc32-linux, - sizeof(unsigned long) == 4. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 9,28(11)\n\t" \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 9,28(11)\n\t" \ - "lwz 10,32(11)\n\t" /* arg8->r10 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "addi 1,1,-16\n\t" \ - /* arg9 */ \ - "lwz 3,36(11)\n\t" \ - "stw 3,8(1)\n\t" \ - /* args1-8 */ \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 9,28(11)\n\t" \ - "lwz 10,32(11)\n\t" /* arg8->r10 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "addi 1,1,-16\n\t" \ - /* arg10 */ \ - "lwz 3,40(11)\n\t" \ - "stw 3,12(1)\n\t" \ - /* arg9 */ \ - "lwz 3,36(11)\n\t" \ - "stw 3,8(1)\n\t" \ - /* args1-8 */ \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 9,28(11)\n\t" \ - "lwz 10,32(11)\n\t" /* arg8->r10 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10,arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ - _argvec[11] = (unsigned long)arg11; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "addi 1,1,-32\n\t" \ - /* arg11 */ \ - "lwz 3,44(11)\n\t" \ - "stw 3,16(1)\n\t" \ - /* arg10 */ \ - "lwz 3,40(11)\n\t" \ - "stw 3,12(1)\n\t" \ - /* arg9 */ \ - "lwz 3,36(11)\n\t" \ - "stw 3,8(1)\n\t" \ - /* args1-8 */ \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 9,28(11)\n\t" \ - "lwz 10,32(11)\n\t" /* arg8->r10 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10,arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ - _argvec[11] = (unsigned long)arg11; \ - _argvec[12] = (unsigned long)arg12; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "addi 1,1,-32\n\t" \ - /* arg12 */ \ - "lwz 3,48(11)\n\t" \ - "stw 3,20(1)\n\t" \ - /* arg11 */ \ - "lwz 3,44(11)\n\t" \ - "stw 3,16(1)\n\t" \ - /* arg10 */ \ - "lwz 3,40(11)\n\t" \ - "stw 3,12(1)\n\t" \ - /* arg9 */ \ - "lwz 3,36(11)\n\t" \ - "stw 3,8(1)\n\t" \ - /* args1-8 */ \ - "lwz 3,4(11)\n\t" /* arg1->r3 */ \ - "lwz 4,8(11)\n\t" \ - "lwz 5,12(11)\n\t" \ - "lwz 6,16(11)\n\t" /* arg4->r6 */ \ - "lwz 7,20(11)\n\t" \ - "lwz 8,24(11)\n\t" \ - "lwz 9,28(11)\n\t" \ - "lwz 10,32(11)\n\t" /* arg8->r10 */ \ - "lwz 11,0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - VALGRIND_RESTORE_STACK \ - "mr %0,3" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_ppc32_linux */ - -/* ------------------------ ppc64-linux ------------------------ */ - -#if defined(PLAT_ppc64_linux) - -/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS \ - "lr", "ctr", "xer", \ - "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ - "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ - "r11", "r12", "r13" - -/* Macros to save and align the stack before making a function - call and restore it afterwards as gcc may not keep the stack - pointer aligned if it doesn't realise calls are being made - to other functions. */ - -#define VALGRIND_ALIGN_STACK \ - "mr 28,1\n\t" \ - "rldicr 1,1,0,59\n\t" -#define VALGRIND_RESTORE_STACK \ - "mr 1,28\n\t" - -/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned - long) == 8. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+0]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+1]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+2]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+3]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+4]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+5]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+6]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+7]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - _argvec[2+7] = (unsigned long)arg7; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 9, 56(11)\n\t" /* arg7->r9 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+8]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - _argvec[2+7] = (unsigned long)arg7; \ - _argvec[2+8] = (unsigned long)arg8; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 9, 56(11)\n\t" /* arg7->r9 */ \ - "ld 10, 64(11)\n\t" /* arg8->r10 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+9]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - _argvec[2+7] = (unsigned long)arg7; \ - _argvec[2+8] = (unsigned long)arg8; \ - _argvec[2+9] = (unsigned long)arg9; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "addi 1,1,-128\n\t" /* expand stack frame */ \ - /* arg9 */ \ - "ld 3,72(11)\n\t" \ - "std 3,112(1)\n\t" \ - /* args1-8 */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 9, 56(11)\n\t" /* arg7->r9 */ \ - "ld 10, 64(11)\n\t" /* arg8->r10 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+10]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - _argvec[2+7] = (unsigned long)arg7; \ - _argvec[2+8] = (unsigned long)arg8; \ - _argvec[2+9] = (unsigned long)arg9; \ - _argvec[2+10] = (unsigned long)arg10; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "addi 1,1,-128\n\t" /* expand stack frame */ \ - /* arg10 */ \ - "ld 3,80(11)\n\t" \ - "std 3,120(1)\n\t" \ - /* arg9 */ \ - "ld 3,72(11)\n\t" \ - "std 3,112(1)\n\t" \ - /* args1-8 */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 9, 56(11)\n\t" /* arg7->r9 */ \ - "ld 10, 64(11)\n\t" /* arg8->r10 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10,arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+11]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - _argvec[2+7] = (unsigned long)arg7; \ - _argvec[2+8] = (unsigned long)arg8; \ - _argvec[2+9] = (unsigned long)arg9; \ - _argvec[2+10] = (unsigned long)arg10; \ - _argvec[2+11] = (unsigned long)arg11; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "addi 1,1,-144\n\t" /* expand stack frame */ \ - /* arg11 */ \ - "ld 3,88(11)\n\t" \ - "std 3,128(1)\n\t" \ - /* arg10 */ \ - "ld 3,80(11)\n\t" \ - "std 3,120(1)\n\t" \ - /* arg9 */ \ - "ld 3,72(11)\n\t" \ - "std 3,112(1)\n\t" \ - /* args1-8 */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 9, 56(11)\n\t" /* arg7->r9 */ \ - "ld 10, 64(11)\n\t" /* arg8->r10 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10,arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3+12]; \ - volatile unsigned long _res; \ - /* _argvec[0] holds current r2 across the call */ \ - _argvec[1] = (unsigned long)_orig.r2; \ - _argvec[2] = (unsigned long)_orig.nraddr; \ - _argvec[2+1] = (unsigned long)arg1; \ - _argvec[2+2] = (unsigned long)arg2; \ - _argvec[2+3] = (unsigned long)arg3; \ - _argvec[2+4] = (unsigned long)arg4; \ - _argvec[2+5] = (unsigned long)arg5; \ - _argvec[2+6] = (unsigned long)arg6; \ - _argvec[2+7] = (unsigned long)arg7; \ - _argvec[2+8] = (unsigned long)arg8; \ - _argvec[2+9] = (unsigned long)arg9; \ - _argvec[2+10] = (unsigned long)arg10; \ - _argvec[2+11] = (unsigned long)arg11; \ - _argvec[2+12] = (unsigned long)arg12; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "mr 11,%1\n\t" \ - "std 2,-16(11)\n\t" /* save tocptr */ \ - "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ - "addi 1,1,-144\n\t" /* expand stack frame */ \ - /* arg12 */ \ - "ld 3,96(11)\n\t" \ - "std 3,136(1)\n\t" \ - /* arg11 */ \ - "ld 3,88(11)\n\t" \ - "std 3,128(1)\n\t" \ - /* arg10 */ \ - "ld 3,80(11)\n\t" \ - "std 3,120(1)\n\t" \ - /* arg9 */ \ - "ld 3,72(11)\n\t" \ - "std 3,112(1)\n\t" \ - /* args1-8 */ \ - "ld 3, 8(11)\n\t" /* arg1->r3 */ \ - "ld 4, 16(11)\n\t" /* arg2->r4 */ \ - "ld 5, 24(11)\n\t" /* arg3->r5 */ \ - "ld 6, 32(11)\n\t" /* arg4->r6 */ \ - "ld 7, 40(11)\n\t" /* arg5->r7 */ \ - "ld 8, 48(11)\n\t" /* arg6->r8 */ \ - "ld 9, 56(11)\n\t" /* arg7->r9 */ \ - "ld 10, 64(11)\n\t" /* arg8->r10 */ \ - "ld 11, 0(11)\n\t" /* target->r11 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ - "mr 11,%1\n\t" \ - "mr %0,3\n\t" \ - "ld 2,-16(11)\n\t" /* restore tocptr */ \ - VALGRIND_RESTORE_STACK \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[2]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_ppc64_linux */ - -/* ------------------------- arm-linux ------------------------- */ - -#if defined(PLAT_arm_linux) - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14" - -/* Macros to save and align the stack before making a function - call and restore it afterwards as gcc may not keep the stack - pointer aligned if it doesn't realise calls are being made - to other functions. */ - -/* This is a bit tricky. We store the original stack pointer in r10 - as it is callee-saves. gcc doesn't allow the use of r11 for some - reason. Also, we can't directly "bic" the stack pointer in thumb - mode since r13 isn't an allowed register number in that context. - So use r4 as a temporary, since that is about to get trashed - anyway, just after each use of this macro. Side effect is we need - to be very careful about any future changes, since - VALGRIND_ALIGN_STACK simply assumes r4 is usable. */ -#define VALGRIND_ALIGN_STACK \ - "mov r10, sp\n\t" \ - "mov r4, sp\n\t" \ - "bic r4, r4, #7\n\t" \ - "mov sp, r4\n\t" -#define VALGRIND_RESTORE_STACK \ - "mov sp, r10\n\t" - -/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned - long) == 4. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "sub sp, sp, #4 \n\t" \ - "ldr r0, [%1, #20] \n\t" \ - "push {r0} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "push {r0, r1} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "sub sp, sp, #4 \n\t" \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "ldr r2, [%1, #28] \n\t" \ - "push {r0, r1, r2} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "ldr r2, [%1, #28] \n\t" \ - "ldr r3, [%1, #32] \n\t" \ - "push {r0, r1, r2, r3} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "sub sp, sp, #4 \n\t" \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "ldr r2, [%1, #28] \n\t" \ - "ldr r3, [%1, #32] \n\t" \ - "ldr r4, [%1, #36] \n\t" \ - "push {r0, r1, r2, r3, r4} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #40] \n\t" \ - "push {r0} \n\t" \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "ldr r2, [%1, #28] \n\t" \ - "ldr r3, [%1, #32] \n\t" \ - "ldr r4, [%1, #36] \n\t" \ - "push {r0, r1, r2, r3, r4} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "sub sp, sp, #4 \n\t" \ - "ldr r0, [%1, #40] \n\t" \ - "ldr r1, [%1, #44] \n\t" \ - "push {r0, r1} \n\t" \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "ldr r2, [%1, #28] \n\t" \ - "ldr r3, [%1, #32] \n\t" \ - "ldr r4, [%1, #36] \n\t" \ - "push {r0, r1, r2, r3, r4} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - VALGRIND_ALIGN_STACK \ - "ldr r0, [%1, #40] \n\t" \ - "ldr r1, [%1, #44] \n\t" \ - "ldr r2, [%1, #48] \n\t" \ - "push {r0, r1, r2} \n\t" \ - "ldr r0, [%1, #20] \n\t" \ - "ldr r1, [%1, #24] \n\t" \ - "ldr r2, [%1, #28] \n\t" \ - "ldr r3, [%1, #32] \n\t" \ - "ldr r4, [%1, #36] \n\t" \ - "push {r0, r1, r2, r3, r4} \n\t" \ - "ldr r0, [%1, #4] \n\t" \ - "ldr r1, [%1, #8] \n\t" \ - "ldr r2, [%1, #12] \n\t" \ - "ldr r3, [%1, #16] \n\t" \ - "ldr r4, [%1] \n\t" /* target->r4 */ \ - VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ - VALGRIND_RESTORE_STACK \ - "mov %0, r0" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_arm_linux */ - -/* ------------------------- s390x-linux ------------------------- */ - -#if defined(PLAT_s390x_linux) - -/* Similar workaround as amd64 (see above), but we use r11 as frame - pointer and save the old r11 in r7. r11 might be used for - argvec, therefore we copy argvec in r1 since r1 is clobbered - after the call anyway. */ -#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) -# define __FRAME_POINTER \ - ,"d"(__builtin_dwarf_cfa()) -# define VALGRIND_CFI_PROLOGUE \ - ".cfi_remember_state\n\t" \ - "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */ \ - "lgr 7,11\n\t" \ - "lgr 11,%2\n\t" \ - ".cfi_def_cfa r11, 0\n\t" -# define VALGRIND_CFI_EPILOGUE \ - "lgr 11, 7\n\t" \ - ".cfi_restore_state\n\t" -#else -# define __FRAME_POINTER -# define VALGRIND_CFI_PROLOGUE \ - "lgr 1,%1\n\t" -# define VALGRIND_CFI_EPILOGUE -#endif - -/* Nb: On s390 the stack pointer is properly aligned *at all times* - according to the s390 GCC maintainer. (The ABI specification is not - precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and - VALGRIND_RESTORE_STACK are not defined here. */ - -/* These regs are trashed by the hidden call. Note that we overwrite - r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the - function a proper return address. All others are ABI defined call - clobbers. */ -#define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \ - "f0","f1","f2","f3","f4","f5","f6","f7" - -/* Nb: Although r11 is modified in the asm snippets below (inside - VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for - two reasons: - (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not - modified - (2) GCC will complain that r11 cannot appear inside a clobber section, - when compiled with -O -fno-omit-frame-pointer - */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-160\n\t" \ - "lg 1, 0(1)\n\t" /* target->r1 */ \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,160\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "d" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -/* The call abi has the arguments in r2-r6 and stack */ -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-160\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,160\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1, arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-160\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,160\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-160\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,160\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-160\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,160\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-160\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,160\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-168\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,168\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-176\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,176\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7 ,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-184\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,184\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7 ,arg8, arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-192\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ - "mvc 184(8,15), 72(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,192\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7 ,arg8, arg9, arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-200\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ - "mvc 184(8,15), 72(1)\n\t" \ - "mvc 192(8,15), 80(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,200\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7 ,arg8, arg9, arg10, arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ - _argvec[11] = (unsigned long)arg11; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-208\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ - "mvc 184(8,15), 72(1)\n\t" \ - "mvc 192(8,15), 80(1)\n\t" \ - "mvc 200(8,15), 88(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,208\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)arg1; \ - _argvec[2] = (unsigned long)arg2; \ - _argvec[3] = (unsigned long)arg3; \ - _argvec[4] = (unsigned long)arg4; \ - _argvec[5] = (unsigned long)arg5; \ - _argvec[6] = (unsigned long)arg6; \ - _argvec[7] = (unsigned long)arg7; \ - _argvec[8] = (unsigned long)arg8; \ - _argvec[9] = (unsigned long)arg9; \ - _argvec[10] = (unsigned long)arg10; \ - _argvec[11] = (unsigned long)arg11; \ - _argvec[12] = (unsigned long)arg12; \ - __asm__ volatile( \ - VALGRIND_CFI_PROLOGUE \ - "aghi 15,-216\n\t" \ - "lg 2, 8(1)\n\t" \ - "lg 3,16(1)\n\t" \ - "lg 4,24(1)\n\t" \ - "lg 5,32(1)\n\t" \ - "lg 6,40(1)\n\t" \ - "mvc 160(8,15), 48(1)\n\t" \ - "mvc 168(8,15), 56(1)\n\t" \ - "mvc 176(8,15), 64(1)\n\t" \ - "mvc 184(8,15), 72(1)\n\t" \ - "mvc 192(8,15), 80(1)\n\t" \ - "mvc 200(8,15), 88(1)\n\t" \ - "mvc 208(8,15), 96(1)\n\t" \ - "lg 1, 0(1)\n\t" \ - VALGRIND_CALL_NOREDIR_R1 \ - "lgr %0, 2\n\t" \ - "aghi 15,216\n\t" \ - VALGRIND_CFI_EPILOGUE \ - : /*out*/ "=d" (_res) \ - : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ - : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - - -#endif /* PLAT_s390x_linux */ - -/* ------------------------- mips32-linux ----------------------- */ - -#if defined(PLAT_mips32_linux) - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ -"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ -"$25", "$31" - -/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned - long) == 4. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "subu $29, $29, 16 \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 16\n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "subu $29, $29, 16 \n\t" \ - "lw $4, 4(%1) \n\t" /* arg1*/ \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 16 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "subu $29, $29, 16 \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 16 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "subu $29, $29, 16 \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 16 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "subu $29, $29, 16 \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 16 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 24\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 24 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 32\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "nop\n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 32 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 32\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 28(%1) \n\t" \ - "sw $4, 24($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 32 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 40\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 28(%1) \n\t" \ - "sw $4, 24($29) \n\t" \ - "lw $4, 32(%1) \n\t" \ - "sw $4, 28($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 40 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 40\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 28(%1) \n\t" \ - "sw $4, 24($29) \n\t" \ - "lw $4, 32(%1) \n\t" \ - "sw $4, 28($29) \n\t" \ - "lw $4, 36(%1) \n\t" \ - "sw $4, 32($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 40 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 48\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 28(%1) \n\t" \ - "sw $4, 24($29) \n\t" \ - "lw $4, 32(%1) \n\t" \ - "sw $4, 28($29) \n\t" \ - "lw $4, 36(%1) \n\t" \ - "sw $4, 32($29) \n\t" \ - "lw $4, 40(%1) \n\t" \ - "sw $4, 36($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 48 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 48\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 28(%1) \n\t" \ - "sw $4, 24($29) \n\t" \ - "lw $4, 32(%1) \n\t" \ - "sw $4, 28($29) \n\t" \ - "lw $4, 36(%1) \n\t" \ - "sw $4, 32($29) \n\t" \ - "lw $4, 40(%1) \n\t" \ - "sw $4, 36($29) \n\t" \ - "lw $4, 44(%1) \n\t" \ - "sw $4, 40($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 48 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - "subu $29, $29, 8 \n\t" \ - "sw $28, 0($29) \n\t" \ - "sw $31, 4($29) \n\t" \ - "lw $4, 20(%1) \n\t" \ - "subu $29, $29, 56\n\t" \ - "sw $4, 16($29) \n\t" \ - "lw $4, 24(%1) \n\t" \ - "sw $4, 20($29) \n\t" \ - "lw $4, 28(%1) \n\t" \ - "sw $4, 24($29) \n\t" \ - "lw $4, 32(%1) \n\t" \ - "sw $4, 28($29) \n\t" \ - "lw $4, 36(%1) \n\t" \ - "sw $4, 32($29) \n\t" \ - "lw $4, 40(%1) \n\t" \ - "sw $4, 36($29) \n\t" \ - "lw $4, 44(%1) \n\t" \ - "sw $4, 40($29) \n\t" \ - "lw $4, 48(%1) \n\t" \ - "sw $4, 44($29) \n\t" \ - "lw $4, 4(%1) \n\t" \ - "lw $5, 8(%1) \n\t" \ - "lw $6, 12(%1) \n\t" \ - "lw $7, 16(%1) \n\t" \ - "lw $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "addu $29, $29, 56 \n\t" \ - "lw $28, 0($29) \n\t" \ - "lw $31, 4($29) \n\t" \ - "addu $29, $29, 8 \n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_mips32_linux */ - -/* ------------------------- mips64-linux ------------------------- */ - -#if defined(PLAT_mips64_linux) - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ -"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ -"$25", "$31" - -/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned - long) == 4. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "0" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" /* arg1*/ \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $10, 56(%1)\n\t" \ - "ld $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $10, 56(%1)\n\t" \ - "ld $11, 64(%1)\n\t" \ - "ld $25, 0(%1) \n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - "dsubu $29, $29, 8\n\t" \ - "ld $4, 72(%1)\n\t" \ - "sd $4, 0($29)\n\t" \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $10, 56(%1)\n\t" \ - "ld $11, 64(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "daddu $29, $29, 8\n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - "dsubu $29, $29, 16\n\t" \ - "ld $4, 72(%1)\n\t" \ - "sd $4, 0($29)\n\t" \ - "ld $4, 80(%1)\n\t" \ - "sd $4, 8($29)\n\t" \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $10, 56(%1)\n\t" \ - "ld $11, 64(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "daddu $29, $29, 16\n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - "dsubu $29, $29, 24\n\t" \ - "ld $4, 72(%1)\n\t" \ - "sd $4, 0($29)\n\t" \ - "ld $4, 80(%1)\n\t" \ - "sd $4, 8($29)\n\t" \ - "ld $4, 88(%1)\n\t" \ - "sd $4, 16($29)\n\t" \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $10, 56(%1)\n\t" \ - "ld $11, 64(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "daddu $29, $29, 24\n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - "dsubu $29, $29, 32\n\t" \ - "ld $4, 72(%1)\n\t" \ - "sd $4, 0($29)\n\t" \ - "ld $4, 80(%1)\n\t" \ - "sd $4, 8($29)\n\t" \ - "ld $4, 88(%1)\n\t" \ - "sd $4, 16($29)\n\t" \ - "ld $4, 96(%1)\n\t" \ - "sd $4, 24($29)\n\t" \ - "ld $4, 8(%1)\n\t" \ - "ld $5, 16(%1)\n\t" \ - "ld $6, 24(%1)\n\t" \ - "ld $7, 32(%1)\n\t" \ - "ld $8, 40(%1)\n\t" \ - "ld $9, 48(%1)\n\t" \ - "ld $10, 56(%1)\n\t" \ - "ld $11, 64(%1)\n\t" \ - "ld $25, 0(%1)\n\t" /* target->t9 */ \ - VALGRIND_CALL_NOREDIR_T9 \ - "daddu $29, $29, 32\n\t" \ - "move %0, $2\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS \ - ); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#endif /* PLAT_mips64_linux */ - - -/* ------------------------------------------------------------------ */ -/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ -/* */ -/* ------------------------------------------------------------------ */ - -/* Some request codes. There are many more of these, but most are not - exposed to end-user view. These are the public ones, all of the - form 0x1000 + small_number. - - Core ones are in the range 0x00000000--0x0000ffff. The non-public - ones start at 0x2000. -*/ - -/* These macros are used by tools -- they must be public, but don't - embed them into other programs. */ -#define VG_USERREQ_TOOL_BASE(a,b) \ - ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) -#define VG_IS_TOOL_USERREQ(a, b, v) \ - (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) - -/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! - This enum comprises an ABI exported by Valgrind to programs - which use client requests. DO NOT CHANGE THE ORDER OF THESE - ENTRIES, NOR DELETE ANY -- add new ones at the end. */ -typedef - enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, - VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, - - /* These allow any function to be called from the simulated - CPU but run on the real CPU. Nb: the first arg passed to - the function is always the ThreadId of the running - thread! So CLIENT_CALL0 actually requires a 1 arg - function, etc. */ - VG_USERREQ__CLIENT_CALL0 = 0x1101, - VG_USERREQ__CLIENT_CALL1 = 0x1102, - VG_USERREQ__CLIENT_CALL2 = 0x1103, - VG_USERREQ__CLIENT_CALL3 = 0x1104, - - /* Can be useful in regression testing suites -- eg. can - send Valgrind's output to /dev/null and still count - errors. */ - VG_USERREQ__COUNT_ERRORS = 0x1201, - - /* Allows the client program and/or gdbserver to execute a monitor - command. */ - VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202, - - /* These are useful and can be interpreted by any tool that - tracks malloc() et al, by using vg_replace_malloc.c. */ - VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301, - VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b, - VG_USERREQ__FREELIKE_BLOCK = 0x1302, - /* Memory pool support. */ - VG_USERREQ__CREATE_MEMPOOL = 0x1303, - VG_USERREQ__DESTROY_MEMPOOL = 0x1304, - VG_USERREQ__MEMPOOL_ALLOC = 0x1305, - VG_USERREQ__MEMPOOL_FREE = 0x1306, - VG_USERREQ__MEMPOOL_TRIM = 0x1307, - VG_USERREQ__MOVE_MEMPOOL = 0x1308, - VG_USERREQ__MEMPOOL_CHANGE = 0x1309, - VG_USERREQ__MEMPOOL_EXISTS = 0x130a, - - /* Allow printfs to valgrind log. */ - /* The first two pass the va_list argument by value, which - assumes it is the same size as or smaller than a UWord, - which generally isn't the case. Hence are deprecated. - The second two pass the vargs by reference and so are - immune to this problem. */ - /* both :: char* fmt, va_list vargs (DEPRECATED) */ - VG_USERREQ__PRINTF = 0x1401, - VG_USERREQ__PRINTF_BACKTRACE = 0x1402, - /* both :: char* fmt, va_list* vargs */ - VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403, - VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404, - - /* Stack support. */ - VG_USERREQ__STACK_REGISTER = 0x1501, - VG_USERREQ__STACK_DEREGISTER = 0x1502, - VG_USERREQ__STACK_CHANGE = 0x1503, - - /* Wine support */ - VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601, - - /* Querying of debug info. */ - VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701, - - /* Disable/enable error reporting level. Takes a single - Word arg which is the delta to this thread's error - disablement indicator. Hence 1 disables or further - disables errors, and -1 moves back towards enablement. - Other values are not allowed. */ - VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801, - - /* Initialise IR injection */ - VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901 - } Vg_ClientRequest; - -#if !defined(__GNUC__) -# define __extension__ /* */ -#endif - - -/* Returns the number of Valgrinds this code is running under. That - is, 0 if running natively, 1 if running under Valgrind, 2 if - running under Valgrind which is running under another Valgrind, - etc. */ -#define RUNNING_ON_VALGRIND \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */, \ - VG_USERREQ__RUNNING_ON_VALGRIND, \ - 0, 0, 0, 0, 0) \ - - -/* Discard translation of code in the range [_qzz_addr .. _qzz_addr + - _qzz_len - 1]. Useful if you are debugging a JITter or some such, - since it provides a way to make sure valgrind will retranslate the - invalidated area. Returns no value. */ -#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \ - _qzz_addr, _qzz_len, 0, 0, 0) - - -/* These requests are for getting Valgrind itself to print something. - Possibly with a backtrace. This is a really ugly hack. The return value - is the number of characters printed, excluding the "**** " part at the - start and the backtrace (if present). */ - -#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER) -/* Modern GCC will optimize the static routine out if unused, - and unused attribute will shut down warnings about it. */ -static int VALGRIND_PRINTF(const char *format, ...) - __attribute__((format(__printf__, 1, 2), __unused__)); -#endif -static int -#if defined(_MSC_VER) -__inline -#endif -VALGRIND_PRINTF(const char *format, ...) -{ -#if defined(NVALGRIND) - return 0; -#else /* NVALGRIND */ -#if defined(_MSC_VER) || defined(__MINGW64__) - uintptr_t _qzz_res; -#else - unsigned long _qzz_res; -#endif - va_list vargs; - va_start(vargs, format); -#if defined(_MSC_VER) || defined(__MINGW64__) - _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, - VG_USERREQ__PRINTF_VALIST_BY_REF, - (uintptr_t)format, - (uintptr_t)&vargs, - 0, 0, 0); -#else - _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, - VG_USERREQ__PRINTF_VALIST_BY_REF, - (unsigned long)format, - (unsigned long)&vargs, - 0, 0, 0); -#endif - va_end(vargs); - return (int)_qzz_res; -#endif /* NVALGRIND */ -} - -#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER) -static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) - __attribute__((format(__printf__, 1, 2), __unused__)); -#endif -static int -#if defined(_MSC_VER) -__inline -#endif -VALGRIND_PRINTF_BACKTRACE(const char *format, ...) -{ -#if defined(NVALGRIND) - return 0; -#else /* NVALGRIND */ -#if defined(_MSC_VER) || defined(__MINGW64__) - uintptr_t _qzz_res; -#else - unsigned long _qzz_res; -#endif - va_list vargs; - va_start(vargs, format); -#if defined(_MSC_VER) || defined(__MINGW64__) - _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, - VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, - (uintptr_t)format, - (uintptr_t)&vargs, - 0, 0, 0); -#else - _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, - VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, - (unsigned long)format, - (unsigned long)&vargs, - 0, 0, 0); -#endif - va_end(vargs); - return (int)_qzz_res; -#endif /* NVALGRIND */ -} - - -/* These requests allow control to move from the simulated CPU to the - real CPU, calling an arbitary function. - - Note that the current ThreadId is inserted as the first argument. - So this call: - - VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) - - requires f to have this signature: - - Word f(Word tid, Word arg1, Word arg2) - - where "Word" is a word-sized type. - - Note that these client requests are not entirely reliable. For example, - if you call a function with them that subsequently calls printf(), - there's a high chance Valgrind will crash. Generally, your prospects of - these working are made higher if the called function does not refer to - any global variables, and does not refer to any libc or other functions - (printf et al). Any kind of entanglement with libc or dynamic linking is - likely to have a bad outcome, for tricky reasons which we've grappled - with a lot in the past. -*/ -#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__CLIENT_CALL0, \ - _qyy_fn, \ - 0, 0, 0, 0) - -#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__CLIENT_CALL1, \ - _qyy_fn, \ - _qyy_arg1, 0, 0, 0) - -#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__CLIENT_CALL2, \ - _qyy_fn, \ - _qyy_arg1, _qyy_arg2, 0, 0) - -#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ - VG_USERREQ__CLIENT_CALL3, \ - _qyy_fn, \ - _qyy_arg1, _qyy_arg2, \ - _qyy_arg3, 0) - - -/* Counts the number of errors that have been recorded by a tool. Nb: - the tool must record the errors with VG_(maybe_record_error)() or - VG_(unique_error)() for them to be counted. */ -#define VALGRIND_COUNT_ERRORS \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - 0 /* default return */, \ - VG_USERREQ__COUNT_ERRORS, \ - 0, 0, 0, 0, 0) - -/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing - when heap blocks are allocated in order to give accurate results. This - happens automatically for the standard allocator functions such as - malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete, - delete[], etc. - - But if your program uses a custom allocator, this doesn't automatically - happen, and Valgrind will not do as well. For example, if you allocate - superblocks with mmap() and then allocates chunks of the superblocks, all - Valgrind's observations will be at the mmap() level and it won't know that - the chunks should be considered separate entities. In Memcheck's case, - that means you probably won't get heap block overrun detection (because - there won't be redzones marked as unaddressable) and you definitely won't - get any leak detection. - - The following client requests allow a custom allocator to be annotated so - that it can be handled accurately by Valgrind. - - VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated - by a malloc()-like function. For Memcheck (an illustrative case), this - does two things: - - - It records that the block has been allocated. This means any addresses - within the block mentioned in error messages will be - identified as belonging to the block. It also means that if the block - isn't freed it will be detected by the leak checker. - - - It marks the block as being addressable and undefined (if 'is_zeroed' is - not set), or addressable and defined (if 'is_zeroed' is set). This - controls how accesses to the block by the program are handled. - - 'addr' is the start of the usable block (ie. after any - redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator - can apply redzones -- these are blocks of padding at the start and end of - each block. Adding redzones is recommended as it makes it much more likely - Valgrind will spot block overruns. `is_zeroed' indicates if the memory is - zeroed (or filled with another predictable value), as is the case for - calloc(). - - VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a - heap block -- that will be used by the client program -- is allocated. - It's best to put it at the outermost level of the allocator if possible; - for example, if you have a function my_alloc() which calls - internal_alloc(), and the client request is put inside internal_alloc(), - stack traces relating to the heap block will contain entries for both - my_alloc() and internal_alloc(), which is probably not what you want. - - For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out - custom blocks from within a heap block, B, that has been allocated with - malloc/calloc/new/etc, then block B will be *ignored* during leak-checking - -- the custom blocks will take precedence. - - VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK. For - Memcheck, it does two things: - - - It records that the block has been deallocated. This assumes that the - block was annotated as having been allocated via - VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. - - - It marks the block as being unaddressable. - - VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a - heap block is deallocated. - - VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For - Memcheck, it does four things: - - - It records that the size of a block has been changed. This assumes that - the block was annotated as having been allocated via - VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. - - - If the block shrunk, it marks the freed memory as being unaddressable. - - - If the block grew, it marks the new area as undefined and defines a red - zone past the end of the new block. - - - The V-bits of the overlap between the old and the new block are preserved. - - VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block - and before deallocation of the old block. - - In many cases, these three client requests will not be enough to get your - allocator working well with Memcheck. More specifically, if your allocator - writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call - will be necessary to mark the memory as addressable just before the zeroing - occurs, otherwise you'll get a lot of invalid write errors. For example, - you'll need to do this if your allocator recycles freed blocks, but it - zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK). - Alternatively, if your allocator reuses freed blocks for allocator-internal - data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary. - - Really, what's happening is a blurring of the lines between the client - program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the - memory should be considered unaddressable to the client program, but the - allocator knows more than the rest of the client program and so may be able - to safely access it. Extra client requests are necessary for Valgrind to - understand the distinction between the allocator and the rest of the - program. - - Ignored if addr == 0. -*/ -#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \ - addr, sizeB, rzB, is_zeroed, 0) - -/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. - Ignored if addr == 0. -*/ -#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \ - addr, oldSizeB, newSizeB, rzB, 0) - -/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. - Ignored if addr == 0. -*/ -#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \ - addr, rzB, 0, 0, 0) - -/* Create a memory pool. */ -#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \ - pool, rzB, is_zeroed, 0, 0) - -/* Destroy a memory pool. */ -#define VALGRIND_DESTROY_MEMPOOL(pool) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \ - pool, 0, 0, 0, 0) - -/* Associate a piece of memory with a memory pool. */ -#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \ - pool, addr, size, 0, 0) - -/* Disassociate a piece of memory from a memory pool. */ -#define VALGRIND_MEMPOOL_FREE(pool, addr) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \ - pool, addr, 0, 0, 0) - -/* Disassociate any pieces outside a particular range. */ -#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \ - pool, addr, size, 0, 0) - -/* Resize and/or move a piece associated with a memory pool. */ -#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \ - poolA, poolB, 0, 0, 0) - -/* Resize and/or move a piece associated with a memory pool. */ -#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \ - pool, addrA, addrB, size, 0) - -/* Return 1 if a mempool exists, else 0. */ -#define VALGRIND_MEMPOOL_EXISTS(pool) \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__MEMPOOL_EXISTS, \ - pool, 0, 0, 0, 0) - -/* Mark a piece of memory as being a stack. Returns a stack id. */ -#define VALGRIND_STACK_REGISTER(start, end) \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__STACK_REGISTER, \ - start, end, 0, 0, 0) - -/* Unmark the piece of memory associated with a stack id as being a - stack. */ -#define VALGRIND_STACK_DEREGISTER(id) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \ - id, 0, 0, 0, 0) - -/* Change the start and end address of the stack id. */ -#define VALGRIND_STACK_CHANGE(id, start, end) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \ - id, start, end, 0, 0) - -/* Load PDB debug info for Wine PE image_map. */ -#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \ - fd, ptr, total_size, delta, 0) - -/* Map a code address to a source file name and line number. buf64 - must point to a 64-byte buffer in the caller's address space. The - result will be dumped in there and is guaranteed to be zero - terminated. If no info is found, the first byte is set to zero. */ -#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \ - (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ - VG_USERREQ__MAP_IP_TO_SRCLOC, \ - addr, buf64, 0, 0, 0) - -/* Disable error reporting for this thread. Behaves in a stack like - way, so you can safely call this multiple times provided that - VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times - to re-enable reporting. The first call of this macro disables - reporting. Subsequent calls have no effect except to increase the - number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable - reporting. Child threads do not inherit this setting from their - parents -- they are always created with reporting enabled. */ -#define VALGRIND_DISABLE_ERROR_REPORTING \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ - 1, 0, 0, 0, 0) - -/* Re-enable error reporting, as per comments on - VALGRIND_DISABLE_ERROR_REPORTING. */ -#define VALGRIND_ENABLE_ERROR_REPORTING \ - VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ - -1, 0, 0, 0, 0) - -/* Execute a monitor command from the client program. - If a connection is opened with GDB, the output will be sent - according to the output mode set for vgdb. - If no connection is opened, output will go to the log output. - Returns 1 if command not recognised, 0 otherwise. */ -#define VALGRIND_MONITOR_COMMAND(command) \ - VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \ - command, 0, 0, 0, 0) - - -#undef PLAT_x86_darwin -#undef PLAT_amd64_darwin -#undef PLAT_x86_win32 -#undef PLAT_amd64_win64 -#undef PLAT_x86_linux -#undef PLAT_amd64_linux -#undef PLAT_ppc32_linux -#undef PLAT_ppc64_linux -#undef PLAT_arm_linux -#undef PLAT_s390x_linux -#undef PLAT_mips32_linux -#undef PLAT_mips64_linux - -#endif /* __VALGRIND_H */ diff -Nru gcr-3.38.1/build-aux/gcr.supp gcr-3.40.0/build-aux/gcr.supp --- gcr-3.38.1/build-aux/gcr.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/gcr.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,14 @@ +{ + gcr_pkcs11_set_trust_store_uri + Memcheck:Leak + ... + fun:g_strdup + fun:gcr_pkcs11_set_trust_store_uri +} +{ + gcr_pkcs11_set_trust_lookup_uris + Memcheck:Leak + ... + fun:g_strdupv + fun:gcr_pkcs11_set_trust_lookup_uris +} diff -Nru gcr-3.38.1/build-aux/gcrypt.supp gcr-3.40.0/build-aux/gcrypt.supp --- gcr-3.38.1/build-aux/gcrypt.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/gcrypt.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,39 @@ +{ + gpg_err_init + Memcheck:Leak + ... + fun:gpg_err_init +} +{ + _gcry_module_add + Memcheck:Leak + ... + fun:_gcry_module_add +} +{ + _gcry_rngcsprng_create_nonce + Memcheck:Leak + ... + fun:_gcry_malloc + ... + fun:initialize + fun:_gcry_rngcsprng_create_nonce +} +{ + _gcry_rngcsprng_create_nonce + Memcheck:Leak + ... + fun:_gcry_malloc + ... + fun:initialize + fun:_gcry_rngcsprng_randomize +} +{ + gcry_control__init + Memcheck:Leak + ... + fun:glib_thread_mutex_init + ... + fun:_gcry_vcontrol + fun:gcry_control +} diff -Nru gcr-3.38.1/build-aux/glibc.supp gcr-3.40.0/build-aux/glibc.supp --- gcr-3.38.1/build-aux/glibc.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/glibc.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,13 @@ +{ + dlclose + Memcheck:Leak + ... + fun:dlclose +} +{ + dlopen + Memcheck:Leak + ... + fun:_dlerror_run + fun:dlopen@@GLIBC_2.2.5 +} diff -Nru gcr-3.38.1/build-aux/glib.supp gcr-3.40.0/build-aux/glib.supp --- gcr-3.38.1/build-aux/glib.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/glib.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,419 @@ +{ + g_type_register_static_1 + Memcheck:Leak + ... + fun:g_type_register_static +} +{ + g_type_register_fundamental + Memcheck:Leak + ... + fun:g_type_register_fundamental +} +{ + g_type_init_with_debug_flags + Memcheck:Leak + ... + fun:g_type_init_with_debug_flags +} +{ + g_type_class_ref + Memcheck:Leak + ... + fun:g_type_class_ref +} +{ + g_type_add_interface_static + Memcheck:Leak + ... + fun:g_type_add_interface_static +} +{ + g_param_spec_internal + Memcheck:Leak + ... + fun:g_type_class_ref + fun:g_type_create_instance + fun:g_param_spec_internal +} +{ + g_param_spec_enum + Memcheck:Leak + ... + fun:g_type_class_ref + fun:g_param_spec_enum +} +{ + g_param_spec_flags + Memcheck:Leak + ... + fun:g_type_class_ref + fun:g_param_spec_flags +} +{ + g_quark_from_static_string + Memcheck:Leak + ... + fun:g_quark_from_static_string +} +{ + g_quark_from_string + Memcheck:Leak + ... + fun:g_quark_from_string +} +{ + g_value_register_transform_func + Memcheck:Leak + ... + fun:g_value_register_transform_func +} +{ + test_run_seed + Memcheck:Leak + ... + fun:g_rand_new_with_seed_array + fun:test_run_seed + ... + fun:g_test_run_suite +} +{ + g_test_init + Memcheck:Leak + ... + fun:g_test_init +} +{ + g_intern_static_string + Memcheck:Leak + ... + fun:g_intern_static_string +} +{ + g_main_context_push_thread_default + Memcheck:Leak + ... + fun:g_queue_new + fun:g_main_context_push_thread_default +} +{ + g_dbus_error_register_error + Memcheck:Leak + ... + fun:g_dbus_error_register_error +} +{ + g_param_spec_pool_insert + Memcheck:Leak + ... + fun:g_param_spec_pool_insert +} +{ + g_main_context_default + Memcheck:Leak + ... + fun:g_main_context_default +} +{ + g_main_context_check + Memcheck:Leak + ... + fun:g_ptr_array_add + fun:g_main_context_check +} +{ + g_test_run_suite + Memcheck:Leak + ... + fun:g_slist_copy + fun:g_test_run_suite_internal + fun:g_test_run_suite +} +{ + g_dbus_interface_info_cache_build + Memcheck:Leak + ... + fun:g_dbus_interface_info_cache_build +} +{ + g_cancellable_push_current + Memcheck:Leak + ... + fun:thread_memory_from_self + ... + fun:g_cancellable_push_current +} +{ + g_io_scheduler_push_job + Memcheck:Leak + ... + fun:init_scheduler + fun:g_once_impl + fun:g_io_scheduler_push_job +} +{ + g_io_scheduler_push_job_2 + Memcheck:Leak + ... + fun:g_system_thread_new + ... + fun:g_io_scheduler_push_job +} +{ + g_bus_get_sync__available_connections + Memcheck:Leak + ... + fun:g_hash_table_new + fun:initable_init + fun:g_initable_init + fun:g_bus_get_sync +} +{ + g_socket_connection_factory_register_type + Memcheck:Leak + ... + fun:g_socket_connection_factory_register_type +} +{ + g_test_add_vtable + Memcheck:Leak + ... + fun:g_test_add_vtable +} +{ + g_mutex_lock + Memcheck:Leak + ... + fun:g_mutex_impl_new + fun:g_mutex_get_impl + fun:g_mutex_lock +} +{ + g_thread_self + Memcheck:Leak + ... + fun:g_thread_self +} +{ + g_rec_mutex_lock + Memcheck:Leak + ... + fun:g_rec_mutex_impl_new + fun:g_rec_mutex_get_impl + fun:g_rec_mutex_lock +} +{ + test_case_run + Memcheck:Leak + ... + fun:g_malloc0 + fun:test_case_run + ... + fun:g_test_run_suite +} +{ + g_get_charset + Memcheck:Leak + ... + fun:g_get_charset +} +{ + g_test_run_suite__timer_new + Memcheck:Leak + ... + fun:g_timer_new + fun:test_case_run + ... + fun:g_test_run_suite +} +{ + g_test_run_suite__timer_new2 + Memcheck:Leak + ... + fun:g_timer_new + fun:test_case_run* + ... + fun:g_test_run_suite +} +{ + g_test_run_suite__strconcat + Memcheck:Leak + ... + fun:g_strconcat + fun:test_case_run + ... + fun:g_test_run_suite + fun:g_test_run +} +{ + g_type_interface_add_prerequisite + Memcheck:Leak + ... + fun:g_type_interface_add_prerequisite +} +{ + g_test_run_suite_2 + Memcheck:Leak + ... + fun:g_slist_copy + fun:g_test_run_suite_internal + ... + fun:g_test_run_suite +} +{ + g_test_run_suite_3 + Memcheck:Leak + ... + fun:g_malloc0 + fun:g_test_run_suite_internal + ... + fun:g_test_run_suite +} +{ + g_set_prgname + Memcheck:Leak + ... + fun:g_set_prgname +} +{ + g_test_run_suite__strconcat_2 + Memcheck:Leak + ... + fun:g_strconcat + fun:g_test_run_suite_internal +} +{ + g_test_run_suite__strdup + Memcheck:Leak + ... + fun:g_strdup + fun:g_test_run_suite_internal +} +{ + g_private_get + Memcheck:Leak + ... + fun:g_private_get +} +{ + g_private_set + Memcheck:Leak + ... + fun:g_private_set +} +{ + g_static_private_set_1 + Memcheck:Leak + ... + fun:g_array_set_size + fun:g_static_private_set +} +{ + g_static_private_set_2 + Memcheck:Leak + ... + fun:g_array_sized_new + fun:g_static_private_set +} +{ + g_static_mutex_get_mutex_impl + Memcheck:Leak + ... + fun:g_static_mutex_get_mutex_impl +} +{ + g_variant_type_info_unref + Memcheck:Leak + ... + fun:g_hash_table_remove + fun:g_variant_type_info_unref +} +{ + g_get_filename_charsets + Memcheck:Leak + ... + fun:g_get_filename_charsets +} +{ + g_intern_string + Memcheck:Leak + ... + fun:g_intern_string +} +{ + g_main_context_iterate + Memcheck:Leak + ... + fun:g_malloc + fun:g_main_context_iterate +} +{ + g_main_context_dispatch + Memcheck:Leak + ... + fun:get_dispatch + fun:g_main_context_dispatch +} +{ + g_log_set_handler + Memcheck:Leak + ... + fun:g_log_set_handler +} +{ + g_simple_async_result_complete + Memcheck:Leak + ... + fun:g_main_context_push_thread_default + fun:g_simple_async_result_complete +} +{ + + Memcheck:Leak + ... + fun:g_static_private_set + fun:g_module_open +} +{ + g_child_watch_source_new + Memcheck:Leak + ... + fun:ensure_unix_signal_handler_installed_unlocked + fun:g_child_watch_source_new +} +{ + g_thread_pool_thread_proxy + Memcheck:Leak + ... + fun:g_malloc + fun:g_cond_new_posix_impl + ... + fun:g_async_queue_timed_pop + fun:g_thread_pool_thread_proxy +} +{ + g_module_open + Memcheck:Leak + ... + fun:g_private_impl_new + ... + fun:g_module_open +} +{ + g_system_thread_new + Memcheck:Leak + ... + fun:g_system_thread_new +} +{ + thread_memory_from_self + Memcheck:Leak + ... + fun:thread_memory_from_self +} +{ + g_get_language_names + Memcheck:Leak + ... + fun:g_get_language_names +} diff -Nru gcr-3.38.1/build-aux/p11-kit.supp gcr-3.40.0/build-aux/p11-kit.supp --- gcr-3.38.1/build-aux/p11-kit.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/p11-kit.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,6 @@ +{ + _p11_library_get_thread_local + Memcheck:Leak + ... + fun:_p11_library_get_thread_local +} diff -Nru gcr-3.38.1/build-aux/pixman.supp gcr-3.40.0/build-aux/pixman.supp --- gcr-3.38.1/build-aux/pixman.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/pixman.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,6 @@ +{ + pixman + Memcheck:Leak + fun:malloc + obj:/usr/lib64/libpixman-1.so.0.22.2 +} diff -Nru gcr-3.38.1/build-aux/pthread.supp gcr-3.40.0/build-aux/pthread.supp --- gcr-3.38.1/build-aux/pthread.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/pthread.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,7 @@ +{ + _dl_allocate_tls + Memcheck:Leak + ... + fun:_dl_allocate_tls + fun:pthread_create* +} diff -Nru gcr-3.38.1/build-aux/unknown.supp gcr-3.40.0/build-aux/unknown.supp --- gcr-3.38.1/build-aux/unknown.supp 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/unknown.supp 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,420 @@ +{ + _g_dbus_shared_thread_ref + Memcheck:Leak + ... + fun:_g_dbus_shared_thread_ref +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:g_type_create_instance + fun:g_object_constructor + fun:g_object_newv + fun:g_object_new + fun:g_dbus_message_new + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb + fun:g_simple_async_result_complete + fun:complete_in_idle_cb + fun:g_idle_dispatch + fun:g_main_dispatch +} +{ + + Memcheck:Leak + fun:malloc + ... + obj:/lib64/libgcrypt.so.11.7.0 + fun:egg_dh_gen_pair +} +{ + + Memcheck:Leak + ... + fun:parse_value_from_blob + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:g_dbus_message_new + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb + fun:g_simple_async_result_complete + fun:complete_in_idle_cb + fun:g_idle_dispatch +} +{ + + Memcheck:Leak + ... + fun:g_variant_get + fun:g_dbus_message_to_gerror + fun:decode_method_reply + fun:g_dbus_connection_call_done +} +{ + + Memcheck:Leak + ... + fun:g_dbus_message_set_header + fun:g_dbus_message_new_from_blob + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_malloc_n + fun:g_main_context_iterate + fun:g_main_loop_run + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_list_prepend + fun:g_queue_push_head + fun:g_main_context_push_thread_default + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate + fun:g_main_loop_run + fun:g_dbus_connection_send_message_with_reply_sync + fun:g_dbus_connection_call_sync_internal + fun:g_dbus_connection_call_sync + fun:initable_init + fun:g_initable_init + fun:g_bus_get_sync +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate + fun:g_main_loop_run + fun:gdbus_shared_thread_func + fun:g_thread_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_malloc_n + fun:g_main_context_iterate +} +{ + + Memcheck:Leak + fun:malloc + fun:realloc + fun:standard_realloc + fun:g_realloc + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_initial_read +} +{ + + Memcheck:Leak + ... + fun:_g_socket_output_stream_new + fun:g_socket_connection_get_output_stream + fun:g_io_stream_get_output_stream + fun:_g_dbus_auth_run_client +} +{ + _g_dbus_worker_do_initial_read + Memcheck:Leak + ... + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_initial_read +} +{ + + Memcheck:Leak + ... + fun:g_unix_socket_address_new_with_type + fun:g_dbus_address_connect + fun:g_dbus_address_try_connect_one + fun:g_dbus_address_get_stream_sync +} +{ + + Memcheck:Leak + ... + fun:_g_socket_input_stream_new + fun:g_socket_connection_get_input_stream + fun:g_io_stream_get_input_stream + fun:_g_dbus_auth_run_client +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_worker_close + fun:_g_dbus_worker_stop +} +{ + + Memcheck:Leak + ... + fun:g_simple_async_result_complete_in_idle + fun:_g_socket_read_with_control_messages_ready + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:g_source_new + fun:g_idle_source_new + fun:g_simple_async_result_complete_in_idle + fun:g_socket_connection_close_async + fun:g_io_stream_close_async + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:g_simple_async_result_new + fun:g_socket_connection_close_async + fun:g_io_stream_close_async + fun:maybe_write_next_message + fun:write_message_in_idle_cb +} +{ + + Memcheck:Leak + ... + fun:g_socket_connection_factory_create_connection + ... + fun:initable_init +} +{ + + Memcheck:Leak + ... + fun:g_socket_client_connect + fun:g_dbus_address_connect + fun:g_dbus_address_try_connect_one +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_worker_new +} +{ + + Memcheck:Leak + ... + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:g_socket_receive_message + fun:_g_socket_read_with_control_messages_ready + fun:_g_socket_read_with_control_messages + fun:_g_dbus_worker_do_read_unlocked + fun:_g_dbus_worker_do_read_cb +} +{ + + Memcheck:Leak + ... + fun:maybe_write_next_message + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:remove_match_rule + fun:unsubscribe_id_internal +} +{ + + Memcheck:Leak + ... + fun:g_object_new + fun:get_uninitialized_connection + fun:g_bus_get_sync +} +{ + + Memcheck:Leak + ... + fun:g_dbus_connection_signal_subscribe + fun:async_initable_init_first +} +{ + + Memcheck:Leak + ... + fun:g_dbus_connection_send_message_with_reply_unlocked + fun:g_dbus_connection_send_message_with_reply + fun:g_dbus_connection_send_message_with_reply_sync + fun:g_dbus_connection_call_sync_internal + fun:g_dbus_connection_call_sync +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_auth_new +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_auth_run_client +} +{ + + Memcheck:Leak + ... + fun:_g_dbus_auth_init +} +{ + + Memcheck:Leak + ... + fun:g_variant_dup_string + ... + fun:g_variant_get + ... + fun:g_initable_init + fun:g_bus_get_sync +} +{ + + Memcheck:Leak + ... + fun:g_main_context_push_thread_default + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:g_main_context_add_poll_unlocked + ... + fun:g_main_loop_run + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_memdup + fun:g_hash_table_insert_node + fun:handler_insert + fun:g_signal_connect_data +} +{ + + Memcheck:Leak + ... + fun:g_cond_new_posix_impl + fun:g_async_queue_pop_intern_unlocked + fun:g_thread_pool_thread_proxy + fun:g_thread_create_proxy + fun:start_thread + fun:clone +} +{ + + Memcheck:Leak + ... + fun:g_thread_create_full + fun:g_thread_pool_start_thread + fun:g_thread_pool_push +} +{ + thread_memory_from_self + Memcheck:Leak + ... + fun:thread_memory_from_self + ... + fun:g_object_new +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_slice_alloc + fun:g_slice_alloc0 + fun:get_dispatch + fun:g_main_dispatch + fun:g_main_context_dispatch + fun:g_main_context_iterate + fun:g_main_loop_run +} +{ + + Memcheck:Leak + fun:malloc + fun:standard_malloc + fun:g_malloc + fun:g_memdup + fun:g_hash_table_insert_node + fun:g_hash_table_insert_internal + fun:g_hash_table_insert + fun:handler_list_ensure + fun:handler_insert + fun:g_signal_connect_data +} diff -Nru gcr-3.38.1/build-aux/valgrind/memcheck.h gcr-3.40.0/build-aux/valgrind/memcheck.h --- gcr-3.38.1/build-aux/valgrind/memcheck.h 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/valgrind/memcheck.h 2021-03-27 08:40:56.290531400 +0000 @@ -0,0 +1,287 @@ + +/* + ---------------------------------------------------------------- + + Notice that the following BSD-style license applies to this one + file (memcheck.h) only. The rest of Valgrind is licensed under the + terms of the GNU General Public License, version 2, unless + otherwise indicated. See the COPYING file in the source + distribution for details. + + ---------------------------------------------------------------- + + This file is part of MemCheck, a heavyweight Valgrind tool for + detecting memory errors. + + Copyright (C) 2000-2013 Julian Seward. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + ---------------------------------------------------------------- + + Notice that the above BSD-style license applies to this one file + (memcheck.h) only. The entire rest of Valgrind is licensed under + the terms of the GNU General Public License, version 2. See the + COPYING file in the source distribution for details. + + ---------------------------------------------------------------- +*/ + + +#ifndef __MEMCHECK_H +#define __MEMCHECK_H + + +/* This file is for inclusion into client (your!) code. + + You can use these macros to manipulate and query memory permissions + inside your own programs. + + See comment near the top of valgrind.h on how to use them. +*/ + +#include "valgrind.h" + +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! + This enum comprises an ABI exported by Valgrind to programs + which use client requests. DO NOT CHANGE THE ORDER OF THESE + ENTRIES, NOR DELETE ANY -- add new ones at the end. */ +typedef + enum { + VG_USERREQ__MAKE_MEM_NOACCESS = VG_USERREQ_TOOL_BASE('M','C'), + VG_USERREQ__MAKE_MEM_UNDEFINED, + VG_USERREQ__MAKE_MEM_DEFINED, + VG_USERREQ__DISCARD, + VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, + VG_USERREQ__CHECK_MEM_IS_DEFINED, + VG_USERREQ__DO_LEAK_CHECK, + VG_USERREQ__COUNT_LEAKS, + + VG_USERREQ__GET_VBITS, + VG_USERREQ__SET_VBITS, + + VG_USERREQ__CREATE_BLOCK, + + VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, + + /* Not next to VG_USERREQ__COUNT_LEAKS because it was added later. */ + VG_USERREQ__COUNT_LEAK_BLOCKS, + + /* This is just for memcheck's internal use - don't use it */ + _VG_USERREQ__MEMCHECK_RECORD_OVERLAP_ERROR + = VG_USERREQ_TOOL_BASE('M','C') + 256 + } Vg_MemCheckClientRequest; + + + +/* Client-code macros to manipulate the state of memory. */ + +/* Mark memory at _qzz_addr as unaddressable for _qzz_len bytes. */ +#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_NOACCESS, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Similarly, mark memory at _qzz_addr as addressable but undefined + for _qzz_len bytes. */ +#define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_UNDEFINED, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Similarly, mark memory at _qzz_addr as addressable and defined + for _qzz_len bytes. */ +#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_DEFINED, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Similar to VALGRIND_MAKE_MEM_DEFINED except that addressability is + not altered: bytes which are addressable are marked as defined, + but those which are not addressable are left unchanged. */ +#define VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__MAKE_MEM_DEFINED_IF_ADDRESSABLE, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Create a block-description handle. The description is an ascii + string which is included in any messages pertaining to addresses + within the specified memory range. Has no other effect on the + properties of the memory range. */ +#define VALGRIND_CREATE_BLOCK(_qzz_addr,_qzz_len, _qzz_desc) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CREATE_BLOCK, \ + (_qzz_addr), (_qzz_len), (_qzz_desc), \ + 0, 0) + +/* Discard a block-description-handle. Returns 1 for an + invalid handle, 0 for a valid handle. */ +#define VALGRIND_DISCARD(_qzz_blkindex) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__DISCARD, \ + 0, (_qzz_blkindex), 0, 0, 0) + + +/* Client-code macros to check the state of memory. */ + +/* Check that memory at _qzz_addr is addressable for _qzz_len bytes. + If suitable addressibility is not established, Valgrind prints an + error message and returns the address of the first offending byte. + Otherwise it returns zero. */ +#define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__CHECK_MEM_IS_ADDRESSABLE, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Check that memory at _qzz_addr is addressable and defined for + _qzz_len bytes. If suitable addressibility and definedness are not + established, Valgrind prints an error message and returns the + address of the first offending byte. Otherwise it returns zero. */ +#define VALGRIND_CHECK_MEM_IS_DEFINED(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__CHECK_MEM_IS_DEFINED, \ + (_qzz_addr), (_qzz_len), 0, 0, 0) + +/* Use this macro to force the definedness and addressibility of an + lvalue to be checked. If suitable addressibility and definedness + are not established, Valgrind prints an error message and returns + the address of the first offending byte. Otherwise it returns + zero. */ +#define VALGRIND_CHECK_VALUE_IS_DEFINED(__lvalue) \ + VALGRIND_CHECK_MEM_IS_DEFINED( \ + (volatile unsigned char *)&(__lvalue), \ + (unsigned long)(sizeof (__lvalue))) + + +/* Do a full memory leak check (like --leak-check=full) mid-execution. */ +#define VALGRIND_DO_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 0, 0, 0, 0, 0) + +/* Same as VALGRIND_DO_LEAK_CHECK but only showing the entries for + which there was an increase in leaked bytes or leaked nr of blocks + since the previous leak search. */ +#define VALGRIND_DO_ADDED_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 0, 1, 0, 0, 0) + +/* Same as VALGRIND_DO_ADDED_LEAK_CHECK but showing entries with + increased or decreased leaked bytes/blocks since previous leak + search. */ +#define VALGRIND_DO_CHANGED_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 0, 2, 0, 0, 0) + +/* Do a summary memory leak check (like --leak-check=summary) mid-execution. */ +#define VALGRIND_DO_QUICK_LEAK_CHECK \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DO_LEAK_CHECK, \ + 1, 0, 0, 0, 0) + +/* Return number of leaked, dubious, reachable and suppressed bytes found by + all previous leak checks. They must be lvalues. */ +#define VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed) \ + /* For safety on 64-bit platforms we assign the results to private + unsigned long variables, then assign these to the lvalues the user + specified, which works no matter what type 'leaked', 'dubious', etc + are. We also initialise '_qzz_leaked', etc because + VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as + defined. */ \ + { \ + unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \ + unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \ + VALGRIND_DO_CLIENT_REQUEST_STMT( \ + VG_USERREQ__COUNT_LEAKS, \ + &_qzz_leaked, &_qzz_dubious, \ + &_qzz_reachable, &_qzz_suppressed, 0); \ + leaked = _qzz_leaked; \ + dubious = _qzz_dubious; \ + reachable = _qzz_reachable; \ + suppressed = _qzz_suppressed; \ + } + +/* Return number of leaked, dubious, reachable and suppressed bytes found by + all previous leak checks. They must be lvalues. */ +#define VALGRIND_COUNT_LEAK_BLOCKS(leaked, dubious, reachable, suppressed) \ + /* For safety on 64-bit platforms we assign the results to private + unsigned long variables, then assign these to the lvalues the user + specified, which works no matter what type 'leaked', 'dubious', etc + are. We also initialise '_qzz_leaked', etc because + VG_USERREQ__COUNT_LEAKS doesn't mark the values returned as + defined. */ \ + { \ + unsigned long _qzz_leaked = 0, _qzz_dubious = 0; \ + unsigned long _qzz_reachable = 0, _qzz_suppressed = 0; \ + VALGRIND_DO_CLIENT_REQUEST_STMT( \ + VG_USERREQ__COUNT_LEAK_BLOCKS, \ + &_qzz_leaked, &_qzz_dubious, \ + &_qzz_reachable, &_qzz_suppressed, 0); \ + leaked = _qzz_leaked; \ + dubious = _qzz_dubious; \ + reachable = _qzz_reachable; \ + suppressed = _qzz_suppressed; \ + } + + +/* Get the validity data for addresses [zza..zza+zznbytes-1] and copy it + into the provided zzvbits array. Return values: + 0 if not running on valgrind + 1 success + 2 [previously indicated unaligned arrays; these are now allowed] + 3 if any parts of zzsrc/zzvbits are not addressable. + The metadata is not copied in cases 0, 2 or 3 so it should be + impossible to segfault your system by using this call. +*/ +#define VALGRIND_GET_VBITS(zza,zzvbits,zznbytes) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__GET_VBITS, \ + (const char*)(zza), \ + (char*)(zzvbits), \ + (zznbytes), 0, 0) + +/* Set the validity data for addresses [zza..zza+zznbytes-1], copying it + from the provided zzvbits array. Return values: + 0 if not running on valgrind + 1 success + 2 [previously indicated unaligned arrays; these are now allowed] + 3 if any parts of zza/zzvbits are not addressable. + The metadata is not copied in cases 0, 2 or 3 so it should be + impossible to segfault your system by using this call. +*/ +#define VALGRIND_SET_VBITS(zza,zzvbits,zznbytes) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__SET_VBITS, \ + (const char*)(zza), \ + (const char*)(zzvbits), \ + (zznbytes), 0, 0 ) + +#endif + diff -Nru gcr-3.38.1/build-aux/valgrind/valgrind.h gcr-3.40.0/build-aux/valgrind/valgrind.h --- gcr-3.38.1/build-aux/valgrind/valgrind.h 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/build-aux/valgrind/valgrind.h 2021-03-27 08:40:56.292531500 +0000 @@ -0,0 +1,5413 @@ +/* -*- c -*- + ---------------------------------------------------------------- + + Notice that the following BSD-style license applies to this one + file (valgrind.h) only. The rest of Valgrind is licensed under the + terms of the GNU General Public License, version 2, unless + otherwise indicated. See the COPYING file in the source + distribution for details. + + ---------------------------------------------------------------- + + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2013 Julian Seward. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + + ---------------------------------------------------------------- + + Notice that the above BSD-style license applies to this one file + (valgrind.h) only. The entire rest of Valgrind is licensed under + the terms of the GNU General Public License, version 2. See the + COPYING file in the source distribution for details. + + ---------------------------------------------------------------- +*/ + + +/* This file is for inclusion into client (your!) code. + + You can use these macros to manipulate and query Valgrind's + execution inside your own programs. + + The resulting executables will still run without Valgrind, just a + little bit more slowly than they otherwise would, but otherwise + unchanged. When not running on valgrind, each client request + consumes very few (eg. 7) instructions, so the resulting performance + loss is negligible unless you plan to execute client requests + millions of times per second. Nevertheless, if that is still a + problem, you can compile with the NVALGRIND symbol defined (gcc + -DNVALGRIND) so that client requests are not even compiled in. */ + +#ifndef __VALGRIND_H +#define __VALGRIND_H + + +/* ------------------------------------------------------------------ */ +/* VERSION NUMBER OF VALGRIND */ +/* ------------------------------------------------------------------ */ + +/* Specify Valgrind's version number, so that user code can + conditionally compile based on our version number. Note that these + were introduced at version 3.6 and so do not exist in version 3.5 + or earlier. The recommended way to use them to check for "version + X.Y or later" is (eg) + +#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \ + && (__VALGRIND_MAJOR__ > 3 \ + || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) +*/ +#define __VALGRIND_MAJOR__ 3 +#define __VALGRIND_MINOR__ 8 + + +#include + +/* Nb: this file might be included in a file compiled with -ansi. So + we can't use C++ style "//" comments nor the "asm" keyword (instead + use "__asm__"). */ + +/* Derive some tags indicating what the target platform is. Note + that in this file we're using the compiler's CPP symbols for + identifying architectures, which are different to the ones we use + within the rest of Valgrind. Note, __powerpc__ is active for both + 32 and 64-bit PPC, whereas __powerpc64__ is only active for the + latter (on Linux, that is). + + Misc note: how to find out what's predefined in gcc by default: + gcc -Wp,-dM somefile.c +*/ +#undef PLAT_x86_darwin +#undef PLAT_amd64_darwin +#undef PLAT_x86_win32 +#undef PLAT_amd64_win64 +#undef PLAT_x86_linux +#undef PLAT_amd64_linux +#undef PLAT_ppc32_linux +#undef PLAT_ppc64_linux +#undef PLAT_arm_linux +#undef PLAT_s390x_linux +#undef PLAT_mips32_linux +#undef PLAT_mips64_linux + + +#if defined(__APPLE__) && defined(__i386__) +# define PLAT_x86_darwin 1 +#elif defined(__APPLE__) && defined(__x86_64__) +# define PLAT_amd64_darwin 1 +#elif defined(__MINGW32__) || defined(__CYGWIN32__) \ + || (defined(_WIN32) && defined(_M_IX86)) +# define PLAT_x86_win32 1 +#elif defined(__MINGW64__) || (defined(_WIN64) && defined(_M_X64)) +# define PLAT_amd64_win64 1 +#elif defined(__linux__) && defined(__i386__) +# define PLAT_x86_linux 1 +#elif defined(__linux__) && defined(__x86_64__) +# define PLAT_amd64_linux 1 +#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) +# define PLAT_ppc32_linux 1 +#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) +# define PLAT_ppc64_linux 1 +#elif defined(__linux__) && defined(__arm__) +# define PLAT_arm_linux 1 +#elif defined(__linux__) && defined(__s390__) && defined(__s390x__) +# define PLAT_s390x_linux 1 +#elif defined(__linux__) && defined(__mips__) +#if (__mips==64) +# define PLAT_mips64_linux 1 +#else +# define PLAT_mips32_linux 1 +#endif +#else +/* If we're not compiling for our target platform, don't generate + any inline asms. */ +# if !defined(NVALGRIND) +# define NVALGRIND 1 +# endif +#endif + + +/* ------------------------------------------------------------------ */ +/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */ +/* in here of use to end-users -- skip to the next section. */ +/* ------------------------------------------------------------------ */ + +/* + * VALGRIND_DO_CLIENT_REQUEST(): a statement that invokes a Valgrind client + * request. Accepts both pointers and integers as arguments. + * + * VALGRIND_DO_CLIENT_REQUEST_STMT(): a statement that invokes a Valgrind + * client request that does not return a value. + + * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind + * client request and whose value equals the client request result. Accepts + * both pointers and integers as arguments. Note that such calls are not + * necessarily pure functions -- they may have side effects. + */ + +#define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \ + _zzq_request, _zzq_arg1, _zzq_arg2, \ + _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \ + (_zzq_request), (_zzq_arg1), (_zzq_arg2), \ + (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0) + +#define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \ + _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + (_zzq_request), (_zzq_arg1), (_zzq_arg2), \ + (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0) + +#if defined(NVALGRIND) + +/* Define NVALGRIND to completely remove the Valgrind magic sequence + from the compiled code (analogous to NDEBUG's effects on + assert()) */ +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + (_zzq_default) + +#else /* ! NVALGRIND */ + +/* The following defines the magic code sequences which the JITter + spots and handles magically. Don't look too closely at them as + they will rot your brain. + + The assembly code sequences for all architectures is in this one + file. This is because this file must be stand-alone, and we don't + want to have multiple files. + + For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default + value gets put in the return slot, so that everything works when + this is executed not under Valgrind. Args are passed in a memory + block, and so there's no intrinsic limit to the number that could + be passed, but it's currently five. + + The macro args are: + _zzq_rlval result lvalue + _zzq_default default value (result returned when running on real CPU) + _zzq_request request code + _zzq_arg1..5 request params + + The other two macros are used to support function wrapping, and are + a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the + guest's NRADDR pseudo-register and whatever other information is + needed to safely run the call original from the wrapper: on + ppc64-linux, the R2 value at the divert point is also needed. This + information is abstracted into a user-visible type, OrigFn. + + VALGRIND_CALL_NOREDIR_* behaves the same as the following on the + guest, but guarantees that the branch instruction will not be + redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: + branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a + complete inline asm, since it needs to be combined with more magic + inline asm stuff to be useful. +*/ + +/* ------------------------- x86-{linux,darwin} ---------------- */ + +#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ + || (defined(PLAT_x86_win32) && defined(__GNUC__)) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "roll $3, %%edi ; roll $13, %%edi\n\t" \ + "roll $29, %%edi ; roll $19, %%edi\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({volatile unsigned int _zzq_args[6]; \ + volatile unsigned int _zzq_result; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %EDX = client_request ( %EAX ) */ \ + "xchgl %%ebx,%%ebx" \ + : "=d" (_zzq_result) \ + : "a" (&_zzq_args[0]), "0" (_zzq_default) \ + : "cc", "memory" \ + ); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %EAX = guest_NRADDR */ \ + "xchgl %%ecx,%%ecx" \ + : "=a" (__addr) \ + : \ + : "cc", "memory" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_EAX \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir *%EAX */ \ + "xchgl %%edx,%%edx\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "xchgl %%edi,%%edi\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */ + +/* ------------------------- x86-Win32 ------------------------- */ + +#if defined(PLAT_x86_win32) && !defined(__GNUC__) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#if defined(_MSC_VER) + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + __asm rol edi, 3 __asm rol edi, 13 \ + __asm rol edi, 29 __asm rol edi, 19 + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \ + (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \ + (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \ + (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5)) + +static __inline uintptr_t +valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request, + uintptr_t _zzq_arg1, uintptr_t _zzq_arg2, + uintptr_t _zzq_arg3, uintptr_t _zzq_arg4, + uintptr_t _zzq_arg5) +{ + volatile uintptr_t _zzq_args[6]; + volatile unsigned int _zzq_result; + _zzq_args[0] = (uintptr_t)(_zzq_request); + _zzq_args[1] = (uintptr_t)(_zzq_arg1); + _zzq_args[2] = (uintptr_t)(_zzq_arg2); + _zzq_args[3] = (uintptr_t)(_zzq_arg3); + _zzq_args[4] = (uintptr_t)(_zzq_arg4); + _zzq_args[5] = (uintptr_t)(_zzq_arg5); + __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default + __SPECIAL_INSTRUCTION_PREAMBLE + /* %EDX = client_request ( %EAX ) */ + __asm xchg ebx,ebx + __asm mov _zzq_result, edx + } + return _zzq_result; +} + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ + __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %EAX = guest_NRADDR */ \ + __asm xchg ecx,ecx \ + __asm mov __addr, eax \ + } \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_EAX ERROR + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ + __asm xchg edi,edi \ + } \ + } while (0) + +#else +#error Unsupported compiler. +#endif + +#endif /* PLAT_x86_win32 */ + +/* ------------------------ amd64-{linux,darwin} --------------- */ + +#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ + "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %RDX = client_request ( %RAX ) */ \ + "xchgq %%rbx,%%rbx" \ + : "=d" (_zzq_result) \ + : "a" (&_zzq_args[0]), "0" (_zzq_default) \ + : "cc", "memory" \ + ); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %RAX = guest_NRADDR */ \ + "xchgq %%rcx,%%rcx" \ + : "=a" (__addr) \ + : \ + : "cc", "memory" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_RAX \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir *%RAX */ \ + "xchgq %%rdx,%%rdx\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "xchgq %%rdi,%%rdi\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ + +/* ------------------------ ppc32-linux ------------------------ */ + +#if defined(PLAT_ppc32_linux) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ + "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({ unsigned int _zzq_args[6]; \ + unsigned int _zzq_result; \ + unsigned int* _zzq_ptr; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + _zzq_ptr = _zzq_args; \ + __asm__ volatile("mr 3,%1\n\t" /*default*/ \ + "mr 4,%2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = client_request ( %R4 ) */ \ + "or 1,1,1\n\t" \ + "mr %0,3" /*result*/ \ + : "=b" (_zzq_result) \ + : "b" (_zzq_default), "b" (_zzq_ptr) \ + : "cc", "memory", "r3", "r4", "r0"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR */ \ + "or 2,2,2\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3", "r0" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R11 */ \ + "or 3,3,3\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or 5,5,5\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_ppc32_linux */ + +/* ------------------------ ppc64-linux ------------------------ */ + +#if defined(PLAT_ppc64_linux) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + unsigned long long int r2; /* what tocptr do we need? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ + "rotldi 0,0,61 ; rotldi 0,0,51\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({ unsigned long long int _zzq_args[6]; \ + unsigned long long int _zzq_result; \ + unsigned long long int* _zzq_ptr; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + _zzq_ptr = _zzq_args; \ + __asm__ volatile("mr 3,%1\n\t" /*default*/ \ + "mr 4,%2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = client_request ( %R4 ) */ \ + "or 1,1,1\n\t" \ + "mr %0,3" /*result*/ \ + : "=b" (_zzq_result) \ + : "b" (_zzq_default), "b" (_zzq_ptr) \ + : "cc", "memory", "r3", "r4", "r0"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR */ \ + "or 2,2,2\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3", "r0" \ + ); \ + _zzq_orig->nraddr = __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %R3 = guest_NRADDR_GPR2 */ \ + "or 4,4,4\n\t" \ + "mr %0,3" \ + : "=b" (__addr) \ + : \ + : "cc", "memory", "r3", "r0" \ + ); \ + _zzq_orig->r2 = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R11 */ \ + "or 3,3,3\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or 5,5,5\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_ppc64_linux */ + +/* ------------------------- arm-linux ------------------------- */ + +#if defined(PLAT_arm_linux) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \ + "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + \ + __extension__ \ + ({volatile unsigned int _zzq_args[6]; \ + volatile unsigned int _zzq_result; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + __asm__ volatile("mov r3, %1\n\t" /*default*/ \ + "mov r4, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* R3 = client_request ( R4 ) */ \ + "orr r10, r10, r10\n\t" \ + "mov %0, r3" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "cc","memory", "r3", "r4"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* R3 = guest_NRADDR */ \ + "orr r11, r11, r11\n\t" \ + "mov %0, r3" \ + : "=r" (__addr) \ + : \ + : "cc", "memory", "r3" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* branch-and-link-to-noredir *%R4 */ \ + "orr r12, r12, r12\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "orr r9, r9, r9\n\t" \ + : : : "cc", "memory" \ + ); \ + } while (0) + +#endif /* PLAT_arm_linux */ + +/* ------------------------ s390x-linux ------------------------ */ + +#if defined(PLAT_s390x_linux) + +typedef + struct { + unsigned long long int nraddr; /* where's the code? */ + } + OrigFn; + +/* __SPECIAL_INSTRUCTION_PREAMBLE will be used to identify Valgrind specific + * code. This detection is implemented in platform specific toIR.c + * (e.g. VEX/priv/guest_s390_decoder.c). + */ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "lr 15,15\n\t" \ + "lr 1,1\n\t" \ + "lr 2,2\n\t" \ + "lr 3,3\n\t" + +#define __CLIENT_REQUEST_CODE "lr 2,2\n\t" +#define __GET_NR_CONTEXT_CODE "lr 3,3\n\t" +#define __CALL_NO_REDIR_CODE "lr 4,4\n\t" +#define __VEX_INJECT_IR_CODE "lr 5,5\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile(/* r2 = args */ \ + "lgr 2,%1\n\t" \ + /* r3 = default */ \ + "lgr 3,%2\n\t" \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + __CLIENT_REQUEST_CODE \ + /* results = r3 */ \ + "lgr %0, 3\n\t" \ + : "=d" (_zzq_result) \ + : "a" (&_zzq_args[0]), "0" (_zzq_default) \ + : "cc", "2", "3", "memory" \ + ); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + __GET_NR_CONTEXT_CODE \ + "lgr %0, 3\n\t" \ + : "=a" (__addr) \ + : \ + : "cc", "3", "memory" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_R1 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + __CALL_NO_REDIR_CODE + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + __VEX_INJECT_IR_CODE); \ + } while (0) + +#endif /* PLAT_s390x_linux */ + +/* ------------------------- mips32-linux ---------------- */ + +#if defined(PLAT_mips32_linux) + +typedef + struct { + unsigned int nraddr; /* where's the code? */ + } + OrigFn; + +/* .word 0x342 + * .word 0x742 + * .word 0xC2 + * .word 0x4C2*/ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "srl $0, $0, 13\n\t" \ + "srl $0, $0, 29\n\t" \ + "srl $0, $0, 3\n\t" \ + "srl $0, $0, 19\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned int _zzq_args[6]; \ + volatile unsigned int _zzq_result; \ + _zzq_args[0] = (unsigned int)(_zzq_request); \ + _zzq_args[1] = (unsigned int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned int)(_zzq_arg5); \ + __asm__ volatile("move $11, %1\n\t" /*default*/ \ + "move $12, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* T3 = client_request ( T4 ) */ \ + "or $13, $13, $13\n\t" \ + "move %0, $11\n\t" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "$11", "$12"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* %t9 = guest_NRADDR */ \ + "or $14, $14, $14\n\t" \ + "move %0, $11" /*result*/ \ + : "=r" (__addr) \ + : \ + : "$11" \ + ); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_T9 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir *%t9 */ \ + "or $15, $15, $15\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or $11, $11, $11\n\t" \ + ); \ + } while (0) + + +#endif /* PLAT_mips32_linux */ + +/* ------------------------- mips64-linux ---------------- */ + +#if defined(PLAT_mips64_linux) + +typedef + struct { + unsigned long long nraddr; /* where's the code? */ + } + OrigFn; + +/* dsll $0,$0, 3 + * dsll $0,$0, 13 + * dsll $0,$0, 29 + * dsll $0,$0, 19*/ +#define __SPECIAL_INSTRUCTION_PREAMBLE \ + "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \ + "dsll $0,$0,29 ; dsll $0,$0,19\n\t" + +#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + _zzq_default, _zzq_request, \ + _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ + __extension__ \ + ({ volatile unsigned long long int _zzq_args[6]; \ + volatile unsigned long long int _zzq_result; \ + _zzq_args[0] = (unsigned long long int)(_zzq_request); \ + _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ + _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ + _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ + _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ + _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ + __asm__ volatile("move $11, %1\n\t" /*default*/ \ + "move $12, %2\n\t" /*ptr*/ \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* $11 = client_request ( $12 ) */ \ + "or $13, $13, $13\n\t" \ + "move %0, $11\n\t" /*result*/ \ + : "=r" (_zzq_result) \ + : "r" (_zzq_default), "r" (&_zzq_args[0]) \ + : "$11", "$12"); \ + _zzq_result; \ + }) + +#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ + { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ + volatile unsigned long long int __addr; \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + /* $11 = guest_NRADDR */ \ + "or $14, $14, $14\n\t" \ + "move %0, $11" /*result*/ \ + : "=r" (__addr) \ + : \ + : "$11"); \ + _zzq_orig->nraddr = __addr; \ + } + +#define VALGRIND_CALL_NOREDIR_T9 \ + __SPECIAL_INSTRUCTION_PREAMBLE \ + /* call-noredir $25 */ \ + "or $15, $15, $15\n\t" + +#define VALGRIND_VEX_INJECT_IR() \ + do { \ + __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ + "or $11, $11, $11\n\t" \ + ); \ + } while (0) + +#endif /* PLAT_mips64_linux */ + +/* Insert assembly code for other platforms here... */ + +#endif /* NVALGRIND */ + + +/* ------------------------------------------------------------------ */ +/* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */ +/* ugly. It's the least-worst tradeoff I can think of. */ +/* ------------------------------------------------------------------ */ + +/* This section defines magic (a.k.a appalling-hack) macros for doing + guaranteed-no-redirection macros, so as to get from function + wrappers to the functions they are wrapping. The whole point is to + construct standard call sequences, but to do the call itself with a + special no-redirect call pseudo-instruction that the JIT + understands and handles specially. This section is long and + repetitious, and I can't see a way to make it shorter. + + The naming scheme is as follows: + + CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc} + + 'W' stands for "word" and 'v' for "void". Hence there are + different macros for calling arity 0, 1, 2, 3, 4, etc, functions, + and for each, the possibility of returning a word-typed result, or + no result. +*/ + +/* Use these to write the name of your wrapper. NOTE: duplicates + VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. NOTE also: inserts + the default behaviour equivalance class tag "0000" into the name. + See pub_tool_redir.h for details -- normally you don't need to + think about this, though. */ + +/* Use an extra level of macroisation so as to ensure the soname/fnname + args are fully macro-expanded before pasting them together. */ +#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd + +#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ + VG_CONCAT4(_vgw00000ZU_,soname,_,fnname) + +#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ + VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname) + +/* Use this macro from within a wrapper function to collect the + context (address and possibly other info) of the original function. + Once you have that you can then use it in one of the CALL_FN_ + macros. The type of the argument _lval is OrigFn. */ +#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) + +/* Also provide end-user facilities for function replacement, rather + than wrapping. A replacement function differs from a wrapper in + that it has no way to get hold of the original function being + called, and hence no way to call onwards to it. In a replacement + function, VALGRIND_GET_ORIG_FN always returns zero. */ + +#define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \ + VG_CONCAT4(_vgr00000ZU_,soname,_,fnname) + +#define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \ + VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname) + +/* Derivatives of the main macros below, for calling functions + returning void. */ + +#define CALL_FN_v_v(fnptr) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_v(_junk,fnptr); } while (0) + +#define CALL_FN_v_W(fnptr, arg1) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_W(_junk,fnptr,arg1); } while (0) + +#define CALL_FN_v_WW(fnptr, arg1,arg2) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) + +#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) + +#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0) + +#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0) + +#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0) + +#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \ + do { volatile unsigned long _junk; \ + CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0) + +/* ------------------------- x86-{linux,darwin} ---------------- */ + +#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) + +/* These regs are trashed by the hidden call. No need to mention eax + as gcc can already see that, plus causes gcc to bomb. */ +#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "movl %%esp,%%edi\n\t" \ + "andl $0xfffffff0,%%esp\n\t" +#define VALGRIND_RESTORE_STACK \ + "movl %%edi,%%esp\n\t" + +/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $12, %%esp\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $8, %%esp\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $4, %%esp\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $12, %%esp\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $8, %%esp\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $4, %%esp\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $12, %%esp\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $8, %%esp\n\t" \ + "pushl 40(%%eax)\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "subl $4, %%esp\n\t" \ + "pushl 44(%%eax)\n\t" \ + "pushl 40(%%eax)\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "pushl 48(%%eax)\n\t" \ + "pushl 44(%%eax)\n\t" \ + "pushl 40(%%eax)\n\t" \ + "pushl 36(%%eax)\n\t" \ + "pushl 32(%%eax)\n\t" \ + "pushl 28(%%eax)\n\t" \ + "pushl 24(%%eax)\n\t" \ + "pushl 20(%%eax)\n\t" \ + "pushl 16(%%eax)\n\t" \ + "pushl 12(%%eax)\n\t" \ + "pushl 8(%%eax)\n\t" \ + "pushl 4(%%eax)\n\t" \ + "movl (%%eax), %%eax\n\t" /* target->%eax */ \ + VALGRIND_CALL_NOREDIR_EAX \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "edi" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_x86_linux || PLAT_x86_darwin */ + +/* ------------------------ amd64-{linux,darwin} --------------- */ + +#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) + +/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \ + "rdi", "r8", "r9", "r10", "r11" + +/* This is all pretty complex. It's so as to make stack unwinding + work reliably. See bug 243270. The basic problem is the sub and + add of 128 of %rsp in all of the following macros. If gcc believes + the CFA is in %rsp, then unwinding may fail, because what's at the + CFA is not what gcc "expected" when it constructs the CFIs for the + places where the macros are instantiated. + + But we can't just add a CFI annotation to increase the CFA offset + by 128, to match the sub of 128 from %rsp, because we don't know + whether gcc has chosen %rsp as the CFA at that point, or whether it + has chosen some other register (eg, %rbp). In the latter case, + adding a CFI annotation to change the CFA offset is simply wrong. + + So the solution is to get hold of the CFA using + __builtin_dwarf_cfa(), put it in a known register, and add a + CFI annotation to say what the register is. We choose %rbp for + this (perhaps perversely), because: + + (1) %rbp is already subject to unwinding. If a new register was + chosen then the unwinder would have to unwind it in all stack + traces, which is expensive, and + + (2) %rbp is already subject to precise exception updates in the + JIT. If a new register was chosen, we'd have to have precise + exceptions for it too, which reduces performance of the + generated code. + + However .. one extra complication. We can't just whack the result + of __builtin_dwarf_cfa() into %rbp and then add %rbp to the + list of trashed registers at the end of the inline assembly + fragments; gcc won't allow %rbp to appear in that list. Hence + instead we need to stash %rbp in %r15 for the duration of the asm, + and say that %r15 is trashed instead. gcc seems happy to go with + that. + + Oh .. and this all needs to be conditionalised so that it is + unchanged from before this commit, when compiled with older gccs + that don't support __builtin_dwarf_cfa. Furthermore, since + this header file is freestanding, it has to be independent of + config.h, and so the following conditionalisation cannot depend on + configure time checks. + + Although it's not clear from + 'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)', + this expression excludes Darwin. + .cfi directives in Darwin assembly appear to be completely + different and I haven't investigated how they work. + + For even more entertainment value, note we have to use the + completely undocumented __builtin_dwarf_cfa(), which appears to + really compute the CFA, whereas __builtin_frame_address(0) claims + to but actually doesn't. See + https://bugs.kde.org/show_bug.cgi?id=243270#c47 +*/ +#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) +# define __FRAME_POINTER \ + ,"r"(__builtin_dwarf_cfa()) +# define VALGRIND_CFI_PROLOGUE \ + "movq %%rbp, %%r15\n\t" \ + "movq %2, %%rbp\n\t" \ + ".cfi_remember_state\n\t" \ + ".cfi_def_cfa rbp, 0\n\t" +# define VALGRIND_CFI_EPILOGUE \ + "movq %%r15, %%rbp\n\t" \ + ".cfi_restore_state\n\t" +#else +# define __FRAME_POINTER +# define VALGRIND_CFI_PROLOGUE +# define VALGRIND_CFI_EPILOGUE +#endif + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "movq %%rsp,%%r14\n\t" \ + "andq $0xfffffffffffffff0,%%rsp\n\t" +#define VALGRIND_RESTORE_STACK \ + "movq %%r14,%%rsp\n\t" + +/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned + long) == 8. */ + +/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_ + macros. In order not to trash the stack redzone, we need to drop + %rsp by 128 before the hidden call, and restore afterwards. The + nastyness is that it is only by luck that the stack still appears + to be unwindable during the hidden call - since then the behaviour + of any routine using this macro does not match what the CFI data + says. Sigh. + + Why is this important? Imagine that a wrapper has a stack + allocated local, and passes to the hidden call, a pointer to it. + Because gcc does not know about the hidden call, it may allocate + that local in the redzone. Unfortunately the hidden call may then + trash it before it comes to use it. So we must step clear of the + redzone, for the duration of the hidden call, to make it safe. + + Probably the same problem afflicts the other redzone-style ABIs too + (ppc64-linux); but for those, the stack is + self describing (none of this CFI nonsense) so at least messing + with the stack pointer doesn't give a danger of non-unwindable + stack. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $136,%%rsp\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $136,%%rsp\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "pushq 80(%%rax)\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $136,%%rsp\n\t" \ + "pushq 88(%%rax)\n\t" \ + "pushq 80(%%rax)\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + VALGRIND_ALIGN_STACK \ + "subq $128,%%rsp\n\t" \ + "pushq 96(%%rax)\n\t" \ + "pushq 88(%%rax)\n\t" \ + "pushq 80(%%rax)\n\t" \ + "pushq 72(%%rax)\n\t" \ + "pushq 64(%%rax)\n\t" \ + "pushq 56(%%rax)\n\t" \ + "movq 48(%%rax), %%r9\n\t" \ + "movq 40(%%rax), %%r8\n\t" \ + "movq 32(%%rax), %%rcx\n\t" \ + "movq 24(%%rax), %%rdx\n\t" \ + "movq 16(%%rax), %%rsi\n\t" \ + "movq 8(%%rax), %%rdi\n\t" \ + "movq (%%rax), %%rax\n\t" /* target->%rax */ \ + VALGRIND_CALL_NOREDIR_RAX \ + VALGRIND_RESTORE_STACK \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=a" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ + +/* ------------------------ ppc32-linux ------------------------ */ + +#if defined(PLAT_ppc32_linux) + +/* This is useful for finding out about the on-stack stuff: + + extern int f9 ( int,int,int,int,int,int,int,int,int ); + extern int f10 ( int,int,int,int,int,int,int,int,int,int ); + extern int f11 ( int,int,int,int,int,int,int,int,int,int,int ); + extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int ); + + int g9 ( void ) { + return f9(11,22,33,44,55,66,77,88,99); + } + int g10 ( void ) { + return f10(11,22,33,44,55,66,77,88,99,110); + } + int g11 ( void ) { + return f11(11,22,33,44,55,66,77,88,99,110,121); + } + int g12 ( void ) { + return f12(11,22,33,44,55,66,77,88,99,110,121,132); + } +*/ + +/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "lr", "ctr", "xer", \ + "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ + "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r11", "r12", "r13" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "mr 28,1\n\t" \ + "rlwinm 1,1,0,0,27\n\t" +#define VALGRIND_RESTORE_STACK \ + "mr 1,28\n\t" + +/* These CALL_FN_ macros assume that on ppc32-linux, + sizeof(unsigned long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-16\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-16\n\t" \ + /* arg10 */ \ + "lwz 3,40(11)\n\t" \ + "stw 3,12(1)\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-32\n\t" \ + /* arg11 */ \ + "lwz 3,44(11)\n\t" \ + "stw 3,16(1)\n\t" \ + /* arg10 */ \ + "lwz 3,40(11)\n\t" \ + "stw 3,12(1)\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + _argvec[12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "addi 1,1,-32\n\t" \ + /* arg12 */ \ + "lwz 3,48(11)\n\t" \ + "stw 3,20(1)\n\t" \ + /* arg11 */ \ + "lwz 3,44(11)\n\t" \ + "stw 3,16(1)\n\t" \ + /* arg10 */ \ + "lwz 3,40(11)\n\t" \ + "stw 3,12(1)\n\t" \ + /* arg9 */ \ + "lwz 3,36(11)\n\t" \ + "stw 3,8(1)\n\t" \ + /* args1-8 */ \ + "lwz 3,4(11)\n\t" /* arg1->r3 */ \ + "lwz 4,8(11)\n\t" \ + "lwz 5,12(11)\n\t" \ + "lwz 6,16(11)\n\t" /* arg4->r6 */ \ + "lwz 7,20(11)\n\t" \ + "lwz 8,24(11)\n\t" \ + "lwz 9,28(11)\n\t" \ + "lwz 10,32(11)\n\t" /* arg8->r10 */ \ + "lwz 11,0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + VALGRIND_RESTORE_STACK \ + "mr %0,3" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_ppc32_linux */ + +/* ------------------------ ppc64-linux ------------------------ */ + +#if defined(PLAT_ppc64_linux) + +/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS \ + "lr", "ctr", "xer", \ + "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ + "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r11", "r12", "r13" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +#define VALGRIND_ALIGN_STACK \ + "mr 28,1\n\t" \ + "rldicr 1,1,0,59\n\t" +#define VALGRIND_RESTORE_STACK \ + "mr 1,28\n\t" + +/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned + long) == 8. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+0]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+1]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+2]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+3]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+4]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+5]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+6]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+7]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+8]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+9]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-128\n\t" /* expand stack frame */ \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+10]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-128\n\t" /* expand stack frame */ \ + /* arg10 */ \ + "ld 3,80(11)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+11]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + _argvec[2+11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-144\n\t" /* expand stack frame */ \ + /* arg11 */ \ + "ld 3,88(11)\n\t" \ + "std 3,128(1)\n\t" \ + /* arg10 */ \ + "ld 3,80(11)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10,arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3+12]; \ + volatile unsigned long _res; \ + /* _argvec[0] holds current r2 across the call */ \ + _argvec[1] = (unsigned long)_orig.r2; \ + _argvec[2] = (unsigned long)_orig.nraddr; \ + _argvec[2+1] = (unsigned long)arg1; \ + _argvec[2+2] = (unsigned long)arg2; \ + _argvec[2+3] = (unsigned long)arg3; \ + _argvec[2+4] = (unsigned long)arg4; \ + _argvec[2+5] = (unsigned long)arg5; \ + _argvec[2+6] = (unsigned long)arg6; \ + _argvec[2+7] = (unsigned long)arg7; \ + _argvec[2+8] = (unsigned long)arg8; \ + _argvec[2+9] = (unsigned long)arg9; \ + _argvec[2+10] = (unsigned long)arg10; \ + _argvec[2+11] = (unsigned long)arg11; \ + _argvec[2+12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "mr 11,%1\n\t" \ + "std 2,-16(11)\n\t" /* save tocptr */ \ + "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ + "addi 1,1,-144\n\t" /* expand stack frame */ \ + /* arg12 */ \ + "ld 3,96(11)\n\t" \ + "std 3,136(1)\n\t" \ + /* arg11 */ \ + "ld 3,88(11)\n\t" \ + "std 3,128(1)\n\t" \ + /* arg10 */ \ + "ld 3,80(11)\n\t" \ + "std 3,120(1)\n\t" \ + /* arg9 */ \ + "ld 3,72(11)\n\t" \ + "std 3,112(1)\n\t" \ + /* args1-8 */ \ + "ld 3, 8(11)\n\t" /* arg1->r3 */ \ + "ld 4, 16(11)\n\t" /* arg2->r4 */ \ + "ld 5, 24(11)\n\t" /* arg3->r5 */ \ + "ld 6, 32(11)\n\t" /* arg4->r6 */ \ + "ld 7, 40(11)\n\t" /* arg5->r7 */ \ + "ld 8, 48(11)\n\t" /* arg6->r8 */ \ + "ld 9, 56(11)\n\t" /* arg7->r9 */ \ + "ld 10, 64(11)\n\t" /* arg8->r10 */ \ + "ld 11, 0(11)\n\t" /* target->r11 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ + "mr 11,%1\n\t" \ + "mr %0,3\n\t" \ + "ld 2,-16(11)\n\t" /* restore tocptr */ \ + VALGRIND_RESTORE_STACK \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[2]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r28" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_ppc64_linux */ + +/* ------------------------- arm-linux ------------------------- */ + +#if defined(PLAT_arm_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14" + +/* Macros to save and align the stack before making a function + call and restore it afterwards as gcc may not keep the stack + pointer aligned if it doesn't realise calls are being made + to other functions. */ + +/* This is a bit tricky. We store the original stack pointer in r10 + as it is callee-saves. gcc doesn't allow the use of r11 for some + reason. Also, we can't directly "bic" the stack pointer in thumb + mode since r13 isn't an allowed register number in that context. + So use r4 as a temporary, since that is about to get trashed + anyway, just after each use of this macro. Side effect is we need + to be very careful about any future changes, since + VALGRIND_ALIGN_STACK simply assumes r4 is usable. */ +#define VALGRIND_ALIGN_STACK \ + "mov r10, sp\n\t" \ + "mov r4, sp\n\t" \ + "bic r4, r4, #7\n\t" \ + "mov sp, r4\n\t" +#define VALGRIND_RESTORE_STACK \ + "mov sp, r10\n\t" + +/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "push {r0} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "push {r0, r1} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "push {r0, r1, r2} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "push {r0, r1, r2, r3} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #40] \n\t" \ + "push {r0} \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "sub sp, sp, #4 \n\t" \ + "ldr r0, [%1, #40] \n\t" \ + "ldr r1, [%1, #44] \n\t" \ + "push {r0, r1} \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + VALGRIND_ALIGN_STACK \ + "ldr r0, [%1, #40] \n\t" \ + "ldr r1, [%1, #44] \n\t" \ + "ldr r2, [%1, #48] \n\t" \ + "push {r0, r1, r2} \n\t" \ + "ldr r0, [%1, #20] \n\t" \ + "ldr r1, [%1, #24] \n\t" \ + "ldr r2, [%1, #28] \n\t" \ + "ldr r3, [%1, #32] \n\t" \ + "ldr r4, [%1, #36] \n\t" \ + "push {r0, r1, r2, r3, r4} \n\t" \ + "ldr r0, [%1, #4] \n\t" \ + "ldr r1, [%1, #8] \n\t" \ + "ldr r2, [%1, #12] \n\t" \ + "ldr r3, [%1, #16] \n\t" \ + "ldr r4, [%1] \n\t" /* target->r4 */ \ + VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ + VALGRIND_RESTORE_STACK \ + "mov %0, r0" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r10" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_arm_linux */ + +/* ------------------------- s390x-linux ------------------------- */ + +#if defined(PLAT_s390x_linux) + +/* Similar workaround as amd64 (see above), but we use r11 as frame + pointer and save the old r11 in r7. r11 might be used for + argvec, therefore we copy argvec in r1 since r1 is clobbered + after the call anyway. */ +#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) +# define __FRAME_POINTER \ + ,"d"(__builtin_dwarf_cfa()) +# define VALGRIND_CFI_PROLOGUE \ + ".cfi_remember_state\n\t" \ + "lgr 1,%1\n\t" /* copy the argvec pointer in r1 */ \ + "lgr 7,11\n\t" \ + "lgr 11,%2\n\t" \ + ".cfi_def_cfa r11, 0\n\t" +# define VALGRIND_CFI_EPILOGUE \ + "lgr 11, 7\n\t" \ + ".cfi_restore_state\n\t" +#else +# define __FRAME_POINTER +# define VALGRIND_CFI_PROLOGUE \ + "lgr 1,%1\n\t" +# define VALGRIND_CFI_EPILOGUE +#endif + +/* Nb: On s390 the stack pointer is properly aligned *at all times* + according to the s390 GCC maintainer. (The ABI specification is not + precise in this regard.) Therefore, VALGRIND_ALIGN_STACK and + VALGRIND_RESTORE_STACK are not defined here. */ + +/* These regs are trashed by the hidden call. Note that we overwrite + r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the + function a proper return address. All others are ABI defined call + clobbers. */ +#define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \ + "f0","f1","f2","f3","f4","f5","f6","f7" + +/* Nb: Although r11 is modified in the asm snippets below (inside + VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for + two reasons: + (1) r11 is restored in VALGRIND_CFI_EPILOGUE, so effectively it is not + modified + (2) GCC will complain that r11 cannot appear inside a clobber section, + when compiled with -O -fno-omit-frame-pointer + */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 1, 0(1)\n\t" /* target->r1 */ \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "d" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +/* The call abi has the arguments in r2-r6 and stack */ +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1, arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-160\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,160\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-168\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,168\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-176\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,176\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-184\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,184\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-192\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,192\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9, arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-200\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "mvc 192(8,15), 80(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,200\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9, arg10, arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-208\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "mvc 192(8,15), 80(1)\n\t" \ + "mvc 200(8,15), 88(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,208\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \ + arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)arg1; \ + _argvec[2] = (unsigned long)arg2; \ + _argvec[3] = (unsigned long)arg3; \ + _argvec[4] = (unsigned long)arg4; \ + _argvec[5] = (unsigned long)arg5; \ + _argvec[6] = (unsigned long)arg6; \ + _argvec[7] = (unsigned long)arg7; \ + _argvec[8] = (unsigned long)arg8; \ + _argvec[9] = (unsigned long)arg9; \ + _argvec[10] = (unsigned long)arg10; \ + _argvec[11] = (unsigned long)arg11; \ + _argvec[12] = (unsigned long)arg12; \ + __asm__ volatile( \ + VALGRIND_CFI_PROLOGUE \ + "aghi 15,-216\n\t" \ + "lg 2, 8(1)\n\t" \ + "lg 3,16(1)\n\t" \ + "lg 4,24(1)\n\t" \ + "lg 5,32(1)\n\t" \ + "lg 6,40(1)\n\t" \ + "mvc 160(8,15), 48(1)\n\t" \ + "mvc 168(8,15), 56(1)\n\t" \ + "mvc 176(8,15), 64(1)\n\t" \ + "mvc 184(8,15), 72(1)\n\t" \ + "mvc 192(8,15), 80(1)\n\t" \ + "mvc 200(8,15), 88(1)\n\t" \ + "mvc 208(8,15), 96(1)\n\t" \ + "lg 1, 0(1)\n\t" \ + VALGRIND_CALL_NOREDIR_R1 \ + "lgr %0, 2\n\t" \ + "aghi 15,216\n\t" \ + VALGRIND_CFI_EPILOGUE \ + : /*out*/ "=d" (_res) \ + : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ + : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + + +#endif /* PLAT_s390x_linux */ + +/* ------------------------- mips32-linux ----------------------- */ + +#if defined(PLAT_mips32_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ +"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ +"$25", "$31" + +/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16\n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" /* arg1*/ \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "subu $29, $29, 16 \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 16 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 24\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 24 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 32\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "nop\n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 32 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 32\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 32 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 40\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 40 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 40\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 40 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 48\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 48 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 48\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 44(%1) \n\t" \ + "sw $4, 40($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 48 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + "subu $29, $29, 8 \n\t" \ + "sw $28, 0($29) \n\t" \ + "sw $31, 4($29) \n\t" \ + "lw $4, 20(%1) \n\t" \ + "subu $29, $29, 56\n\t" \ + "sw $4, 16($29) \n\t" \ + "lw $4, 24(%1) \n\t" \ + "sw $4, 20($29) \n\t" \ + "lw $4, 28(%1) \n\t" \ + "sw $4, 24($29) \n\t" \ + "lw $4, 32(%1) \n\t" \ + "sw $4, 28($29) \n\t" \ + "lw $4, 36(%1) \n\t" \ + "sw $4, 32($29) \n\t" \ + "lw $4, 40(%1) \n\t" \ + "sw $4, 36($29) \n\t" \ + "lw $4, 44(%1) \n\t" \ + "sw $4, 40($29) \n\t" \ + "lw $4, 48(%1) \n\t" \ + "sw $4, 44($29) \n\t" \ + "lw $4, 4(%1) \n\t" \ + "lw $5, 8(%1) \n\t" \ + "lw $6, 12(%1) \n\t" \ + "lw $7, 16(%1) \n\t" \ + "lw $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "addu $29, $29, 56 \n\t" \ + "lw $28, 0($29) \n\t" \ + "lw $31, 4($29) \n\t" \ + "addu $29, $29, 8 \n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_mips32_linux */ + +/* ------------------------- mips64-linux ------------------------- */ + +#if defined(PLAT_mips64_linux) + +/* These regs are trashed by the hidden call. */ +#define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \ +"$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ +"$25", "$31" + +/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned + long) == 4. */ + +#define CALL_FN_W_v(lval, orig) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[1]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + __asm__ volatile( \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "0" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_W(lval, orig, arg1) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[2]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" /* arg1*/ \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[3]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[4]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[5]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[6]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[7]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[8]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[9]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + __asm__ volatile( \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1) \n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[10]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + __asm__ volatile( \ + "dsubu $29, $29, 8\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 8\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ + arg7,arg8,arg9,arg10) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[11]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + __asm__ volatile( \ + "dsubu $29, $29, 16\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 16\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[12]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + __asm__ volatile( \ + "dsubu $29, $29, 24\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 88(%1)\n\t" \ + "sd $4, 16($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 24\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ + arg6,arg7,arg8,arg9,arg10, \ + arg11,arg12) \ + do { \ + volatile OrigFn _orig = (orig); \ + volatile unsigned long _argvec[13]; \ + volatile unsigned long _res; \ + _argvec[0] = (unsigned long)_orig.nraddr; \ + _argvec[1] = (unsigned long)(arg1); \ + _argvec[2] = (unsigned long)(arg2); \ + _argvec[3] = (unsigned long)(arg3); \ + _argvec[4] = (unsigned long)(arg4); \ + _argvec[5] = (unsigned long)(arg5); \ + _argvec[6] = (unsigned long)(arg6); \ + _argvec[7] = (unsigned long)(arg7); \ + _argvec[8] = (unsigned long)(arg8); \ + _argvec[9] = (unsigned long)(arg9); \ + _argvec[10] = (unsigned long)(arg10); \ + _argvec[11] = (unsigned long)(arg11); \ + _argvec[12] = (unsigned long)(arg12); \ + __asm__ volatile( \ + "dsubu $29, $29, 32\n\t" \ + "ld $4, 72(%1)\n\t" \ + "sd $4, 0($29)\n\t" \ + "ld $4, 80(%1)\n\t" \ + "sd $4, 8($29)\n\t" \ + "ld $4, 88(%1)\n\t" \ + "sd $4, 16($29)\n\t" \ + "ld $4, 96(%1)\n\t" \ + "sd $4, 24($29)\n\t" \ + "ld $4, 8(%1)\n\t" \ + "ld $5, 16(%1)\n\t" \ + "ld $6, 24(%1)\n\t" \ + "ld $7, 32(%1)\n\t" \ + "ld $8, 40(%1)\n\t" \ + "ld $9, 48(%1)\n\t" \ + "ld $10, 56(%1)\n\t" \ + "ld $11, 64(%1)\n\t" \ + "ld $25, 0(%1)\n\t" /* target->t9 */ \ + VALGRIND_CALL_NOREDIR_T9 \ + "daddu $29, $29, 32\n\t" \ + "move %0, $2\n" \ + : /*out*/ "=r" (_res) \ + : /*in*/ "r" (&_argvec[0]) \ + : /*trash*/ "memory", __CALLER_SAVED_REGS \ + ); \ + lval = (__typeof__(lval)) _res; \ + } while (0) + +#endif /* PLAT_mips64_linux */ + + +/* ------------------------------------------------------------------ */ +/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ +/* */ +/* ------------------------------------------------------------------ */ + +/* Some request codes. There are many more of these, but most are not + exposed to end-user view. These are the public ones, all of the + form 0x1000 + small_number. + + Core ones are in the range 0x00000000--0x0000ffff. The non-public + ones start at 0x2000. +*/ + +/* These macros are used by tools -- they must be public, but don't + embed them into other programs. */ +#define VG_USERREQ_TOOL_BASE(a,b) \ + ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) +#define VG_IS_TOOL_USERREQ(a, b, v) \ + (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) + +/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! + This enum comprises an ABI exported by Valgrind to programs + which use client requests. DO NOT CHANGE THE ORDER OF THESE + ENTRIES, NOR DELETE ANY -- add new ones at the end. */ +typedef + enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, + VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, + + /* These allow any function to be called from the simulated + CPU but run on the real CPU. Nb: the first arg passed to + the function is always the ThreadId of the running + thread! So CLIENT_CALL0 actually requires a 1 arg + function, etc. */ + VG_USERREQ__CLIENT_CALL0 = 0x1101, + VG_USERREQ__CLIENT_CALL1 = 0x1102, + VG_USERREQ__CLIENT_CALL2 = 0x1103, + VG_USERREQ__CLIENT_CALL3 = 0x1104, + + /* Can be useful in regression testing suites -- eg. can + send Valgrind's output to /dev/null and still count + errors. */ + VG_USERREQ__COUNT_ERRORS = 0x1201, + + /* Allows the client program and/or gdbserver to execute a monitor + command. */ + VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202, + + /* These are useful and can be interpreted by any tool that + tracks malloc() et al, by using vg_replace_malloc.c. */ + VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301, + VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b, + VG_USERREQ__FREELIKE_BLOCK = 0x1302, + /* Memory pool support. */ + VG_USERREQ__CREATE_MEMPOOL = 0x1303, + VG_USERREQ__DESTROY_MEMPOOL = 0x1304, + VG_USERREQ__MEMPOOL_ALLOC = 0x1305, + VG_USERREQ__MEMPOOL_FREE = 0x1306, + VG_USERREQ__MEMPOOL_TRIM = 0x1307, + VG_USERREQ__MOVE_MEMPOOL = 0x1308, + VG_USERREQ__MEMPOOL_CHANGE = 0x1309, + VG_USERREQ__MEMPOOL_EXISTS = 0x130a, + + /* Allow printfs to valgrind log. */ + /* The first two pass the va_list argument by value, which + assumes it is the same size as or smaller than a UWord, + which generally isn't the case. Hence are deprecated. + The second two pass the vargs by reference and so are + immune to this problem. */ + /* both :: char* fmt, va_list vargs (DEPRECATED) */ + VG_USERREQ__PRINTF = 0x1401, + VG_USERREQ__PRINTF_BACKTRACE = 0x1402, + /* both :: char* fmt, va_list* vargs */ + VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403, + VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404, + + /* Stack support. */ + VG_USERREQ__STACK_REGISTER = 0x1501, + VG_USERREQ__STACK_DEREGISTER = 0x1502, + VG_USERREQ__STACK_CHANGE = 0x1503, + + /* Wine support */ + VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601, + + /* Querying of debug info. */ + VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701, + + /* Disable/enable error reporting level. Takes a single + Word arg which is the delta to this thread's error + disablement indicator. Hence 1 disables or further + disables errors, and -1 moves back towards enablement. + Other values are not allowed. */ + VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801, + + /* Initialise IR injection */ + VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901 + } Vg_ClientRequest; + +#if !defined(__GNUC__) +# define __extension__ /* */ +#endif + + +/* Returns the number of Valgrinds this code is running under. That + is, 0 if running natively, 1 if running under Valgrind, 2 if + running under Valgrind which is running under another Valgrind, + etc. */ +#define RUNNING_ON_VALGRIND \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */, \ + VG_USERREQ__RUNNING_ON_VALGRIND, \ + 0, 0, 0, 0, 0) \ + + +/* Discard translation of code in the range [_qzz_addr .. _qzz_addr + + _qzz_len - 1]. Useful if you are debugging a JITter or some such, + since it provides a way to make sure valgrind will retranslate the + invalidated area. Returns no value. */ +#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \ + _qzz_addr, _qzz_len, 0, 0, 0) + + +/* These requests are for getting Valgrind itself to print something. + Possibly with a backtrace. This is a really ugly hack. The return value + is the number of characters printed, excluding the "**** " part at the + start and the backtrace (if present). */ + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER) +/* Modern GCC will optimize the static routine out if unused, + and unused attribute will shut down warnings about it. */ +static int VALGRIND_PRINTF(const char *format, ...) + __attribute__((format(__printf__, 1, 2), __unused__)); +#endif +static int +#if defined(_MSC_VER) +__inline +#endif +VALGRIND_PRINTF(const char *format, ...) +{ +#if defined(NVALGRIND) + return 0; +#else /* NVALGRIND */ +#if defined(_MSC_VER) || defined(__MINGW64__) + uintptr_t _qzz_res; +#else + unsigned long _qzz_res; +#endif + va_list vargs; + va_start(vargs, format); +#if defined(_MSC_VER) || defined(__MINGW64__) + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_VALIST_BY_REF, + (uintptr_t)format, + (uintptr_t)&vargs, + 0, 0, 0); +#else + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_VALIST_BY_REF, + (unsigned long)format, + (unsigned long)&vargs, + 0, 0, 0); +#endif + va_end(vargs); + return (int)_qzz_res; +#endif /* NVALGRIND */ +} + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER) +static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) + __attribute__((format(__printf__, 1, 2), __unused__)); +#endif +static int +#if defined(_MSC_VER) +__inline +#endif +VALGRIND_PRINTF_BACKTRACE(const char *format, ...) +{ +#if defined(NVALGRIND) + return 0; +#else /* NVALGRIND */ +#if defined(_MSC_VER) || defined(__MINGW64__) + uintptr_t _qzz_res; +#else + unsigned long _qzz_res; +#endif + va_list vargs; + va_start(vargs, format); +#if defined(_MSC_VER) || defined(__MINGW64__) + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, + (uintptr_t)format, + (uintptr_t)&vargs, + 0, 0, 0); +#else + _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0, + VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, + (unsigned long)format, + (unsigned long)&vargs, + 0, 0, 0); +#endif + va_end(vargs); + return (int)_qzz_res; +#endif /* NVALGRIND */ +} + + +/* These requests allow control to move from the simulated CPU to the + real CPU, calling an arbitary function. + + Note that the current ThreadId is inserted as the first argument. + So this call: + + VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) + + requires f to have this signature: + + Word f(Word tid, Word arg1, Word arg2) + + where "Word" is a word-sized type. + + Note that these client requests are not entirely reliable. For example, + if you call a function with them that subsequently calls printf(), + there's a high chance Valgrind will crash. Generally, your prospects of + these working are made higher if the called function does not refer to + any global variables, and does not refer to any libc or other functions + (printf et al). Any kind of entanglement with libc or dynamic linking is + likely to have a bad outcome, for tricky reasons which we've grappled + with a lot in the past. +*/ +#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL0, \ + _qyy_fn, \ + 0, 0, 0, 0) + +#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL1, \ + _qyy_fn, \ + _qyy_arg1, 0, 0, 0) + +#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL2, \ + _qyy_fn, \ + _qyy_arg1, _qyy_arg2, 0, 0) + +#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* default return */, \ + VG_USERREQ__CLIENT_CALL3, \ + _qyy_fn, \ + _qyy_arg1, _qyy_arg2, \ + _qyy_arg3, 0) + + +/* Counts the number of errors that have been recorded by a tool. Nb: + the tool must record the errors with VG_(maybe_record_error)() or + VG_(unique_error)() for them to be counted. */ +#define VALGRIND_COUNT_ERRORS \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \ + 0 /* default return */, \ + VG_USERREQ__COUNT_ERRORS, \ + 0, 0, 0, 0, 0) + +/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing + when heap blocks are allocated in order to give accurate results. This + happens automatically for the standard allocator functions such as + malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete, + delete[], etc. + + But if your program uses a custom allocator, this doesn't automatically + happen, and Valgrind will not do as well. For example, if you allocate + superblocks with mmap() and then allocates chunks of the superblocks, all + Valgrind's observations will be at the mmap() level and it won't know that + the chunks should be considered separate entities. In Memcheck's case, + that means you probably won't get heap block overrun detection (because + there won't be redzones marked as unaddressable) and you definitely won't + get any leak detection. + + The following client requests allow a custom allocator to be annotated so + that it can be handled accurately by Valgrind. + + VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated + by a malloc()-like function. For Memcheck (an illustrative case), this + does two things: + + - It records that the block has been allocated. This means any addresses + within the block mentioned in error messages will be + identified as belonging to the block. It also means that if the block + isn't freed it will be detected by the leak checker. + + - It marks the block as being addressable and undefined (if 'is_zeroed' is + not set), or addressable and defined (if 'is_zeroed' is set). This + controls how accesses to the block by the program are handled. + + 'addr' is the start of the usable block (ie. after any + redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator + can apply redzones -- these are blocks of padding at the start and end of + each block. Adding redzones is recommended as it makes it much more likely + Valgrind will spot block overruns. `is_zeroed' indicates if the memory is + zeroed (or filled with another predictable value), as is the case for + calloc(). + + VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a + heap block -- that will be used by the client program -- is allocated. + It's best to put it at the outermost level of the allocator if possible; + for example, if you have a function my_alloc() which calls + internal_alloc(), and the client request is put inside internal_alloc(), + stack traces relating to the heap block will contain entries for both + my_alloc() and internal_alloc(), which is probably not what you want. + + For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out + custom blocks from within a heap block, B, that has been allocated with + malloc/calloc/new/etc, then block B will be *ignored* during leak-checking + -- the custom blocks will take precedence. + + VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK. For + Memcheck, it does two things: + + - It records that the block has been deallocated. This assumes that the + block was annotated as having been allocated via + VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. + + - It marks the block as being unaddressable. + + VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a + heap block is deallocated. + + VALGRIND_RESIZEINPLACE_BLOCK informs a tool about reallocation. For + Memcheck, it does four things: + + - It records that the size of a block has been changed. This assumes that + the block was annotated as having been allocated via + VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. + + - If the block shrunk, it marks the freed memory as being unaddressable. + + - If the block grew, it marks the new area as undefined and defines a red + zone past the end of the new block. + + - The V-bits of the overlap between the old and the new block are preserved. + + VALGRIND_RESIZEINPLACE_BLOCK should be put after allocation of the new block + and before deallocation of the old block. + + In many cases, these three client requests will not be enough to get your + allocator working well with Memcheck. More specifically, if your allocator + writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call + will be necessary to mark the memory as addressable just before the zeroing + occurs, otherwise you'll get a lot of invalid write errors. For example, + you'll need to do this if your allocator recycles freed blocks, but it + zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK). + Alternatively, if your allocator reuses freed blocks for allocator-internal + data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary. + + Really, what's happening is a blurring of the lines between the client + program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the + memory should be considered unaddressable to the client program, but the + allocator knows more than the rest of the client program and so may be able + to safely access it. Extra client requests are necessary for Valgrind to + understand the distinction between the allocator and the rest of the + program. + + Ignored if addr == 0. +*/ +#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \ + addr, sizeB, rzB, is_zeroed, 0) + +/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. + Ignored if addr == 0. +*/ +#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \ + addr, oldSizeB, newSizeB, rzB, 0) + +/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. + Ignored if addr == 0. +*/ +#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \ + addr, rzB, 0, 0, 0) + +/* Create a memory pool. */ +#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \ + pool, rzB, is_zeroed, 0, 0) + +/* Destroy a memory pool. */ +#define VALGRIND_DESTROY_MEMPOOL(pool) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \ + pool, 0, 0, 0, 0) + +/* Associate a piece of memory with a memory pool. */ +#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \ + pool, addr, size, 0, 0) + +/* Disassociate a piece of memory from a memory pool. */ +#define VALGRIND_MEMPOOL_FREE(pool, addr) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \ + pool, addr, 0, 0, 0) + +/* Disassociate any pieces outside a particular range. */ +#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \ + pool, addr, size, 0, 0) + +/* Resize and/or move a piece associated with a memory pool. */ +#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \ + poolA, poolB, 0, 0, 0) + +/* Resize and/or move a piece associated with a memory pool. */ +#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \ + pool, addrA, addrB, size, 0) + +/* Return 1 if a mempool exists, else 0. */ +#define VALGRIND_MEMPOOL_EXISTS(pool) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__MEMPOOL_EXISTS, \ + pool, 0, 0, 0, 0) + +/* Mark a piece of memory as being a stack. Returns a stack id. */ +#define VALGRIND_STACK_REGISTER(start, end) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__STACK_REGISTER, \ + start, end, 0, 0, 0) + +/* Unmark the piece of memory associated with a stack id as being a + stack. */ +#define VALGRIND_STACK_DEREGISTER(id) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \ + id, 0, 0, 0, 0) + +/* Change the start and end address of the stack id. */ +#define VALGRIND_STACK_CHANGE(id, start, end) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \ + id, start, end, 0, 0) + +/* Load PDB debug info for Wine PE image_map. */ +#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \ + fd, ptr, total_size, delta, 0) + +/* Map a code address to a source file name and line number. buf64 + must point to a 64-byte buffer in the caller's address space. The + result will be dumped in there and is guaranteed to be zero + terminated. If no info is found, the first byte is set to zero. */ +#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \ + (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \ + VG_USERREQ__MAP_IP_TO_SRCLOC, \ + addr, buf64, 0, 0, 0) + +/* Disable error reporting for this thread. Behaves in a stack like + way, so you can safely call this multiple times provided that + VALGRIND_ENABLE_ERROR_REPORTING is called the same number of times + to re-enable reporting. The first call of this macro disables + reporting. Subsequent calls have no effect except to increase the + number of VALGRIND_ENABLE_ERROR_REPORTING calls needed to re-enable + reporting. Child threads do not inherit this setting from their + parents -- they are always created with reporting enabled. */ +#define VALGRIND_DISABLE_ERROR_REPORTING \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ + 1, 0, 0, 0, 0) + +/* Re-enable error reporting, as per comments on + VALGRIND_DISABLE_ERROR_REPORTING. */ +#define VALGRIND_ENABLE_ERROR_REPORTING \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \ + -1, 0, 0, 0, 0) + +/* Execute a monitor command from the client program. + If a connection is opened with GDB, the output will be sent + according to the output mode set for vgdb. + If no connection is opened, output will go to the log output. + Returns 1 if command not recognised, 0 otherwise. */ +#define VALGRIND_MONITOR_COMMAND(command) \ + VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \ + command, 0, 0, 0, 0) + + +#undef PLAT_x86_darwin +#undef PLAT_amd64_darwin +#undef PLAT_x86_win32 +#undef PLAT_amd64_win64 +#undef PLAT_x86_linux +#undef PLAT_amd64_linux +#undef PLAT_ppc32_linux +#undef PLAT_ppc64_linux +#undef PLAT_arm_linux +#undef PLAT_s390x_linux +#undef PLAT_mips32_linux +#undef PLAT_mips64_linux + +#endif /* __VALGRIND_H */ diff -Nru gcr-3.38.1/ChangeLog gcr-3.40.0/ChangeLog --- gcr-3.38.1/ChangeLog 2021-01-12 22:55:54.635056000 +0000 +++ gcr-3.40.0/ChangeLog 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -=== ChangeLog discontinued === - - gcr does not use a manually edited ChangeLog file. We rely on commit - messages to provide change history. Please write commit messages - in the following format: - -=== begin example commit === - - Short explanation of the commit - - Longer explanation explaining exactly what's changed, whether any - external or private interfaces changed, what bugs were fixed (with bug - tracker reference if applicable) and so forth. Be concise but not too - brief. - -=== end example commit === - - - Always add a brief description of the commit to the _first_ line of - the commit and terminate by two newlines. This may be the title of - a fixed bug, copied from Bugzilla. - - - First line (the brief description) must only be one sentence and - should start with a capital letter unless it starts with a - lowercase symbol or identifier. Don't use a trailing full stop, - and don't exceed 72 characters. - - - The main description (the body) is normal prose and should use - normal punctuation and capital letters where appropriate. - - - When committing code on behalf of others use the --author option, - e.g. git commit -a --author "Joe Coder " and - --signoff. - diff -Nru gcr-3.38.1/configure.ac gcr-3.40.0/configure.ac --- gcr-3.38.1/configure.ac 2021-01-12 22:55:54.637056000 +0000 +++ gcr-3.40.0/configure.ac 1970-01-01 00:00:00.000000000 +0000 @@ -1,447 +0,0 @@ - -m4_define([gcr_major], [3]) -m4_define([gcr_minor], [38]) -m4_define([gcr_micro], [1]) - -AC_PREREQ([2.63]) -AC_INIT([gcr], [gcr_major.gcr_minor.gcr_micro], - [http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr], - [gcr]) - -dnl **************************************************************************** -dnl Dependency versions - -GLIB_REQ=2.44.0 -GLIB_MIN=GLIB_VERSION_2_44 -GLIB_MAX=GLIB_VERSION_2_44 - -GCRYPT_VERSION=1.4.5 - -GTK_REQ=3.12 - -dnl **************************************************************************** -dnl Library package and libtool versioning -dnl -dnl Updating the libtool versions, follow these instructions sequentially: -dnl 1. If the library source code has changed at all since the last update, then increment revision (‘c:r:a’ becomes ‘c:r+1:a’). -dnl 2. If any interfaces have been added, removed, or changed since the last update, increment current, and set revision to 0. -dnl 3. If any interfaces have been added since the last public release, then increment age. -dnl 4. If any interfaces have been removed or changed since the last public release, then set age to 0. - -# GCK package versioning -GCK_MAJOR=1 -GCK_MINOR=0 -GCK_MICRO=0 - -# GCK libtool versioning -GCK_CURRENT=0 -GCK_REVISION=0 -GCK_AGE=0 - -# GCR package versioning -GCR_MAJOR=gcr_major -GCR_MINOR=gcr_minor -GCR_MICRO=gcr_micro - -# GCR libtool versioning -GCR_CURRENT=1 -GCR_REVISION=0 -GCR_AGE=0 - -dnl **************************************************************************** - -AC_CONFIG_MACRO_DIR([build/m4]) -AC_CONFIG_AUX_DIR([build]) -AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar foreign -Wno-portability subdir-objects]) -AM_SANITY_CHECK -AC_CONFIG_HEADERS(config.h) -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -AM_MAINTAINER_MODE([enable]) - -# ----------------------------------------------------------------------------- -# Basic tools - -AC_GNU_SOURCE -AC_ISC_POSIX -AC_PROG_CC -AC_PROG_CPP -AM_PROG_CC_C_O -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AM_DISABLE_STATIC -AM_PROG_LIBTOOL -PKG_PROG_PKG_CONFIG - -AM_GNU_GETTEXT([external]) -# FIXME: Remove AM_GNU_GETTEXT_VERSION once autoreconf supports REQUIRE_VERSION -AM_GNU_GETTEXT_VERSION([0.19.8]) -AM_GNU_GETTEXT_REQUIRE_VERSION([0.19.8]) -GETTEXT_PACKAGE=gcr -AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [The gettext domain name]) -AC_SUBST(GETTEXT_PACKAGE) - -# ----------------------------------------------------------------------------- -# GLib and GTK+ stuff - -PKG_CHECK_MODULES(GLIB, - glib-2.0 >= $GLIB_REQ - gmodule-no-export-2.0 - gthread-2.0 - gobject-2.0 - gio-2.0 gio-unix-2.0) -GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=$GLIB_MIN" -GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MAX_ALLOWED=$GLIB_MAX" -AC_SUBST(GLIB_CFLAGS) -AC_SUBST(GLIB_LIBS) - -GLIB_GSETTINGS -AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal) -AC_PATH_PROG(GLIB_MKENUMS, glib-mkenums) -AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources) - -GTK_DOC_CHECK(1.9) - -GOBJECT_INTROSPECTION_CHECK([1.34]) -if test "$enable_introspection" = "yes"; then - AC_PATH_PROG(XSLTPROC, xsltproc, - AC_MSG_ERROR([Need xsltproc in order to build with gobject introspection]) - ) -fi - -# -------------------------------------------------------------------- -# Optional GTK+ widgets build, avoid building gtk-doc wihtout GTK+ -# -AC_ARG_WITH(gtk, [ - AC_HELP_STRING([--without-gtk], - [do not build code that uses GTK+]), - ], [], [with_gtk=yes]) -AM_CONDITIONAL(WITH_GTK, test "$with_gtk" != "no") - -if test "x$with_gtk" != "xno"; then - PKG_CHECK_MODULES(GTK, gtk+-3.0 >= $GTK_REQ gtk+-x11-3.0 >= $GTK_REQ) - AC_SUBST(GTK_CFLAGS) - AC_SUBST(GTK_LIBS) -fi - -if test "x$enable_gtk_doc" = "xyes"; then - if test "x$with_gtk" = "xno"; then - AC_MSG_ERROR([Cannot build documentation if building GTK+ widgets is disabled]) - fi -fi - -# -------------------------------------------------------------------- -# Vala - -VALA_REQUIRED=0.18.0.22 - -VAPIGEN_CHECK($VALA_REQUIRED) - -if test "$enable_vala" != "no"; then - AC_PATH_PROG([VALAC], [valac], []) -fi -AM_CONDITIONAL(HAVE_VALAC, test "x$VALAC" != "x") - -# -------------------------------------------------------------------- -# Checks for functions -# - -AC_CHECK_FUNCS(timegm, AC_DEFINE(HAVE_TIMEGM,1,[Have timegm])) -AC_CHECK_FUNCS(mlock) - -# -------------------------------------------------------------------- -# p11-kit - -PKG_CHECK_MODULES([P11_KIT], p11-kit-1 >= 0.19.0) -AC_SUBST(P11_KIT_CFLAGS) -AC_SUBST(P11_KIT_LIBS) - -AC_MSG_CHECKING([where to put pkcs11 module configuration]) -P11_SYSTEM_CONFIG_MODULES=$($PKG_CONFIG p11-kit-1 --variable=p11_system_config_modules) -AC_MSG_RESULT($P11_SYSTEM_CONFIG_MODULES) -AC_SUBST(P11_SYSTEM_CONFIG_MODULES) - -if test "$P11_SYSTEM_CONFIG_MODULES" = ""; then - AC_MSG_ERROR([Could not find location for pkcs11 module config]) -fi - -AC_MSG_CHECKING([module path to install pkcs11 modules]) -AC_ARG_WITH(pkcs11-modules, [ - AC_HELP_STRING([--with-pkcs11-modules=], - [directory to install PKCS#11 modules]) - ]) -if test -z "$with_pkcs11_modules" ; then - P11_MODULE_PATH=$($PKG_CONFIG p11-kit-1 --variable=p11_module_path) -else - P11_MODULE_PATH="$with_pkcs11_modules" -fi -if test "$P11_MODULE_PATH" = ""; then - AC_MSG_ERROR([Could not find directory to install pkcs11 modules]) -fi -AC_MSG_RESULT($P11_MODULE_PATH) -AC_SUBST(P11_MODULE_PATH) - -pkcs11standalonedir="${libdir}/gnome-keyring/devel" -AC_SUBST(pkcs11standalonedir) - -# -------------------------------------------------------------------- -# GPG support - -AC_PATH_PROGS([GNUPG], [gpg gpg2], ["gpg"]) -AC_DEFINE_UNQUOTED([GPG_EXECUTABLE], ["$GNUPG"], [Path to gpg executable.]) - -# -------------------------------------------------------------------- -# libgcrypt -# - -GCRYPT_LIBVER=1 - -AM_PATH_LIBGCRYPT($GCRYPT_LIBVER:$GCRYPT_VERSION,, - AC_MSG_ERROR([[ -*** -*** libgcrypt was not found. You may want to get it from -*** ftp://ftp.gnupg.org/gcrypt/libgcrypt/ -*** -]])) -libgcrypt=yes -AC_DEFINE_UNQUOTED(LIBGCRYPT_VERSION, "$GCRYPT_VERSION", [Version of GCRYPT we expect]) - -AC_SUBST([LIBGCRYPT_CFLAGS]) -AC_SUBST([LIBGCRYPT_LIBS]) - -# ---------------------------------------------------------------------- -# mime-database - -AC_ARG_ENABLE(update-mime, - AC_HELP_STRING([--disable-update-mime], - [don't run update-mime-database utility (useful for packages) ])) -AM_CONDITIONAL(WITH_UPDATE_MIME, test "$enable_update_mime" != "no") - -AC_ARG_ENABLE(update-icon-cache, - AC_HELP_STRING([--disable-update-icon-cache], - [don't run gtk-update-icon-cache utility (useful for packages) ])) -AM_CONDITIONAL(WITH_UPDATE_ICON_CACHE, test "$enable_update_icon_cache" != "no") - -# ---------------------------------------------------------------------- -# DBus services - -AC_ARG_WITH(dbus-services, - [AC_HELP_STRING([--with-dbus-services=], - [where D-BUS session services directory is])]) -if ! test -z "$with_dbus_services" ; then - DBUS_SERVICES_DIR="$with_dbus_services" -else - DBUS_SERVICES_DIR="$datadir/dbus-1/services" -fi - -AC_SUBST(DBUS_SERVICES_DIR) - -# -------------------------------------------------------------------- -# Compilation and linking options -# - -AC_MSG_CHECKING([for debug mode]) -AC_ARG_ENABLE(debug, - AC_HELP_STRING([--enable-debug=no/default/yes], - [Turn on or off debugging])) - -if test "$enable_debug" != "no"; then - AC_DEFINE_UNQUOTED(WITH_DEBUG, 1, [Print debug output]) - AC_DEFINE_UNQUOTED(_DEBUG, 1, [In debug mode]) - CFLAGS="$CFLAGS -g" -fi - -if test "$enable_debug" = "yes"; then - debug_status="yes (-g, -O0, debug output, testable)" - AC_DEFINE_UNQUOTED(GCR_DISABLE_GRABS, 1, [Disable grabs]) - CFLAGS="$CFLAGS -O0" -elif test "$enable_debug" = "no"; then - debug_status="no (no debug output, not testable, G_DISABLE_ASSERT)" - AC_DEFINE_UNQUOTED(G_DISABLE_ASSERT, 1, [Disable glib assertions]) -else - debug_status="default (-g, debug output, testable)" -fi - -AC_MSG_RESULT($debug_status) - -AC_MSG_CHECKING(for more warnings) -if test "$GCC" = "yes"; then - AC_MSG_RESULT(yes) - CFLAGS="\ - -Wall \ - -Wchar-subscripts -Wmissing-declarations -Wmissing-prototypes \ - -Wnested-externs -Wpointer-arith \ - -Wcast-align -Wsign-compare \ - $CFLAGS" - - # Disable -Werror for now, because of issues with - # strange gtk-doc programs not building cleanly. - # -Werror \ - - for option in -Wno-strict-aliasing -Wno-sign-compare; do - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $option" - AC_MSG_CHECKING([whether gcc understands $option]) - AC_TRY_COMPILE([], [], - has_option=yes, - has_option=no,) - if test $has_option = no; then - CFLAGS="$SAVE_CFLAGS" - fi - AC_MSG_RESULT($has_option) - unset has_option - unset SAVE_CFLAGS - done - unset option -else - AC_MSG_RESULT(no) -fi - -AC_ARG_ENABLE(strict, [ - AS_HELP_STRING([--enable-strict], [Strict code compilation]) - ]) - -AC_MSG_CHECKING([build strict]) - -if test "$enable_strict" = "yes"; then - CFLAGS="$CFLAGS -Werror \ - -DGTK_DISABLE_DEPRECATED \ - -DGDK_DISABLE_DEPRECATED \ - -DG_DISABLE_DEPRECATED \ - -DGDK_PIXBUF_DISABLE_DEPRECATED" - TEST_MODE="thorough" - # HACK: Only set strict introspection if gir is greater than 1.39 - # https://bugzilla.gnome.org/show_bug.cgi?id=698367 - case $($PKG_CONFIG --modversion gobject-introspection-1.0) in - 1.3[[45678]]*) - INTROSPECTION_FLAGS="" - ;; - *) - INTROSPECTION_FLAGS="--warn-error" - ;; - esac - AC_DEFINE_UNQUOTED(WITH_STRICT, 1, [More strict checks]) - strict_status="yes (-Werror, thorough tests, fatals, no deprecations)" -else - TEST_MODE="quick" - INTROSPECTION_FLAGS="" - strict_status="no (quick tests, non-fatal warnings)" -fi - -AC_MSG_RESULT($strict_status) -AC_SUBST(INTROSPECTION_FLAGS) -AC_SUBST(TEST_MODE) - -AC_MSG_CHECKING([whether to build with gcov testing]) -AC_ARG_ENABLE([coverage], - [AS_HELP_STRING([--enable-coverage], [Whether to enable coverage testing ])], - [], - [enable_coverage=no]) - -AC_MSG_RESULT([$enable_coverage]) - -AC_MSG_CHECKING([code coverage]) - -if test "$enable_coverage" = "yes"; then - if test "$GCC" != "yes"; then - AC_MSG_ERROR(Coverage testing requires GCC) - fi - - AC_PATH_PROG(GCOV, gcov, no) - if test "$GCOV" = "no" ; then - AC_MSG_ERROR(gcov tool is not available) - fi - - AC_PATH_PROG(LCOV, lcov, no) - if test "$LCOV" = "no" ; then - AC_MSG_ERROR(lcov tool is not installed) - fi - - AC_PATH_PROG(GENHTML, genhtml, no) - if test "$GENHTML" = "no" ; then - AC_MSG_ERROR(lcov's genhtml tool is not installed) - fi - - CFLAGS="$CFLAGS -O0 -g --coverage" - LDFLAGS="$LDFLAGS --coverage" -fi - -AM_CONDITIONAL([WITH_COVERAGE], [test "$enable_coverage" = "yes"]) - -AC_MSG_RESULT($enable_coverage) - -AC_ARG_ENABLE(valgrind, - AC_HELP_STRING([--enable-valgrind[=@<:@yes/no@:>@]], - [Run gcr using valgrind]), ,enable_valgrind=yes) - -AC_MSG_CHECKING([valgrind]) -valgrind_status="yes" - -# Build valgrind support into code -if test "$enable_valgrind" = "yes"; then - CPPFLAGS_saved="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS -I${srcdir}/build" - AC_CHECK_HEADER([valgrind/valgrind.h], have_valgrind=yes, have_valgrind=no) - CPPFLAGS="$CPPFLAGS_saved" - if test "$have_valgrind" = "no"; then - AC_MSG_ERROR(The valgrind headers are missing) - fi - AC_DEFINE_UNQUOTED(WITH_VALGRIND, 1, [Run under valgrind]) - AC_MSG_RESULT(yes) - - -# No valgrind -else - AC_MSG_RESULT(no) - valgrind_status="no" -fi - -# ---------------------------------------------------------------------- - -GCK_LT_RELEASE=$GCK_CURRENT:$GCK_REVISION:$GCK_AGE -AC_SUBST(GCK_LT_RELEASE) -AC_SUBST(GCK_MAJOR) -AC_SUBST(GCK_MINOR) - -GCR_LT_RELEASE=$GCR_CURRENT:$GCR_REVISION:$GCR_AGE -AC_SUBST(GCR_CURRENT) -AC_SUBST(GCR_LT_RELEASE) -AC_SUBST(GCR_MAJOR) -AC_SUBST(GCR_MINOR) -AC_SUBST(GCR_MICRO) - -AC_OUTPUT([ -Makefile -docs/reference/gck/Makefile -docs/reference/gck/version.xml -docs/reference/gcr/Makefile -docs/reference/gcr/version.xml -gck/gck.pc -gck/gck-version.h -gcr/gcr-base.pc -gcr/gcr-version.h -po/Makefile.in -ui/gcr.pc -ui/gcr-ui.pc -ui/icons/16x16/Makefile -ui/icons/22x22/Makefile -ui/icons/24x24/Makefile -ui/icons/32x32/Makefile -ui/icons/48x48/Makefile -ui/icons/256x256/Makefile -]) - -# ------------------------------------------------------------------------------ -# Summary -# - -echo -echo "BUILD" -echo " Debug Build: $debug_status" -echo " Strict Compilation: $strict_status" -echo " GTK+ Widgets: $with_gtk" -echo " Introspection: $found_introspection" -echo " Vala: $enable_vala" -echo " Valgrind: $valgrind_status" -echo " Test Coverage: ${enable_coverage:-no}" -echo diff -Nru gcr-3.38.1/CONTRIBUTING.md gcr-3.40.0/CONTRIBUTING.md --- gcr-3.38.1/CONTRIBUTING.md 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/CONTRIBUTING.md 2021-03-27 08:40:56.289531500 +0000 @@ -0,0 +1,162 @@ +Contributing to GCR, GCK libraries +================================== + +Code merging +------------ +This is the work flow for modifying the gcr repository: + +1. File a bug for the given flaw or feature (if it does not already exist) at + https://gitlab.gnome.org/GNOME/gcr/issues. + +2. Create a fork of the main repository on gitlab.gnome.org (if you haven't + already) and commit your work there. + +3. If this is a non-trivial flaw or feature, write test cases. We won't accept + significant changes without adequate test coverage. + +4. Write code to fix the flaw or add the feature. In the case that tests are + necessary, the new tests must pass consistently. + +5. All code must follow the project coding style (see below). + +6. Make a Merge Request from your fork to the main gcr repository. + +7. The project must remain buildable with all meson options and pass all + tests on all platforms. It should also pass the CI. + +8. Rework your code based on suggestions in the review and submit new patches. + Return to the review step as necessary. + +9. Finally, if everything is reviewed and approved, a maintainer will merge it + for you. Thanks! + + +Repository Structure +-------------------- +* egg: Various bits of code shared with other modules (private) +* gck: A public library for accessing PKCS#11 modules. +* gcr: A public library for bits of crypto and parsing etc... +* ui: A public library that provides a GTK UI for several objects in gcr. +* schema: Desktop settings schemas for crypto stuff +* testing: Testing CA, gnupg and other mock setups +* po: Contains translation files + +Coding style +------------ +Our coding style is very similar to the linux coding style: + + http://lxr.linux.no/linux/Documentation/CodingStyle + ++ Space between function name and parentheses. + +``` +my_function_call (arg1, arg2); +``` + +* Braces on the same line as conditional with spaces around braces: + +``` +if (test) { + do_y (); + do_z (); +} + +switch (value) { +case CONSTANT: + do_z (); + break; +default: + break; +} +``` + +* Braces around functions on a separate line from function name, + return value on a separate line, arguments on separate lines. + +``` +static void +my_special_function (int arg1, + int arg2) +{ + /* body of function */ +} +``` + +* Don't use braces unnecessarily: + +``` + if (test) + do_this_thing (); +``` + +* But use braces here, when one section has more than a line: + +``` + if (test) { + do_this_thing (); + } else { + do_other_thing (); + smile_nicely (); + } +``` + +* Use of tabs for 8 char indent. + +``` +------->if (test) { +------->------->Value; +------->------->Value; +------->} +``` + +* No trailing whitespace on lines. + +* The '*' in a pointer declaration belongs with the variable name: + +``` + char *name; +``` + ++ Extra long wrapped lines should wrap to function opening brace + using spaces past indentation point. + +``` +------>my_function_call ("this is a very long argument here", +------> "wrapped argument is indented with spaces"); +``` + +* Function names are in lower case with _ separators. + +``` +this_is_a_long_function_name (); +``` + +* Constants are all in upper case with _ separators. + +``` +THIS_IS_A_CONSTANT +``` + ++ Structures should be typedefed to avoid saying 'struct' and names + are CamelCase: + +``` +ThisIsAStruct +``` + +* One line comments should look like: + +``` +/* This is a one line comment */ +``` + +* Multi line comments should look like: + +``` +/* + * This is a multiline comment. + * And it has a useless second line. + */ +``` + +When in doubt, adapt to the style of the code around your patch. diff -Nru gcr-3.38.1/debian/changelog gcr-3.40.0/debian/changelog --- gcr-3.38.1/debian/changelog 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/changelog 2021-09-09 00:08:30.000000000 +0000 @@ -1,3 +1,33 @@ +gcr (3.40.0-3) unstable; urgency=medium + + * debian/patches: Fix random certificate chain test failure in some archs + + -- Marco Trevisan (Treviño) Thu, 09 Sep 2021 02:08:30 +0200 + +gcr (3.40.0-2) unstable; urgency=medium + + * Bump debhelper-compat to 13 + * debian/rules: Clean up obsolete overrides + * Release to unstable + + -- Jeremy Bicha Thu, 19 Aug 2021 20:24:56 -0400 + +gcr (3.40.0-1) experimental; urgency=medium + + * New upstream release + * debian/control.in: + - updated gtk requirement + * debian/docs: + - updated documentation files to include + * debian/libgck-1-0.symbols: + - updated the list of symbols for the new version + * debian/rules: + - remove autoreconf overwrite, not needed anymore + * debian/patches/tests-collection-test-timeout.patch: + - remove patch included in the new version + + -- Sebastien Bacher Wed, 02 Jun 2021 16:23:07 +0200 + gcr (3.38.1-2) unstable; urgency=medium * Team upload diff -Nru gcr-3.38.1/debian/control gcr-3.40.0/debian/control --- gcr-3.38.1/debian/control 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/control 2021-09-09 00:08:30.000000000 +0000 @@ -6,9 +6,9 @@ Section: gnome Priority: optional Maintainer: Debian GNOME Maintainers -Uploaders: Emilio Pozuelo Monfort , Iain Lane , Jeremy Bicha , Laurent Bigonville +Uploaders: Iain Lane , Jeremy Bicha , Laurent Bigonville Build-Depends: dbus , - debhelper-compat (= 12), + debhelper-compat (= 13), dh-sequence-gir, dh-sequence-gnome, docbook-xml, @@ -18,7 +18,7 @@ libgcrypt20-dev (>= 1.4.5), libgirepository1.0-dev (>= 1.34), libglib2.0-dev (>= 2.44.0), - libgtk-3-dev (>= 3.12.0), + libgtk-3-dev (>= 3.22.0), libp11-kit-dev (>= 0.19.0), libtasn1-6-dev, libtasn1-bin, diff -Nru gcr-3.38.1/debian/control.in gcr-3.40.0/debian/control.in --- gcr-3.38.1/debian/control.in 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/control.in 2021-09-09 00:08:30.000000000 +0000 @@ -4,7 +4,7 @@ Maintainer: Debian GNOME Maintainers Uploaders: @GNOME_TEAM@ Build-Depends: dbus , - debhelper-compat (= 12), + debhelper-compat (= 13), dh-sequence-gir, dh-sequence-gnome, docbook-xml, @@ -14,7 +14,7 @@ libgcrypt20-dev (>= 1.4.5), libgirepository1.0-dev (>= 1.34), libglib2.0-dev (>= 2.44.0), - libgtk-3-dev (>= 3.12.0), + libgtk-3-dev (>= 3.22.0), libp11-kit-dev (>= 0.19.0), libtasn1-6-dev, libtasn1-bin, diff -Nru gcr-3.38.1/debian/docs gcr-3.40.0/debian/docs --- gcr-3.38.1/debian/docs 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/docs 2021-09-09 00:08:30.000000000 +0000 @@ -1,3 +1,3 @@ -AUTHORS NEWS -README +README.md + diff -Nru gcr-3.38.1/debian/libgck-1-0.symbols gcr-3.40.0/debian/libgck-1-0.symbols --- gcr-3.38.1/debian/libgck-1-0.symbols 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/libgck-1-0.symbols 2021-09-09 00:08:30.000000000 +0000 @@ -286,6 +286,7 @@ gck_slot_open_session_finish@Base 2.91.1 gck_slot_open_session_full@Base 2.91.1 gck_slot_open_session_full_async@Base 2.91.1 + gck_slot_token_has_flags@Base 3.40.0 gck_slots_enumerate_objects@Base 2.91.4 gck_string_from_chars@Base 2.91.1 gck_string_to_chars@Base 3.2.2 diff -Nru gcr-3.38.1/debian/patches/series gcr-3.40.0/debian/patches/series --- gcr-3.38.1/debian/patches/series 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/patches/series 2021-09-09 00:08:30.000000000 +0000 @@ -1 +1 @@ -tests-collection-test-timeout.patch +test-certificate-chain-Wait-for-objects-being-released-by.patch diff -Nru gcr-3.38.1/debian/patches/test-certificate-chain-Wait-for-objects-being-released-by.patch gcr-3.40.0/debian/patches/test-certificate-chain-Wait-for-objects-being-released-by.patch --- gcr-3.38.1/debian/patches/test-certificate-chain-Wait-for-objects-being-released-by.patch 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/debian/patches/test-certificate-chain-Wait-for-objects-being-released-by.patch 2021-09-09 00:08:30.000000000 +0000 @@ -0,0 +1,79 @@ +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= +Date: Thu, 9 Sep 2021 01:39:13 +0200 +Subject: test-certificate-chain: Wait for objects being released by GTask's + +As per switching to GTask we are facing GNOME/glib#1346 in various +places, including the certificate tests, as we were checking whether the +mock certificates were finalized in the same thread in which we created +them. + +This may not always happen right now because GTask may release the last +reference of it later than we do. +So, to force this to happen let's wait until we're owing last reference +and only at that point we actually release it, so that we can be sure +that the objects are finalized on tear-down. + +Fixes: https://gitlab.gnome.org/GNOME/gcr/-/issues/84 + +Origin: https://gitlab.gnome.org/GNOME/gcr/-/merge_requests/72 +--- + gcr/test-certificate-chain.c | 40 +++++++++++++++++++++++++++++++++++----- + 1 file changed, 35 insertions(+), 5 deletions(-) + +diff --git a/gcr/test-certificate-chain.c b/gcr/test-certificate-chain.c +index 7a2f40b..a0bc45f 100644 +--- a/gcr/test-certificate-chain.c ++++ b/gcr/test-certificate-chain.c +@@ -262,17 +262,47 @@ add_pinned_to_module (GcrCertificate *certificate, const gchar *purpose, const g + gck_mock_module_add_object (gck_builder_end (&builder)); + } + ++void ++on_toggle_notify (gpointer data, ++ GObject *object, ++ gboolean is_last_ref) ++{ ++ gboolean *last_ref = data; ++ ++ *last_ref = is_last_ref; ++} ++ ++static void ++wait_for_object_finalized (GObject *object) ++{ ++ gpointer weak_object = object; ++ gboolean last_ref = FALSE; ++ ++ /* GTask may release the object later than us as per GNOME/glib#1346, ++ * causing the test to fail when checking in which thread the objects ++ * are finalized. To ensure that the order is preserved we need then ++ * to wait that the GTask releases its last reference before we do. ++ */ ++ g_object_add_weak_pointer (object, &weak_object); ++ g_object_add_toggle_ref (object, on_toggle_notify, &last_ref); ++ g_object_unref (object); ++ egg_test_wait_for_gtask_thread (!last_ref); ++ ++ g_object_remove_toggle_ref (object, on_toggle_notify, &last_ref); ++ g_assert_null (weak_object); ++} ++ + static void + teardown (Test *test, gconstpointer unused) + { + CK_RV rv; + + g_object_unref (test->cert_self); +- g_object_unref (test->cert_signed); +- g_object_unref (test->cert_ca); +- g_object_unref (test->cert_host); +- g_object_unref (test->cert_inter); +- g_object_unref (test->cert_root); ++ wait_for_object_finalized (G_OBJECT (test->cert_signed)); ++ wait_for_object_finalized (G_OBJECT (test->cert_ca)); ++ wait_for_object_finalized (G_OBJECT (test->cert_host)); ++ wait_for_object_finalized (G_OBJECT (test->cert_inter)); ++ wait_for_object_finalized (G_OBJECT (test->cert_root)); + + rv = (test->funcs.C_Finalize) (NULL); + gck_assert_cmprv (rv, ==, CKR_OK); diff -Nru gcr-3.38.1/debian/patches/tests-collection-test-timeout.patch gcr-3.40.0/debian/patches/tests-collection-test-timeout.patch --- gcr-3.38.1/debian/patches/tests-collection-test-timeout.patch 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/patches/tests-collection-test-timeout.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -From: Emilio Pozuelo Monfort -Date: Sun, 5 Feb 2017 10:28:11 +0000 -Subject: Increase test-gnupg-collection timeout - -The timeout length in the current test is too low and can make the test -fail if the system is too slow or too loaded. This test correctly stops -waiting when a result is received, so the timeout will not actually be -reached unless there is a problem. - -[smcv: Expand commit message] -Bug: https://gitlab.gnome.org/GNOME/gcr/issues/29 -Bug-Debian: https://bugs.debian.org/846728 -Forwarded: https://gitlab.gnome.org/GNOME/gcr/-/merge_requests/23 -Signed-off-by: Simon McVittie ---- - gcr/test-gnupg-collection.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/gcr/test-gnupg-collection.c b/gcr/test-gnupg-collection.c -index e8b9cba..e65900a 100644 ---- a/gcr/test-gnupg-collection.c -+++ b/gcr/test-gnupg-collection.c -@@ -210,7 +210,7 @@ test_reload (Test *test, gconstpointer unused) - GcrGnupgKey *key; - - _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); -- egg_test_wait_until (2500); -+ egg_test_wait_until (500000); - g_assert (test->result); - _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); - g_assert_no_error (error); diff -Nru gcr-3.38.1/debian/rules gcr-3.40.0/debian/rules --- gcr-3.38.1/debian/rules 2021-02-04 13:36:13.000000000 +0000 +++ gcr-3.40.0/debian/rules 2021-09-09 00:08:30.000000000 +0000 @@ -1,16 +1,14 @@ #!/usr/bin/make -f export DEB_BUILD_MAINT_OPTIONS = hardening=+all -export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1 -Wl,-z,defs -Wl,--as-needed +export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1 -Wl,-z,defs # Filter out that flag for Ubuntu, it's default there but fails the build # https://gitlab.gnome.org/GNOME/gcr/issues/43 export DEB_LDFLAGS_MAINT_STRIP = -Wl,-Bsymbolic-functions -CHECK_HOME = $(CURDIR)/debian/tmp/home - %: - dh $@ --buildsystem=meson --without autoreconf + dh $@ override_dh_auto_configure: dh_auto_configure -- \ @@ -19,24 +17,8 @@ -Dgtk=true override_dh_auto_test: -ifeq (, $(filter nocheck, $(DEB_BUILD_OPTIONS))) - mkdir -p -m0700 $(CHECK_HOME) # Disable fakeroot as this confuses some of the tests - env -u LD_PRELOAD XDG_RUNTIME_DIR=$(CHECK_HOME) dbus-run-session -- dh_auto_test -endif - -override_dh_install: - find debian/tmp -name '*.la' -print -delete - # Old compatibility library no longer needed - find debian/tmp -name 'libgcr-3.so*' -print -delete - dh_install - -override_dh_missing: - dh_missing --fail-missing + env -u LD_PRELOAD dbus-run-session -- dh_auto_test override_dh_makeshlibs: dh_makeshlibs -- -c4 - -override_dh_clean: - rm -rf $(CHECK_HOME) - dh_clean diff -Nru gcr-3.38.1/docs/reference/gck/Makefile.am gcr-3.40.0/docs/reference/gck/Makefile.am --- gcr-3.38.1/docs/reference/gck/Makefile.am 2021-01-12 22:55:54.638056000 +0000 +++ gcr-3.40.0/docs/reference/gck/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -## Process this file with automake to produce Makefile.in - -# We require automake 1.6 at least. -AUTOMAKE_OPTIONS = 1.6 - -# The name of the module, e.g. 'glib'. -DOC_MODULE=gck - -# Uncomment for versioned docs and specify the version of the module, e.g. '2'. -#DOC_MODULE_VERSION=2 - - -# The top-level SGML file. You can change this if you want to. -DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml - -# The directory containing the source code. Relative to $(srcdir). -# gtk-doc will search all .c & .h files beneath here for inline comments -# documenting the functions and macros. -# e.g. DOC_SOURCE_DIR=../../../gtk -DOC_SOURCE_DIR=$(top_srcdir)/gck $(top_builddir)/gck - -# Extra options to pass to gtkdoc-scangobj. Not normally needed. -SCANGOBJ_OPTIONS= - -# Extra options to supply to gtkdoc-scan. -# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" -SCAN_OPTIONS=--deprecated-guards="GCK_DISABLE_DEPRECATED" - -# Extra options to supply to gtkdoc-mkdb. -# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml -MKDB_OPTIONS=--sgml-mode --output-format=xml - -# Extra options to supply to gtkdoc-mktmpl -# e.g. MKTMPL_OPTIONS=--only-section-tmpl -MKTMPL_OPTIONS= - -# Extra options to supply to gtkdoc-mkhtml -MKHTML_OPTIONS= - -# Extra options to supply to gtkdoc-fixref. Not normally needed. -# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html -FIXXREF_OPTIONS= - -# Used for dependencies. The docs will be rebuilt if any of these change. -# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h -# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c -HFILE_GLOB=$(top_srcdir)/$(DOC_MODULE)/*.h -CFILE_GLOB=$(top_srcdir)/$(DOC_MODULE)/*.c - -# Extra header to include when scanning, which are not under DOC_SOURCE_DIR -# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h -EXTRA_HFILES= - -# Header files to ignore when scanning. Use base file name, no paths -# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h -IGNORE_HFILES= \ - gck-private.h \ - test-suite.h \ - gck-mock.h \ - gck-test.h \ - pkcs11-trust-assertions.h \ - pkcs11.h \ - pkcs11n.h \ - pkcs11x.h \ - pkcs11i.h - -# Images to copy into HTML directory. -# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png -HTML_IMAGES= - -# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). -# e.g. content_files=running.sgml building.sgml changes-2.0.sgml -content_files= \ - gck-pkcs11-links.xml - -# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded -# These files must be listed here *and* in content_files -# e.g. expand_content_files=running.sgml -expand_content_files= - -# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. -# Only needed if you are using gtkdoc-scangobj to dynamically query widget -# signals and properties. -# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) -# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) -GTKDOC_CFLAGS= -I$(top_srcdir) -I$(top_builddir) $(GLIB_CFLAGS) -Wno-error \ - -Wno-deprecated-declarations -GTKDOC_LIBS= $(GLIB_LIBS) \ - $(top_builddir)/lib$(DOC_MODULE)-@GCK_MAJOR@.la - -# This includes the standard gtk-doc make rules, copied by gtkdocize. -include $(top_srcdir)/gtk-doc.make - -# Other files to distribute -# e.g. EXTRA_DIST += version.xml.in -EXTRA_DIST += - -# Files not to distribute -# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types -# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt -DISTCLEANFILES = tmpl/gck-unused.sgml - -# Comment this out if you want your docs-status tested during 'make check' -#TESTS_ENVIRONMENT = cd $(srcsrc) -#TESTS = $(GTKDOC_CHECK) diff -Nru gcr-3.38.1/docs/reference/gcr/Makefile.am gcr-3.40.0/docs/reference/gcr/Makefile.am --- gcr-3.38.1/docs/reference/gcr/Makefile.am 2021-01-12 22:55:54.638056000 +0000 +++ gcr-3.40.0/docs/reference/gcr/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ -## Process this file with automake to produce Makefile.in - -# We require automake 1.6 at least. -AUTOMAKE_OPTIONS = 1.6 - -# This is a blank Makefile.am for using gtk-doc. -# Copy this to your project's API docs directory and modify the variables to -# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples -# of using the various options. - -# The name the module, e.g. 'glib'. -DOC_MODULE=gcr - -# Uncomment for versioned docs and specify the version of the module, e.g. '2'. -DOC_MODULE_VERSION=@GCR_MAJOR@ - -# The top-level SGML file. You can change this if you want to. -DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml - -# The directory containing the source code. Relative to $(srcdir). -# gtk-doc will search all .c & .h files beneath here for inline comments -# documenting the functions and macros. -# e.g. DOC_SOURCE_DIR=../../../gtk -DOC_SOURCE_DIR=$(top_srcdir)/$(DOC_MODULE) $(top_srcdir)/ui $(top_builddir)/$(DOC_MODULE) $(top_builddir)/ui - -# Extra options to pass to gtkdoc-scangobj. Not normally needed. -SCANGOBJ_OPTIONS= - -# Extra options to supply to gtkdoc-scan. -# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" -SCAN_OPTIONS=--deprecated-guards="GCR_DISABLE_DEPRECATED" - -# Extra options to supply to gtkdoc-mkdb. -# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml -MKDB_OPTIONS=--sgml-mode --output-format=xml - -# Extra options to supply to gtkdoc-mktmpl -# e.g. MKTMPL_OPTIONS=--only-section-tmpl -MKTMPL_OPTIONS= - -# Extra options to supply to gtkdoc-mkhtml -MKHTML_OPTIONS= - -# Extra options to supply to gtkdoc-fixref. Not normally needed. -# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html -FIXXREF_OPTIONS= - -# Used for dependencies. The docs will be rebuilt if any of these change. -# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h -# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c -HFILE_GLOB=$(top_srcdir)/gcr/*.h $(top_srcdir)/ui/*.h -CFILE_GLOB=$(top_srcdir)/gcr/*.c $(top_srcdir)/ui/*.c - -# Extra header to include when scanning, which are not under DOC_SOURCE_DIR -# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h -EXTRA_HFILES=$(top_srcdir)/ui/*.h - -# Header files to ignore when scanning. Use base file name, no paths -# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h -IGNORE_HFILES= \ - console-interaction.h \ - eggimagemenuitem.h \ - gcr-callback-output-stream.h \ - gcr-certificate-exporter.h \ - gcr-certificate-basics-widget.h \ - gcr-certificate-details-widget.h \ - gcr-certificate-request-renderer.h \ - gcr-dbus-constants.h \ - gcr-dbus-generated.h \ - gcr-deprecated.h \ - gcr-deprecated-base.h \ - gcr-display-scrolled.h \ - gcr-display-view.h \ - gcr-failure-renderer.h \ - gcr-gnupg-importer.h \ - gcr-gnupg-renderer.h \ - gcr-icons.h \ - gcr-import-dialog.h \ - gcr-internal.h \ - gcr-live-search.h \ - gcr-marshal.h \ - gcr-menu-button.h \ - gcr-oids.h \ - gcr-openpgp.h \ - gcr-pkcs11-importer.h \ - gcr-pkcs11-import-interaction.h \ - gcr-pkcs11-import-dialog.h \ - gcr-pkcs11-renderer.h \ - gcr-record.h \ - gcr-single-collection.h \ - gcr-unlock-renderer.h \ - gcr-viewer-window.h \ - gcr-xxx.h \ - gcr-zzz.h - -# Images to copy into HTML directory. -# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png -HTML_IMAGES= \ - $(srcdir)/images/certificate-widget.png \ - $(srcdir)/images/combo-selector.png \ - $(srcdir)/images/import-button.png \ - $(srcdir)/images/list-selector.png \ - $(srcdir)/images/key-widget.png \ - $(srcdir)/images/tree-selector.png \ - $(srcdir)/images/viewer-widget.png - -# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). -# e.g. content_files=running.sgml building.sgml changes-2.0.sgml -content_files=gcr-visual-index.xml - -# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded -# These files must be listed here *and* in content_files -# e.g. expand_content_files=running.sgml -expand_content_files= - -# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. -# Only needed if you are using gtkdoc-scangobj to dynamically query widget -# signals and properties. -# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) -# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) -GTKDOC_CFLAGS= -I$(top_srcdir) -I$(top_builddir) $(GLIB_CFLAGS) -Wno-error \ - -Wno-deprecated-declarations -GTKDOC_LIBS= $(GLIB_LIBS) \ - $(top_builddir)/libgcr-ui-@GCR_MAJOR@.la \ - $(top_builddir)/libgcr-base-@GCR_MAJOR@.la \ - $(top_builddir)/libgck-@GCK_MAJOR@.la - -# This includes the standard gtk-doc make rules, copied by gtkdocize. -include $(top_srcdir)/gtk-doc.make - -# Other files to distribute -# e.g. EXTRA_DIST += version.xml.in -# EXTRA_DIST += - -# Files not to distribute -# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types -# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt -DISTCLEANFILES = tmpl/gcr-unused.sgml - -# Comment this out if you want your docs-status tested during 'make check' -#TESTS_ENVIRONMENT = cd $(srcsrc) -#TESTS = $(GTKDOC_CHECK) - -# ------------------------------------------------------------------------------ -# SHOOTER - -WIDGETS = \ - certificate-widget \ - combo-selector \ - import-button \ - key-widget \ - list-selector \ - tree-selector \ - viewer-widget - -shots: gcr-shooter - mkdir -p $(builddir)/images - for widget in $(WIDGETS); do ./gcr-shooter $$widget $(builddir)/images; done - -SHOOTER_SRCS = \ - gcr-shooter.c \ - gcr-widgets.c - -SHOOTER_HEADS = \ - gcr-shooter.h - -gcr-shooter: $(SHOOTER_SRCS) $(SHOOTER_HEADERS) Makefile - $(AM_V_CC) libtool --mode=link gcc -o gcr-shooter -Wall -Werror $(GTK_CFLAGS) \ - -I$(top_srcdir)/gcr -DGCR_API_SUBJECT_TO_CHANGE \ - -DSRCDIR=\"$(srcdir)\" -DTOPDIR=\"$(top_srcdir)\" \ - `pkg-config x11 xext --cflags --libs` \ - $(GTK_LDFLAGS) -lm $(top_builddir)/ui/libgcr-ui-@GCR_MAJOR@.la \ - $(SHOOTER_SRCS) - -EXTRA_DIST += $(SHOOTER_SRCS) \ - $(SHOOTER_HEADERS) \ - images diff -Nru gcr-3.38.1/egg/egg-testing.h gcr-3.40.0/egg/egg-testing.h --- gcr-3.38.1/egg/egg-testing.h 2021-01-12 22:55:54.643056200 +0000 +++ gcr-3.40.0/egg/egg-testing.h 2021-03-27 08:40:56.303531400 +0000 @@ -61,4 +61,17 @@ gint egg_tests_run_with_loop (void); +/* It's possible that a GTask that has been called with g_task_run_in_thread() + * still has a reference held by that thread after the _finish() function has + * been called. This is a little problematic for tests that check for the + * final reference, so use this as a workaround instead. + * + * See https://gitlab.gnome.org/GNOME/glib/-/issues/1346 for more info + */ +#define egg_test_wait_for_gtask_thread(expr) G_STMT_START \ + while (expr) { \ + g_main_context_iteration (NULL, FALSE); \ + } \ + G_STMT_END + #endif /* EGG_DH_H_ */ diff -Nru gcr-3.38.1/egg/Makefile.am gcr-3.40.0/egg/Makefile.am --- gcr-3.38.1/egg/Makefile.am 2021-01-12 22:55:54.640056100 +0000 +++ gcr-3.40.0/egg/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,152 +0,0 @@ -# included in top-level Makefile.am - -noinst_LTLIBRARIES += \ - libegg.la \ - libegg-asn1x.la \ - libegg-hex.la \ - libegg-secmem.la \ - libegg-test.la - -libegg_la_CFLAGS = \ - $(GLIB_CFLAGS) \ - $(LIBGCRYPT_CFLAGS) - -libegg_la_LIBADD = \ - $(GLIB_LIBS) \ - $(LIBGCRYPT_LIBS) - -libegg_la_SOURCES = \ - egg/egg-armor.c egg/egg-armor.h \ - egg/egg-asn1x.c egg/egg-asn1x.h \ - egg/egg-asn1-defs.c egg/egg-asn1-defs.h \ - egg/egg-buffer.c egg/egg-buffer.h \ - egg/egg-dh.c egg/egg-dh.h \ - egg/egg-dn.c egg/egg-dn.h \ - egg/egg-error.h \ - egg/egg-decimal.c egg/egg-decimal.h \ - egg/egg-hex.c egg/egg-hex.h \ - egg/egg-hkdf.c egg/egg-hkdf.h \ - egg/egg-libgcrypt.c egg/egg-libgcrypt.h \ - egg/egg-oid.c egg/egg-oid.h \ - egg/egg-padding.c egg/egg-padding.h \ - egg/egg-openssl.c egg/egg-openssl.h \ - egg/egg-secure-memory.c egg/egg-secure-memory.h \ - egg/egg-symkey.c egg/egg-symkey.h \ - egg/egg-testing.c egg/egg-testing.h \ - egg/egg-timegm.c egg/egg-timegm.h \ - egg/pk.asn.h egg/pkix.asn.h \ - $(NULL) - -# -------------------------------------------------------------------- -# COMMON STUFF COMPILED INTO SMALLER COMPONENTS - -libegg_asn1x_la_SOURCES = \ - egg/egg-asn1x.c egg/egg-asn1x.h - -libegg_asn1x_la_CFLAGS = \ - $(GLIB_CFLAGS) - -libegg_hex_la_SOURCES = \ - egg/egg-hex.c egg/egg-hex.h - -libegg_hex_la_CFLAGS = \ - $(GLIB_CFLAGS) - -libegg_hex_la_LIBADD = \ - $(GLIB_LIBS) - -libegg_secmem_la_SOURCES = \ - egg/egg-secure-memory.c egg/egg-secure-memory.h - -libegg_test_la_SOURCES = \ - egg/egg-testing.c egg/egg-testing.h \ - egg/mock-interaction.c egg/mock-interaction.h - -libegg_test_la_CFLAGS = \ - $(GLIB_CFLAGS) - -libegg_test_la_LIBADD = \ - $(GLIB_LIBS) - -# ------------------------------------------------------------------- - -egg_LDADD = \ - libegg.la \ - $(LIBGCRYPT_LIBS) \ - $(GLIB_LIBS) - -egg_TESTS = \ - test-asn1 \ - test-asn1x \ - test-dn \ - test-decimal \ - test-hex \ - test-hkdf \ - test-oid \ - test-secmem \ - test-padding \ - test-symkey \ - test-armor \ - test-openssl \ - test-dh - -test_armor_SOURCES = egg/test-armor.c -test_armor_LDADD = $(egg_LDADD) - -test_asn1_SOURCES = egg/test-asn1.c egg/test.asn.h -test_asn1_LDADD = $(egg_LDADD) - -test_asn1x_SOURCES = egg/test-asn1x.c -test_asn1x_LDADD = $(egg_LDADD) - -test_decimal_SOURCES = egg/test-decimal.c -test_decimal_LDADD = $(egg_LDADD) - -test_dh_SOURCES = egg/test-dh.c -test_dh_LDADD = $(egg_LDADD) - -test_dn_SOURCES = egg/test-dn.c -test_dn_LDADD = $(egg_LDADD) - -test_hex_SOURCES = egg/test-hex.c -test_hex_LDADD = $(egg_LDADD) - -test_hkdf_SOURCES = egg/test-hkdf.c -test_hkdf_LDADD = $(egg_LDADD) - -test_oid_SOURCES = egg/test-oid.c -test_oid_LDADD = $(egg_LDADD) - -test_openssl_SOURCES = egg/test-openssl.c -test_openssl_LDADD = $(egg_LDADD) - -test_padding_SOURCES = egg/test-padding.c -test_padding_LDADD = $(egg_LDADD) - -test_secmem_SOURCES = egg/test-secmem.c -test_secmem_LDADD = $(egg_LDADD) - -test_symkey_SOURCES = egg/test-symkey.c -test_symkey_LDADD = $(egg_LDADD) - -check_PROGRAMS += $(egg_TESTS) -TESTS += $(egg_TESTS) - -ASN_SRCS = \ - egg/pk.asn \ - egg/pkix.asn \ - egg/test.asn \ - $(NULL) - -asn: - for asn in $(ASN_SRCS); do \ - asn1Parser -o $(srcdir)/$$asn.h.tmp $(srcdir)/$$asn && \ - sed 's|#include.*|/* \0 */|' < $(srcdir)/$$asn.h.tmp > $(srcdir)/$$asn.h.tmp2 && \ - mv $(srcdir)/$$asn.h.tmp2 $(srcdir)/$$asn.h && \ - rm -f $(srcdir)/$$asn.h.tmp $(srcdir)/$$asn.h.tmp2; \ - done - -EXTRA_DIST += \ - egg/fixtures \ - $(ASN_SRCS) \ - $(NULL) diff -Nru gcr-3.38.1/gck/gck-call.c gcr-3.40.0/gck/gck-call.c --- gcr-3.38.1/gck/gck-call.c 2021-01-12 22:55:54.647056000 +0000 +++ gcr-3.40.0/gck/gck-call.c 2021-03-27 08:40:56.310531400 +0000 @@ -2,6 +2,7 @@ /* gck-call.c - the GObject PKCS#11 wrapper library Copyright (C) 2008, Stefan Walter + Copyright (C) 2020, Marco Trevisan The Gnome Keyring Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -26,39 +27,19 @@ #include -typedef struct _GckCallSource GckCallSource; - -static gpointer _gck_call_parent_class = NULL; - struct _GckCall { GObject parent; + GTask *task; GckModule *module; /* For making the call */ GckPerformFunc perform; GckCompleteFunc complete; GckArguments *args; - GCancellable *cancellable; GDestroyNotify destroy; - CK_RV rv; - - /* For result callback only */ - gpointer object; - GAsyncReadyCallback callback; - gpointer user_data; }; -struct _GckCallClass { - GObjectClass parent; - GThreadPool *thread_pool; - GAsyncQueue *completed_queue; - guint completed_id; -}; - -struct _GckCallSource { - GSource source; - GckCallClass *klass; -}; +G_DEFINE_TYPE (GckCall, _gck_call, G_TYPE_OBJECT) /* ---------------------------------------------------------------------------- * HELPER FUNCTIONS @@ -106,111 +87,54 @@ return (func) (args, result); } - -static void -process_async_call (gpointer data, GckCallClass *klass) +static CK_RV +perform_call_chain (GckPerformFunc perform, GckCompleteFunc complete, + GCancellable *cancellable, GckArguments *args) { - GckCall *call = GCK_CALL (data); - - g_assert (GCK_IS_CALL (call)); - - call->rv = perform_call (call->perform, call->cancellable, call->args); + CK_RV rv; - g_async_queue_push (klass->completed_queue, call); + do { + rv = perform_call (perform, cancellable, args); + if (rv == CKR_FUNCTION_CANCELED) + break; + } while (!complete_call (complete, args, rv)); - /* Wakeup main thread if on a separate thread */ - g_main_context_wakeup (NULL); + return rv; } -static void -process_result (GckCall *call, gpointer unused) -{ - gboolean stop = FALSE; - /* Double check a few things */ - g_assert (GCK_IS_CALL (call)); - - if (call->cancellable) { - /* Don't call the callback when cancelled */ - if (g_cancellable_is_cancelled (call->cancellable)) { - call->rv = CKR_FUNCTION_CANCELED; - stop = TRUE; - } - } - - /* - * Hmmm, does the function want to actually be done? - * If not, then queue this call again. - */ - if (!stop && !complete_call (call->complete, call->args, call->rv)) { - g_object_ref (call); - g_thread_pool_push (GCK_CALL_GET_CLASS (call)->thread_pool, call, NULL); - - /* All done, finish processing */ - } else if (call->callback) { - (call->callback) (call->object, G_ASYNC_RESULT (call), - call->user_data); - } -} - -static gboolean -process_completed (GckCallClass *klass) +static void +_gck_task_return (GTask *task, CK_RV rv) { - gpointer call; - - g_assert (klass->completed_queue); - - call = g_async_queue_try_pop (klass->completed_queue); - if (call) { - process_result (call, NULL); - g_object_unref (call); - return TRUE; + if (rv == CKR_OK) { + g_task_return_boolean (task, TRUE); + } else if (rv == CKR_FUNCTION_CANCELED) { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, + "Gck function call cancelled"); + } else { + g_task_return_new_error (task, GCK_ERROR, rv, "%s", + gck_message_from_rv (rv)); } - - return FALSE; } -static gboolean -completed_prepare(GSource* base, gint *timeout) -{ - GckCallSource *source = (GckCallSource*)base; - gboolean have; - - g_assert (source->klass->completed_queue); - have = g_async_queue_length (source->klass->completed_queue) > 0; - *timeout = have ? 0 : -1; - return have; -} - -static gboolean -completed_check(GSource* base) +static void +_gck_call_thread_func (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) { - GckCallSource *source = (GckCallSource*)base; - g_assert (source->klass->completed_queue); - return g_async_queue_length (source->klass->completed_queue) > 0; -} + GckCall *call = task_data; + CK_RV rv; -static gboolean -completed_dispatch(GSource* base, GSourceFunc callback, gpointer user_data) -{ - GckCallSource *source = (GckCallSource*)base; - process_completed (source->klass); - return TRUE; -} + /* Double check a few things */ + g_assert (GCK_IS_CALL (call)); -static void -completed_finalize(GSource* base) -{ + rv = perform_call_chain (call->perform, call->complete, cancellable, + call->args); + _gck_task_return (task, rv); } -static GSourceFuncs completed_functions = { - completed_prepare, - completed_check, - completed_dispatch, - completed_finalize -}; - /* ---------------------------------------------------------------------------- * OBJECT */ @@ -218,7 +142,6 @@ static void _gck_call_init (GckCall *call) { - call->rv = CKR_OK; } static void @@ -230,13 +153,7 @@ g_object_unref (call->module); call->module = NULL; - if (call->object) - g_object_unref (call->object); - call->object = NULL; - - if (call->cancellable) - g_object_unref (call->cancellable); - call->cancellable = NULL; + g_clear_object (&call->task); if (call->destroy) (call->destroy) (call->args); @@ -246,129 +163,14 @@ G_OBJECT_CLASS (_gck_call_parent_class)->finalize (obj); } -static gpointer -_gck_call_get_user_data (GAsyncResult *async_result) -{ - g_return_val_if_fail (GCK_IS_CALL (async_result), NULL); - return GCK_CALL (async_result)->user_data; -} - -static GObject* -_gck_call_get_source_object (GAsyncResult *async_result) -{ - GObject *source; - - g_return_val_if_fail (GCK_IS_CALL (async_result), NULL); - - source = GCK_CALL (async_result)->object; - return source ? g_object_ref (source): NULL; -} - -static void -_gck_call_implement_async_result (GAsyncResultIface *iface) -{ - iface->get_user_data = _gck_call_get_user_data; - iface->get_source_object = _gck_call_get_source_object; -} - static void _gck_call_class_init (GckCallClass *klass) { GObjectClass *gobject_class = (GObjectClass*)klass; - _gck_call_parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = _gck_call_finalize; } -static void -_gck_call_base_init (GckCallClass *klass) -{ - GckCallSource *source; - GMainContext *context; - GError *err = NULL; - - klass->thread_pool = g_thread_pool_new ((GFunc)process_async_call, klass, 16, FALSE, &err); - if (!klass->thread_pool) { - g_critical ("couldn't create thread pool: %s", - err && err->message ? err->message : ""); - return; - } - - klass->completed_queue = g_async_queue_new_full (g_object_unref); - g_assert (klass->completed_queue); - - context = g_main_context_default (); - g_assert (context); - - /* Add our idle handler which processes other tasks */ - source = (GckCallSource*)g_source_new (&completed_functions, sizeof (GckCallSource)); - source->klass = klass; - klass->completed_id = g_source_attach ((GSource*)source, context); - g_source_set_callback ((GSource*)source, NULL, NULL, NULL); - g_source_unref ((GSource*)source); -} - -static void -_gck_call_base_finalize (GckCallClass *klass) -{ - GMainContext *context; - GSource *src; - - if (klass->thread_pool) { - g_assert (g_thread_pool_unprocessed (klass->thread_pool) == 0); - g_thread_pool_free (klass->thread_pool, FALSE, TRUE); - klass->thread_pool = NULL; - } - - if (klass->completed_id) { - context = g_main_context_default (); - g_return_if_fail (context); - - src = g_main_context_find_source_by_id (context, klass->completed_id); - g_assert (src); - g_source_destroy (src); - klass->completed_id = 0; - } - - if (klass->completed_queue) { - g_assert (g_async_queue_length (klass->completed_queue)); - g_async_queue_unref (klass->completed_queue); - klass->completed_queue = NULL; - } -} - -GType -_gck_call_get_type (void) -{ - static volatile gsize type_id__volatile = 0; - - if (g_once_init_enter (&type_id__volatile)) { - - static const GTypeInfo type_info = { - sizeof (GckCallClass), - (GBaseInitFunc)_gck_call_base_init, - (GBaseFinalizeFunc)_gck_call_base_finalize, - (GClassInitFunc)_gck_call_class_init, - (GClassFinalizeFunc)NULL, - NULL, // class_data - sizeof (GckCall), - 0, // n_preallocs - (GInstanceInitFunc)_gck_call_init, - }; - - static const GInterfaceInfo interface_info = { - (GInterfaceInitFunc)_gck_call_implement_async_result - }; - - GType type_id = g_type_register_static (G_TYPE_OBJECT, "_GckCall", &type_info, 0); - g_type_add_interface_static (type_id, G_TYPE_ASYNC_RESULT, &interface_info); - - g_once_init_leave (&type_id__volatile, type_id); - } - - return type_id__volatile; -} - /* ---------------------------------------------------------------------------- * PUBLIC */ @@ -400,12 +202,7 @@ g_assert (args->pkcs11); } - do { - rv = perform_call (perform, cancellable, args); - if (rv == CKR_FUNCTION_CANCELED) - break; - - } while (!complete_call (complete, args, rv)); + rv = perform_call_chain (perform, complete, cancellable, args); if (module) g_object_unref (module); @@ -417,15 +214,14 @@ return FALSE; } -gpointer -_gck_call_async_prep (gpointer object, gpointer cb_object, gpointer perform, - gpointer complete, gsize args_size, gpointer destroy) +GckCall* +_gck_call_async_prep (gpointer object, gpointer perform, gpointer complete, + gsize args_size, gpointer destroy) { GckArguments *args; GckCall *call; g_assert (!object || G_IS_OBJECT (object)); - g_assert (!cb_object || G_IS_OBJECT (cb_object)); g_assert (perform); if (!destroy) @@ -440,17 +236,15 @@ call->destroy = (GDestroyNotify)destroy; call->perform = (GckPerformFunc)perform; call->complete = (GckCompleteFunc)complete; - call->object = cb_object ? g_object_ref (cb_object) : NULL; /* Hook the two together */ call->args = args; - call->args->call = call; /* Setup call object if available */ if (object != NULL) _gck_call_async_object (call, object); - return args; + return call; } void @@ -471,57 +265,53 @@ } GckCall* -_gck_call_async_ready (gpointer data, GCancellable *cancellable, - GAsyncReadyCallback callback, gpointer user_data) +_gck_call_async_ready (GckCall *call, gpointer cb_object, + GCancellable *cancellable, GAsyncReadyCallback callback, + gpointer user_data) { - GckArguments *args = (GckArguments*)data; - g_assert (GCK_IS_CALL (args->call)); + GTask* task; - args->call->cancellable = cancellable; - if (cancellable) { - g_assert (G_IS_CANCELLABLE (cancellable)); - g_object_ref (cancellable); - } + g_assert (GCK_IS_CALL (call)); + g_assert (call->args && "GckCall not prepared"); + g_assert (!cb_object || G_IS_OBJECT (cb_object)); + + g_object_ref (call); - args->call->callback = callback; - args->call->user_data = user_data; + task = g_task_new (cb_object, cancellable, callback, user_data); + g_task_set_task_data (task, call, g_object_unref); + g_set_object (&call->task, task); - return args->call; + g_object_unref (task); + g_object_unref (call); + + return call; } void _gck_call_async_go (GckCall *call) { g_assert (GCK_IS_CALL (call)); + g_assert (G_IS_TASK (call->task)); - /* To keep things balanced, process at one completed event */ - process_completed(GCK_CALL_GET_CLASS (call)); - - g_assert (GCK_CALL_GET_CLASS (call)->thread_pool); - g_thread_pool_push (GCK_CALL_GET_CLASS (call)->thread_pool, call, NULL); + g_task_run_in_thread (call->task, _gck_call_thread_func); + g_clear_object (&call->task); } void -_gck_call_async_ready_go (gpointer data, GCancellable *cancellable, - GAsyncReadyCallback callback, gpointer user_data) +_gck_call_async_ready_go (GckCall *call, gpointer cb_object, + GCancellable *cancellable, + GAsyncReadyCallback callback, gpointer user_data) { - GckCall *call = _gck_call_async_ready (data, cancellable, callback, user_data); + _gck_call_async_ready (call, cb_object, cancellable, callback, user_data); _gck_call_async_go (call); } gboolean _gck_call_basic_finish (GAsyncResult *result, GError **err) { - CK_RV rv; - - g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + g_return_val_if_fail (G_IS_TASK (result), FALSE); - rv = GCK_CALL (result)->rv; - if (rv == CKR_OK) - return TRUE; - - g_set_error (err, GCK_ERROR, rv, "%s", gck_message_from_rv (rv)); - return FALSE; + return g_task_propagate_boolean (G_TASK (result), err); } void @@ -529,11 +319,10 @@ { g_assert (GCK_IS_CALL (call)); - call->rv = rv; - /* Already complete, so just push it for processing in main loop */ - g_assert (GCK_CALL_GET_CLASS (call)->completed_queue); - g_async_queue_push (GCK_CALL_GET_CLASS (call)->completed_queue, call); + _gck_task_return (call->task, rv); + g_clear_object (&call->task); + g_main_context_wakeup (NULL); } diff -Nru gcr-3.38.1/gck/gck-enumerator.c gcr-3.40.0/gck/gck-enumerator.c --- gcr-3.38.1/gck/gck-enumerator.c 2021-01-12 22:55:54.647056000 +0000 +++ gcr-3.40.0/gck/gck-enumerator.c 2021-03-27 08:40:56.311531300 +0000 @@ -1296,6 +1296,7 @@ { GckEnumeratorState *state; EnumerateNext *args; + GckCall *call; g_return_if_fail (GCK_IS_ENUMERATOR (self)); g_return_if_fail (max_objects == -1 || max_objects > 0); @@ -1306,12 +1307,13 @@ state = check_out_enumerator_state (self); g_return_if_fail (state != NULL); - args = _gck_call_async_prep (NULL, self, perform_enumerate_next, NULL, - sizeof (*args), free_enumerate_next); + call = _gck_call_async_prep (NULL, perform_enumerate_next, NULL, + sizeof (*args), free_enumerate_next); + args = _gck_call_get_arguments (call); args->want_objects = max_objects <= 0 ? G_MAXINT : max_objects; args->state = state; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); g_object_unref (self); } @@ -1339,7 +1341,7 @@ g_object_ref (self); - args = _gck_call_arguments (result, EnumerateNext); + args = _gck_call_async_result_arguments (result, EnumerateNext); state = args->state; args->state = NULL; want_objects = args->want_objects; diff -Nru gcr-3.38.1/gck/gck-module.c gcr-3.40.0/gck/gck-module.c --- gcr-3.38.1/gck/gck-module.c 2021-01-12 22:55:54.648056000 +0000 +++ gcr-3.40.0/gck/gck-module.c 2021-03-27 08:40:56.312531200 +0000 @@ -417,14 +417,16 @@ gpointer user_data) { Initialize *args; + GckCall *call; g_return_if_fail (path != NULL); - args = _gck_call_async_prep (NULL, NULL, perform_initialize, NULL, + call = _gck_call_async_prep (NULL, perform_initialize, NULL, sizeof (*args), free_initialize); + args = _gck_call_get_arguments (call); args->path = g_strdup (path); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, NULL, cancellable, callback, user_data); } /** @@ -443,7 +445,7 @@ GckModule *module = NULL; Initialize *args; - args = _gck_call_arguments (result, Initialize); + args = _gck_call_async_result_arguments (result, Initialize); if (_gck_call_basic_finish (result, error)) { module = args->result; args->result = NULL; diff -Nru gcr-3.38.1/gck/gck-modules.c gcr-3.40.0/gck/gck-modules.c --- gcr-3.38.1/gck/gck-modules.c 2021-01-12 22:55:54.648056000 +0000 +++ gcr-3.40.0/gck/gck-modules.c 2021-03-27 08:40:56.312531200 +0000 @@ -121,12 +121,12 @@ GAsyncReadyCallback callback, gpointer user_data) { - InitializeRegistered *args; + GckCall *call; - args = _gck_call_async_prep (NULL, NULL, perform_initialize_registered, NULL, - sizeof (*args), free_initialize_registered); + call = _gck_call_async_prep (NULL, perform_initialize_registered, NULL, + sizeof (InitializeRegistered), free_initialize_registered); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, NULL, cancellable, callback, user_data); } /** @@ -147,7 +147,7 @@ GList *modules = NULL; InitializeRegistered *args; - args = _gck_call_arguments (result, InitializeRegistered); + args = _gck_call_async_result_arguments (result, InitializeRegistered); if (_gck_call_basic_finish (result, error)) { modules = args->results; args->results = NULL; diff -Nru gcr-3.38.1/gck/gck-object.c gcr-3.40.0/gck/gck-object.c --- gcr-3.38.1/gck/gck-object.c 2021-01-12 22:55:54.649056200 +0000 +++ gcr-3.40.0/gck/gck-object.c 2021-03-27 08:40:56.313531200 +0000 @@ -438,15 +438,17 @@ gck_object_destroy_async (GckObject *self, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; Destroy* args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (GCK_IS_SESSION (self->pv->session)); - args = _gck_call_async_prep (self->pv->session, self, perform_destroy, NULL, sizeof (*args), NULL); + call = _gck_call_async_prep (self->pv->session, perform_destroy, NULL, sizeof (*args), NULL); + args = _gck_call_get_arguments (call); args->object = self->pv->handle; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -464,7 +466,7 @@ gck_object_destroy_finish (GckObject *self, GAsyncResult *result, GError **error) { g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); - g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + g_return_val_if_fail (G_IS_TASK (result), FALSE); return _gck_call_basic_finish (result, error); } @@ -553,18 +555,20 @@ gck_object_set_async (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; SetAttributes *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs != NULL); - args = _gck_call_async_prep (self->pv->session, self, perform_set_attributes, + call = _gck_call_async_prep (self->pv->session, perform_set_attributes, NULL, sizeof (*args), free_set_attributes); + args = _gck_call_get_arguments (call); args->attrs = gck_attributes_ref_sink (attrs); args->object = self->pv->handle; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -584,11 +588,11 @@ SetAttributes *args; g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); - g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + g_return_val_if_fail (G_IS_TASK (result), FALSE); g_return_val_if_fail (!error || !*error, FALSE); /* Unlock the attributes we were using */ - args = _gck_call_arguments (result, SetAttributes); + args = _gck_call_async_result_arguments (result, SetAttributes); g_assert (args->attrs); return _gck_call_basic_finish (result, error); @@ -758,21 +762,23 @@ GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; GetAttributes *args; guint i; g_return_if_fail (GCK_IS_OBJECT (self)); - args = _gck_call_async_prep (self->pv->session, self, perform_get_attributes, + call = _gck_call_async_prep (self->pv->session, perform_get_attributes, NULL, sizeof (*args), free_get_attributes); + args = _gck_call_get_arguments (call); gck_builder_init (&args->builder); for (i = 0; i < n_attr_types; ++i) gck_builder_add_empty (&args->builder, attr_types[i]); args->object = self->pv->handle; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -795,10 +801,10 @@ GetAttributes *args; g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_CALL (result), NULL); + g_return_val_if_fail (G_IS_TASK (result), NULL); g_return_val_if_fail (!error || !*error, NULL); - args = _gck_call_arguments (result, GetAttributes); + args = _gck_call_async_result_arguments (result, GetAttributes); if (!_gck_call_basic_finish (result, error)) return NULL; @@ -960,6 +966,7 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; GetAttributeData *args; g_return_if_fail (GCK_IS_OBJECT (self)); @@ -967,14 +974,15 @@ if (!allocator) allocator = g_realloc; - args = _gck_call_async_prep (self->pv->session, self, perform_get_attribute_data, + call = _gck_call_async_prep (self->pv->session, perform_get_attribute_data, NULL, sizeof (*args), free_get_attribute_data); + args = _gck_call_get_arguments (call); args->allocator = allocator; args->object = self->pv->handle; args->type = attr_type; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1001,14 +1009,14 @@ guchar *data; g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_CALL (result), NULL); + g_return_val_if_fail (G_IS_TASK (result), NULL); g_return_val_if_fail (n_data, NULL); g_return_val_if_fail (!error || !*error, NULL); if (!_gck_call_basic_finish (result, error)) return NULL; - args = _gck_call_arguments (result, GetAttributeData); + args = _gck_call_async_result_arguments (result, GetAttributeData); *n_data = args->n_result; data = args->result; @@ -1114,19 +1122,21 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; set_template_args *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs); - args = _gck_call_async_prep (self->pv->session, self, perform_set_template, + call = _gck_call_async_prep (self->pv->session, perform_set_template, NULL, sizeof (*args), free_set_template); + args = _gck_call_get_arguments (call); args->attrs = gck_attributes_ref_sink (attrs); args->type = attr_type; args->object = self->pv->handle; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1146,11 +1156,11 @@ set_template_args *args; g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); - g_return_val_if_fail (GCK_IS_CALL (result), FALSE); + g_return_val_if_fail (G_IS_TASK (result), FALSE); g_return_val_if_fail (!error || !*error, FALSE); /* Unlock the attributes we were using */ - args = _gck_call_arguments (result, set_template_args); + args = _gck_call_async_result_arguments (result, set_template_args); g_assert (args->attrs); return _gck_call_basic_finish (result, error); @@ -1272,17 +1282,19 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; get_template_args *args; g_return_if_fail (GCK_IS_OBJECT (self)); - args = _gck_call_async_prep (self->pv->session, self, perform_get_template, + call = _gck_call_async_prep (self->pv->session, perform_get_template, NULL, sizeof (*args), free_get_template); + args = _gck_call_get_arguments (call); args->object = self->pv->handle; args->type = attr_type; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1304,12 +1316,12 @@ get_template_args *args; g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_CALL (result), NULL); + g_return_val_if_fail (G_IS_TASK (result), NULL); g_return_val_if_fail (!error || !*error, NULL); if (!_gck_call_basic_finish (result, error)) return NULL; - args = _gck_call_arguments (result, get_template_args); + args = _gck_call_async_result_arguments (result, get_template_args); return gck_attributes_ref_sink (gck_builder_end (&args->builder)); } diff -Nru gcr-3.38.1/gck/gck-object-cache.c gcr-3.40.0/gck/gck-object-cache.c --- gcr-3.38.1/gck/gck-object-cache.c 2021-01-12 22:55:54.648056000 +0000 +++ gcr-3.40.0/gck/gck-object-cache.c 2021-03-27 08:40:56.313531200 +0000 @@ -209,7 +209,7 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GTask *task = G_TASK (user_data); GckAttributes *attrs; GError *error = NULL; @@ -217,12 +217,12 @@ if (error == NULL) { gck_object_cache_fill (GCK_OBJECT_CACHE (source), attrs); gck_attributes_unref (attrs); + g_task_return_boolean (task, TRUE); } else { - g_simple_async_result_take_error (res, error); + g_task_return_error (task, g_steal_pointer (&error)); } - g_simple_async_result_complete (res); - g_object_unref (res); + g_clear_object (&task); } /** @@ -248,7 +248,7 @@ gpointer user_data) { GckObjectCacheIface *iface; - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); g_return_if_fail (attr_types != NULL || n_attr_types == 0); @@ -267,13 +267,13 @@ } } - res = g_simple_async_result_new (G_OBJECT (object), callback, user_data, - gck_object_cache_update_async); + task = g_task_new (object, cancellable, callback, user_data); + g_task_set_source_tag (task, gck_object_cache_update_async); gck_object_get_async (GCK_OBJECT (object), attr_types, n_attr_types, - cancellable, on_cache_object_get, g_object_ref (res)); + cancellable, on_cache_object_get, g_steal_pointer (&task)); - g_object_unref (res); + g_clear_object (&task); } /** @@ -293,14 +293,10 @@ GError **error) { g_return_val_if_fail (GCK_IS_OBJECT_CACHE (object), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (object), - gck_object_cache_update_async), FALSE); + g_return_val_if_fail (g_task_is_valid (result, object), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } static gboolean @@ -404,26 +400,27 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; - GckAttributes *attrs; - GckObjectCache *cache; - gboolean have; - g_return_if_fail (GCK_IS_OBJECT (object)); g_return_if_fail (attr_types != NULL || n_attr_types == 0); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); if (GCK_IS_OBJECT_CACHE (object)) { + GckObjectCache *cache; + GckAttributes *attrs; + gboolean have; + cache = GCK_OBJECT_CACHE (object); attrs = gck_object_cache_get_attributes (cache); have = check_have_attributes (attrs, attr_types, n_attr_types); gck_attributes_unref (attrs); if (have) { - res = g_simple_async_result_new (G_OBJECT (cache), callback, user_data, - gck_object_cache_lookup_async); - g_simple_async_result_complete_in_idle (res); - g_object_unref (res); + GTask *task; + + task = g_task_new (cache, cancellable, callback, user_data); + g_task_set_source_tag (task, gck_object_cache_lookup_async); + g_task_return_boolean (task, TRUE); + g_clear_object (&task); } else { gck_object_cache_update_async (cache, attr_types, n_attr_types, cancellable, callback, user_data); @@ -457,13 +454,11 @@ if (GCK_IS_OBJECT_CACHE (object)) { cache = GCK_OBJECT_CACHE (object); - if (!g_simple_async_result_is_valid (result, G_OBJECT (object), - gck_object_cache_lookup_async)) + if (!g_task_is_valid (result, object)) if (!gck_object_cache_update_finish (cache, result, error)) return NULL; return gck_object_cache_get_attributes (cache); - } else { - - return gck_object_get_finish (object, result, error); } + + return gck_object_get_finish (object, result, error); } diff -Nru gcr-3.38.1/gck/gck-private.h gcr-3.40.0/gck/gck-private.h --- gcr-3.38.1/gck/gck-private.h 2021-01-12 22:55:54.649056200 +0000 +++ gcr-3.40.0/gck/gck-private.h 2021-03-27 08:40:56.313531200 +0000 @@ -145,8 +145,6 @@ typedef struct _GckCall GckCall; typedef struct _GckArguments { - GckCall *call; - /* For the call function to use */ CK_FUNCTION_LIST_PTR pkcs11; CK_ULONG handle; @@ -155,20 +153,17 @@ #define GCK_MECHANISM_EMPTY { 0UL, NULL, 0 } -#define GCK_ARGUMENTS_INIT { NULL, NULL, 0 } +#define GCK_ARGUMENTS_INIT { NULL, 0 } -#define GCK_TYPE_CALL (_gck_call_get_type()) -#define GCK_CALL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_CALL, GckCall)) -#define GCK_CALL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_CALL, GckCall)) -#define GCK_IS_CALL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_CALL)) -#define GCK_IS_CALL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_CALL)) -#define GCK_CALL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_CALL, GckCallClass)) +G_DECLARE_FINAL_TYPE (GckCall, _gck_call, GCK, CALL, GObject) -typedef struct _GckCallClass GckCallClass; +#define GCK_TYPE_CALL (_gck_call_get_type()) -GType _gck_call_get_type (void) G_GNUC_CONST; +#define _gck_call_arguments(call, type) (type*) \ + (_gck_call_get_arguments (GCK_CALL (call))) -#define _gck_call_arguments(call, type) (type*)(_gck_call_get_arguments (GCK_CALL (call))) +#define _gck_call_async_result_arguments(task, type) \ + (type*)(_gck_call_get_arguments (g_task_get_task_data (G_TASK (task)))) gpointer _gck_call_get_arguments (GckCall *call); @@ -181,21 +176,22 @@ GCancellable *cancellable, GError **err); -gpointer _gck_call_async_prep (gpointer object, - gpointer cb_object, +GckCall* _gck_call_async_prep (gpointer object, gpointer perform, gpointer complete, gsize args_size, gpointer destroy_func); -GckCall* _gck_call_async_ready (gpointer args, +GckCall* _gck_call_async_ready (GckCall* call, + gpointer cb_object, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); void _gck_call_async_go (GckCall *call); -void _gck_call_async_ready_go (gpointer args, +void _gck_call_async_ready_go (GckCall *call, + gpointer cb_object, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); diff -Nru gcr-3.38.1/gck/gck-session.c gcr-3.40.0/gck/gck-session.c --- gcr-3.38.1/gck/gck-session.c 2021-01-12 22:55:54.649056200 +0000 +++ gcr-3.40.0/gck/gck-session.c 2021-03-27 08:40:56.314531300 +0000 @@ -478,13 +478,14 @@ g_object_ref (self); - args = _gck_call_async_prep (self->pv->slot, self, perform_open_session, NULL, + call = _gck_call_async_prep (self->pv->slot, perform_open_session, NULL, sizeof (*args), free_open_session); + args = _gck_call_get_arguments (call); want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; args->session = self->pv->handle; - call = _gck_call_async_ready (args, cancellable, callback, user_data); + _gck_call_async_ready (call, self, cancellable, callback, user_data); /* Already have a session setup? */ if (self->pv->handle && !want_login) { @@ -518,7 +519,7 @@ OpenSession *args; if (_gck_call_basic_finish (result, error)) { - args = _gck_call_arguments (result, OpenSession); + args = _gck_call_async_result_arguments (result, OpenSession); self->pv->handle = args->session; ret = TRUE; } @@ -954,12 +955,16 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - InitPin* args = _gck_call_async_prep (self, self, perform_init_pin, NULL, sizeof (*args), free_init_pin); + GckCall *call; + InitPin* args; + + call = _gck_call_async_prep (self, perform_init_pin, NULL, sizeof (*args), free_init_pin); + args = _gck_call_get_arguments (call); args->pin = pin && n_pin ? g_memdup (pin, n_pin) : NULL; args->n_pin = n_pin; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1055,14 +1060,18 @@ const guchar *new_pin, gsize n_new_pin, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - SetPin* args = _gck_call_async_prep (self, self, perform_set_pin, NULL, sizeof (*args), free_set_pin); + SetPin* args; + GckCall *call; + + call = _gck_call_async_prep (self, perform_set_pin, NULL, sizeof (*args), free_set_pin); + args = _gck_call_get_arguments (call); args->old_pin = old_pin && n_old_pin ? g_memdup (old_pin, n_old_pin) : NULL; args->n_old_pin = n_old_pin; args->new_pin = new_pin && n_new_pin ? g_memdup (new_pin, n_new_pin) : NULL; args->n_new_pin = n_new_pin; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1150,13 +1159,17 @@ gsize n_pin, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - Login* args = _gck_call_async_prep (self, self, perform_login, NULL, sizeof (*args), free_login); + Login* args; + GckCall *call; + + call = _gck_call_async_prep (self, perform_login, NULL, sizeof (*args), free_login); + args = _gck_call_get_arguments (call); args->user_type = user_type; args->pin = pin && n_pin ? g_memdup (pin, n_pin) : NULL; args->n_pin = n_pin; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1253,7 +1266,11 @@ GAsyncReadyCallback callback, gpointer user_data) { - Interactive* args = _gck_call_async_prep (self, self, perform_interactive, NULL, sizeof (*args), free_interactive); + Interactive* args; + GckCall *call; + + call = _gck_call_async_prep (self, perform_interactive, NULL, sizeof (*args), free_interactive); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); @@ -1266,7 +1283,7 @@ args->interaction = interaction ? g_object_ref (interaction) : NULL; args->token = g_object_ref (self->pv->slot); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1328,8 +1345,10 @@ gck_session_logout_async (GckSession *self, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckArguments *args = _gck_call_async_prep (self, self, perform_logout, NULL, 0, NULL); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + GckCall *call; + + call = _gck_call_async_prep (self, perform_logout, NULL, 0, NULL); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1442,14 +1461,18 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - CreateObject *args = _gck_call_async_prep (self, self, perform_create_object, - NULL, sizeof (*args), free_create_object); + GckCall *call; + CreateObject *args; + + call = _gck_call_async_prep (self, perform_create_object, + NULL, sizeof (*args), free_create_object); + args = _gck_call_get_arguments (call); g_return_if_fail (attrs); args->attrs = gck_attributes_ref_sink (attrs); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1467,7 +1490,7 @@ { CreateObject *args; - args = _gck_call_arguments (result, CreateObject); + args = _gck_call_async_result_arguments (result, CreateObject); if (!_gck_call_basic_finish (result, error)) return NULL; @@ -1618,16 +1641,18 @@ GAsyncReadyCallback callback, gpointer user_data) { + GckCall *call; FindObjects *args; g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (match != NULL); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - args = _gck_call_async_prep (self, self, perform_find_objects, + call = _gck_call_async_prep (self, perform_find_objects, NULL, sizeof (*args), free_find_objects); + args = _gck_call_get_arguments (call); args->attrs = gck_attributes_ref_sink (match); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1655,7 +1680,7 @@ g_return_val_if_fail (n_handles != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - args = _gck_call_arguments (result, FindObjects); + args = _gck_call_async_result_arguments (result, FindObjects); if (!_gck_call_basic_finish (result, error)) return NULL; @@ -1940,8 +1965,12 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GenerateKeyPair *args = _gck_call_async_prep (self, self, perform_generate_key_pair, - NULL, sizeof (*args), free_generate_key_pair); + GckCall *call; + GenerateKeyPair *args; + + call = _gck_call_async_prep (self, perform_generate_key_pair, + NULL, sizeof (*args), free_generate_key_pair); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (mechanism); @@ -1954,7 +1983,7 @@ args->public_attrs = gck_attributes_ref_sink (public_attrs); args->private_attrs = gck_attributes_ref_sink (private_attrs); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -1982,7 +2011,7 @@ g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - args = _gck_call_arguments (result, GenerateKeyPair); + args = _gck_call_async_result_arguments (result, GenerateKeyPair); if (!_gck_call_basic_finish (result, error)) return FALSE; @@ -2126,8 +2155,12 @@ GckObject *wrapped, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - WrapKey *args = _gck_call_async_prep (self, self, perform_wrap_key, - NULL, sizeof (*args), free_wrap_key); + GckCall *call; + WrapKey *args; + + call = _gck_call_async_prep (self, perform_wrap_key, + NULL, sizeof (*args), free_wrap_key); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (mechanism); @@ -2142,7 +2175,7 @@ g_object_get (wrapped, "handle", &args->wrapped, NULL); g_return_if_fail (args->wrapped != 0); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -2167,7 +2200,7 @@ g_return_val_if_fail (GCK_IS_SESSION (self), NULL); g_return_val_if_fail (n_result, NULL); - args = _gck_call_arguments (result, WrapKey); + args = _gck_call_async_result_arguments (result, WrapKey); if (!_gck_call_basic_finish (result, error)) return NULL; @@ -2334,8 +2367,12 @@ GAsyncReadyCallback callback, gpointer user_data) { - UnwrapKey *args = _gck_call_async_prep (self, self, perform_unwrap_key, - NULL, sizeof (*args), free_unwrap_key); + GckCall *call; + UnwrapKey *args; + + call = _gck_call_async_prep (self, perform_unwrap_key, + NULL, sizeof (*args), free_unwrap_key); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (GCK_IS_OBJECT (wrapper)); @@ -2351,7 +2388,7 @@ args->input = input; args->n_input = n_input; - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -2372,7 +2409,7 @@ g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - args = _gck_call_arguments (result, UnwrapKey); + args = _gck_call_async_result_arguments (result, UnwrapKey); if (!_gck_call_basic_finish (result, error)) return NULL; @@ -2506,8 +2543,12 @@ GckAttributes *attrs, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - DeriveKey *args = _gck_call_async_prep (self, self, perform_derive_key, - NULL, sizeof (*args), free_derive_key); + GckCall *call; + DeriveKey *args; + + call = _gck_call_async_prep (self, perform_derive_key, + NULL, sizeof (*args), free_derive_key); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (GCK_IS_OBJECT (base)); @@ -2521,7 +2562,7 @@ args->attrs = gck_attributes_ref_sink (attrs); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** @@ -2542,7 +2583,7 @@ g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - args = _gck_call_arguments (result, DeriveKey); + args = _gck_call_async_result_arguments (result, DeriveKey); if (!_gck_call_basic_finish (result, error)) return NULL; @@ -2674,7 +2715,11 @@ gsize n_input, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data, CK_C_EncryptInit init_func, CK_C_Encrypt complete_func) { - Crypt *args = _gck_call_async_prep (self, self, perform_crypt, NULL, sizeof (*args), free_crypt); + GckCall *call; + Crypt *args; + + call = _gck_call_async_prep (self, perform_crypt, NULL, sizeof (*args), free_crypt); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_OBJECT (key)); g_return_if_fail (mechanism); @@ -2696,7 +2741,7 @@ args->key_object = g_object_ref (key); args->interaction = gck_session_get_interaction (self); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } static guchar* @@ -2707,7 +2752,7 @@ if (!_gck_call_basic_finish (result, error)) return NULL; - args = _gck_call_arguments (result, Crypt); + args = _gck_call_async_result_arguments (result, Crypt); /* Steal the values from the results */ res = args->result; @@ -3238,7 +3283,11 @@ gsize n_signature, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - Verify *args = _gck_call_async_prep (self, self, perform_verify, NULL, sizeof (*args), free_verify); + GckCall *call; + Verify *args; + + call = _gck_call_async_prep (self, perform_verify, NULL, sizeof (*args), free_verify); + args = _gck_call_get_arguments (call); g_return_if_fail (GCK_IS_OBJECT (key)); g_return_if_fail (mechanism); @@ -3257,7 +3306,7 @@ args->key_object = g_object_ref (key); args->interaction = gck_session_get_interaction (self); - _gck_call_async_ready_go (args, cancellable, callback, user_data); + _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } /** diff -Nru gcr-3.38.1/gck/gck-slot.c gcr-3.40.0/gck/gck-slot.c --- gcr-3.38.1/gck/gck-slot.c 2021-01-12 22:55:54.650056100 +0000 +++ gcr-3.40.0/gck/gck-slot.c 2021-03-27 08:40:56.315531300 +0000 @@ -702,7 +702,7 @@ g_object_unref (module); if (rv != CKR_OK) { - g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); + g_warning ("couldn't get token info: %s", gck_message_from_rv (rv)); return NULL; } @@ -826,6 +826,45 @@ { CK_FUNCTION_LIST_PTR funcs; GckModule *module = NULL; + CK_SLOT_INFO info; + CK_SLOT_ID handle; + CK_RV rv; + + g_return_val_if_fail (GCK_IS_SLOT (self), FALSE); + + g_object_get (self, "module", &module, "handle", &handle, NULL); + g_return_val_if_fail (GCK_IS_MODULE (module), FALSE); + + funcs = gck_module_get_functions (module); + g_return_val_if_fail (funcs, FALSE); + + memset (&info, 0, sizeof (info)); + rv = (funcs->C_GetSlotInfo) (handle, &info); + + g_object_unref (module); + + if (rv != CKR_OK) { + g_warning ("couldn't get slot info: %s", gck_message_from_rv (rv)); + return FALSE; + } + + return (info.flags & flags) != 0; +} + +/** + * gck_slot_token_has_flags: + * @self: The GckSlot object. + * @flags: The flags to check. + * + * Check if the PKCS11 token in the slot has the given flags. + * + * Returns: Whether one or more flags exist. + */ +gboolean +gck_slot_token_has_flags (GckSlot *self, gulong flags) +{ + CK_FUNCTION_LIST_PTR funcs; + GckModule *module = NULL; CK_TOKEN_INFO info; CK_SLOT_ID handle; CK_RV rv; @@ -998,18 +1037,17 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GTask *task = G_TASK (user_data); GError *error = NULL; GObject *session; session = g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, &error); if (session != NULL) - g_simple_async_result_set_op_res_gpointer (res, session, g_object_unref); + g_task_return_pointer (task, session, g_object_unref); else - g_simple_async_result_take_error (res, error); + g_task_return_error (task, g_steal_pointer (&error)); - g_simple_async_result_complete (res); - g_object_unref (res); + g_clear_object (&task); } /** @@ -1019,7 +1057,7 @@ * @pkcs11_flags: Additional raw PKCS\#11 flags. * @app_data: Application data for notification callback. * @notify: PKCS\#11 notification callback. - * @cancellable: Optional cancellation object, or %NULL. + * @cancellable: (nullable): Optional cancellation object, or %NULL. * @callback: Called when the operation completes. * @user_data: Data to pass to the callback. * @@ -1038,24 +1076,24 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail (GCK_IS_SLOT (self)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - gck_slot_open_session_full_async); + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gck_slot_open_session_full_async); g_async_initable_new_async (GCK_TYPE_SESSION, G_PRIORITY_DEFAULT, cancellable, on_open_session_complete, - g_object_ref (res), + g_steal_pointer (&task), "options", options, "slot", self, "opening-flags", pkcs11_flags, "app-data", app_data, NULL); - g_object_unref (res); + g_clear_object (&task); } /** @@ -1072,18 +1110,11 @@ GckSession * gck_slot_open_session_finish (GckSlot *self, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *res; - g_return_val_if_fail (GCK_IS_SLOT (self), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), - gck_slot_open_session_full_async), NULL); - - res = G_SIMPLE_ASYNC_RESULT (result); - if (g_simple_async_result_propagate_error (res, error)) - return NULL; + g_return_val_if_fail (g_task_is_valid (result, self), NULL); - return g_object_ref (g_simple_async_result_get_op_res_gpointer (res)); + return g_task_propagate_pointer (G_TASK (result), error); } /** diff -Nru gcr-3.38.1/gck/Makefile.am gcr-3.40.0/gck/Makefile.am --- gcr-3.38.1/gck/Makefile.am 2021-01-12 22:55:54.645056000 +0000 +++ gcr-3.40.0/gck/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,260 +0,0 @@ -# included in top-level Makefile.am - -gck_incdir = $(includedir)/gck-@GCK_MAJOR@/gck - -gck_HEADER_FILES = \ - gck/gck.h \ - gck/gck-deprecated.h - -gck_inc_HEADERS = \ - $(gck_HEADER_FILES) \ - gck/gck-enum-types.h \ - gck/gck-version.h \ - gck/pkcs11.h \ - gck/pkcs11n.h \ - gck/pkcs11x.h - -gck_BUILT_SOURCES = \ - gck/gck-marshal.c gck/gck-marshal.h \ - gck/gck-enum-types.c gck/gck-enum-types.h - -BUILT_SOURCES += $(gck_BUILT_SOURCES) - -lib_LTLIBRARIES += libgck-@GCK_MAJOR@.la - -gck_PUBLIC_FILES = \ - gck/gck.h \ - gck/gck-enum-types.h \ - gck/gck-attributes.c \ - gck/gck-dump.c \ - gck/gck-enumerator.c \ - gck/gck-misc.c \ - gck/gck-module.c \ - gck/gck-modules.c \ - gck/gck-object.c \ - gck/gck-object-cache.c \ - gck/gck-password.c \ - gck/gck-session.c \ - gck/gck-slot.c \ - gck/gck-uri.c \ - gck/gck-version.h - -gck_INTERNAL_FILES = \ - gck/gck-call.c \ - gck/gck-deprecated.h \ - gck/gck-interaction.c \ - gck/gck-private.h \ - gck/pkcs11.h - -libgck_@GCK_MAJOR@_la_SOURCES = \ - $(gck_PUBLIC_FILES) \ - $(gck_INTERNAL_FILES) - -nodist_libgck_@GCK_MAJOR@_la_SOURCES = \ - $(gck_BUILT_SOURCES) - -libgck_@GCK_MAJOR@_la_CFLAGS = \ - $(P11_KIT_CFLAGS) \ - -DG_LOG_DOMAIN=\"Gck\" \ - -DGCK_API_SUBJECT_TO_CHANGE \ - -DP11_KIT_API_SUBJECT_TO_CHANGE \ - -DPKCS11_REGISTRY_DIR=\"$(libdir)/pkcs11\" - -libgck_@GCK_MAJOR@_la_LDFLAGS = \ - -version-info $(GCK_LT_RELEASE) \ - -no-undefined \ - -export-symbols-regex '^gck_.*|^SECMEM_.*' - -libgck_@GCK_MAJOR@_la_LIBADD = \ - libegg-hex.la \ - libegg-secmem.la \ - $(P11_KIT_LIBS) \ - $(GIO_LIBS) \ - $(GLIB_LIBS) - -noinst_LTLIBRARIES += libgck-testable.la -libgck_testable_la_SOURCES = \ - gck/gck-mock.c gck/gck-mock.h \ - gck/gck-test.c gck/gck-test.h - -libgck_testable_la_CFLAGS = \ - $(libgck_@GCK_MAJOR@_la_CFLAGS) - -libgck_testable_la_LIBADD = \ - $(libgck_@GCK_MAJOR@_la_OBJECTS) \ - libegg-hex.la \ - libegg-secmem.la \ - $(P11_KIT_LIBS) \ - $(GIO_LIBS) \ - $(GLIB_LIBS) -EXTRA_libgck_testable_la_DEPENDENCIES = $(libgck_@GCK_MAJOR@_la_OBJECTS) - -gck/gck-marshal.h: gck/gck-marshal.list $(GLIB_GENMARSHAL) - $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=_gck_marshal > $@ - -gck/gck-marshal.c: gck/gck-marshal.list $(GLIB_GENMARSHAL) - $(AM_V_GEN) echo "#include \"gck/gck-marshal.h\"" > $@ && \ - $(GLIB_GENMARSHAL) $< --body --prefix=_gck_marshal >> $@ - -gck/gck-enum-types.h: $(ENUM_TEMPLATE_H) $(gck_HEADER_FILES) - $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ - -gck/gck-enum-types.c: $(ENUM_TEMPLATE_C) $(gck_HEADER_FILES) - $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ - -EXTRA_DIST += \ - gck/gck.pc.in \ - gck/gck-marshal.list \ - gck/gck-version.h \ - gck/gck.symbols \ - gck/pkcs11-trust-assertions.h \ - gck/pkcs11i.h - -CLEANFILES += \ - gck-$(GCK_MAJOR).pc \ - $(gir_DATA) \ - $(typelibs_DATA) \ - $(BUILT_SOURCES) \ - gck-actual.abi \ - gck-expected.abi - -# ------------------------------------------------------------------ -# INTROSPECTION - -if HAVE_INTROSPECTION - -INTROSPECTION_GIRS += Gck-@GCK_MAJOR@.gir - -Gck-@GCK_MAJOR@.gir: libgck-@GCK_MAJOR@.la - -Gck_@GCK_MAJOR@_gir_PACKAGES = gobject-2.0 gio-2.0 p11-kit-1 -Gck_@GCK_MAJOR@_gir_EXPORT_PACKAGES = gck-@GCK_MAJOR@ -Gck_@GCK_MAJOR@_gir_INCLUDES = GObject-2.0 Gio-2.0 -Gck_@GCK_MAJOR@_gir_LIBS = libgck-@GCK_MAJOR@.la -Gck_@GCK_MAJOR@_gir_CFLAGS = -I$(srcdir) -I$(builddir) -DGCK_COMPILATION -DGCK_API_SUBJECT_TO_CHANGE -Gck_@GCK_MAJOR@_gir_FILES = $(gck_PUBLIC_FILES) -Gck_@GCK_MAJOR@_gir_SCANNERFLAGS = --add-include-path=$(srcdir)/gck --c-include "gck/gck.h" - -gir_DATA += Gck-@GCK_MAJOR@.gir - -if ENABLE_VAPIGEN - -gck-@GCK_MAJOR@.vapi: Gck-@GCK_MAJOR@.gir gck/Gck-@GCK_MAJOR@.metadata gck-@GCK_MAJOR@.deps - -VAPIGEN_VAPIS += gck-@GCK_MAJOR@.vapi - -gck_@GCK_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 -gck_@GCK_MAJOR@_vapi_METADATADIRS = $(srcdir)/gck -gck_@GCK_MAJOR@_vapi_FILES = Gck-@GCK_MAJOR@.gir - -gck-$(GCK_MAJOR).deps: Makefile.am - $(AM_V_GEN) echo $(gck_@GCK_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ - -vapi_DATA += gck/pkcs11.vapi - -EXTRA_DIST += \ - gck/Gck-@GCK_MAJOR@.metadata \ - gck/pkcs11.vapi - -endif # ENABLE_VAPIGEN - -endif - -# ---------------------------------------------------------------- - -pkgconfig_DATA += gck-$(GCK_MAJOR).pc - -gck-$(GCK_MAJOR).pc: gck/gck.pc - $(AM_V_GEN) cp gck/gck.pc gck-$(GCK_MAJOR).pc - -gck-expected.abi: gck/gck.symbols - $(AM_V_GEN) cpp -P $< | sort > $@ - -gck-actual.abi: $(builddir)/.libs/libgck-@GCK_MAJOR@.so - $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ - cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end)' | sort > $@ - -check-gck-symbols: gck-expected.abi gck-actual.abi - $(AM_V_GEN) diff -U0 --ignore-blank-lines gck-expected.abi gck-actual.abi || \ - (echo "check-symbols: Symbols have CHANGED. Fix gck.symbols"; exit 1) - -gck_CFLAGS = \ - -I$(top_builddir) \ - -I$(top_srcdir) \ - -DGCK_API_SUBJECT_TO_CHANGE \ - -DG_LOG_DOMAIN=\"Gck\" \ - $(P11_KIT_CFLAGS) \ - $(GLIB_CFLAGS) - -gck_LIBS = \ - libgck-testable.la \ - libegg-test.la \ - libegg-hex.la \ - $(GLIB_LIBS) \ - $(P11_KIT_LIBS) \ - $(GIO_LIBS) - -gck_TESTS = \ - test-gck-attributes \ - test-gck-module \ - test-gck-slot \ - test-gck-session \ - test-gck-object \ - test-gck-crypto \ - test-gck-uri \ - test-gck-enumerator \ - test-gck-modules - -test_gck_attributes_SOURCES = gck/test-gck-attributes.c -test_gck_attributes_CFLAGS = $(gck_CFLAGS) -test_gck_attributes_LDADD = $(gck_LIBS) - -test_gck_crypto_SOURCES = gck/test-gck-crypto.c -test_gck_crypto_CFLAGS = $(gck_CFLAGS) -test_gck_crypto_LDADD = $(gck_LIBS) - -test_gck_enumerator_SOURCES = gck/test-gck-enumerator.c -test_gck_enumerator_CFLAGS = $(gck_CFLAGS) -test_gck_enumerator_LDADD = libegg-test.la $(gck_LIBS) - -test_gck_object_SOURCES = gck/test-gck-object.c -test_gck_object_CFLAGS = $(gck_CFLAGS) -test_gck_object_LDADD = $(gck_LIBS) - -test_gck_module_SOURCES = gck/test-gck-module.c -test_gck_module_CFLAGS = $(gck_CFLAGS) -test_gck_module_LDADD = $(gck_LIBS) - -test_gck_modules_SOURCES = gck/test-gck-modules.c -test_gck_modules_CFLAGS = $(gck_CFLAGS) -test_gck_modules_LDADD = $(gck_LIBS) - -test_gck_session_SOURCES = gck/test-gck-session.c -test_gck_session_CFLAGS = $(gck_CFLAGS) -test_gck_session_LDADD = libegg-test.la $(gck_LIBS) - -test_gck_slot_SOURCES = gck/test-gck-slot.c -test_gck_slot_CFLAGS = $(gck_CFLAGS) -test_gck_slot_LDADD = $(gck_LIBS) - -test_gck_uri_SOURCES = gck/test-gck-uri.c -test_gck_uri_CFLAGS = $(gck_CFLAGS) -test_gck_uri_LDADD = $(gck_LIBS) - -check_PROGRAMS += $(gck_TESTS) -TESTS += $(gck_TESTS) - -check_LTLIBRARIES += libmock-test-module.la - -libmock_test_module_la_LDFLAGS = \ - -module -avoid-version -shared -rpath $(abs_builddir) - -libmock_test_module_la_CFLAGS = \ - -DGCK_API_SUBJECT_TO_CHANGE \ - $(gck_CFLAGS) - -libmock_test_module_la_SOURCES = \ - gck/mock-test-module.c - -libmock_test_module_la_LIBADD = \ - libgck-testable.la diff -Nru gcr-3.38.1/gck/test-gck-attributes.c gcr-3.40.0/gck/test-gck-attributes.c --- gcr-3.38.1/gck/test-gck-attributes.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-attributes.c 2021-03-27 08:40:56.317531000 +0000 @@ -41,12 +41,11 @@ { GckAttribute attr; - g_assert (sizeof (attr) == sizeof (CK_ATTRIBUTE)); + g_assert_cmpuint (sizeof (attr), ==, sizeof (CK_ATTRIBUTE)); gck_attribute_init (&attr, ATTR_TYPE, (const guchar *)ATTR_DATA, N_ATTR_DATA); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == N_ATTR_DATA); - g_assert (memcmp (attr.value, ATTR_DATA, attr.length) == 0); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpmem (attr.value, attr.length, ATTR_DATA, N_ATTR_DATA); gck_attribute_clear (&attr); } @@ -58,10 +57,10 @@ CK_BBOOL ck_value = CK_FALSE; gck_attribute_init_boolean (&attr, ATTR_TYPE, TRUE); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == sizeof (CK_BBOOL)); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpuint (attr.length, ==, sizeof (CK_BBOOL)); memcpy(&ck_value, attr.value, sizeof (CK_BBOOL)); - g_assert (ck_value == CK_TRUE); + g_assert_cmpint (ck_value, ==, CK_TRUE); gck_attribute_clear (&attr); } @@ -79,9 +78,8 @@ memcpy (ck_date.day, "05", 2); gck_attribute_init_date (&attr, ATTR_TYPE, date); g_date_free (date); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == sizeof (CK_DATE)); - g_assert (memcmp (attr.value, &ck_date, attr.length) == 0); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpmem (attr.value, attr.length, &ck_date, sizeof (CK_DATE)); gck_attribute_clear (&attr); } @@ -93,10 +91,10 @@ CK_ULONG ck_value = 0; gck_attribute_init_ulong (&attr, ATTR_TYPE, 88); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == sizeof (CK_ULONG)); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpuint (attr.length, ==, sizeof (CK_ULONG)); memcpy(&ck_value, attr.value, sizeof (CK_ULONG)); - g_assert (ck_value == 88); + g_assert_cmpuint (ck_value, ==, 88); gck_attribute_clear (&attr); } @@ -107,9 +105,8 @@ GckAttribute attr; gck_attribute_init_string (&attr, ATTR_TYPE, "a test string"); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == strlen ("a test string")); - g_assert (memcmp (attr.value, "a test string", attr.length) == 0); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpmem (attr.value, attr.length, "a test string", strlen ("a test string")); gck_attribute_clear (&attr); } @@ -120,11 +117,11 @@ GckAttribute attr; gck_attribute_init_invalid (&attr, ATTR_TYPE); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == (gulong)-1); - g_assert (attr.value == NULL); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpuint (attr.length, ==, (gulong)-1); + g_assert_null (attr.value); - g_assert (gck_attribute_is_invalid (&attr)); + g_assert_true (gck_attribute_is_invalid (&attr)); gck_attribute_clear (&attr); } @@ -134,9 +131,9 @@ GckAttribute attr; gck_attribute_init_empty (&attr, ATTR_TYPE); - g_assert (attr.type == ATTR_TYPE); - g_assert (attr.length == 0); - g_assert (attr.value == NULL); + g_assert_cmpuint (attr.type, ==, ATTR_TYPE); + g_assert_cmpuint (attr.length, ==, 0); + g_assert_null (attr.value); gck_attribute_clear (&attr); } @@ -147,9 +144,8 @@ GckAttribute *attr; attr = gck_attribute_new (ATTR_TYPE, ATTR_DATA, N_ATTR_DATA); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == N_ATTR_DATA); - g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, ATTR_DATA, N_ATTR_DATA); gck_attribute_free (attr); } @@ -161,10 +157,10 @@ CK_BBOOL ck_value = CK_FALSE; attr = gck_attribute_new_boolean (ATTR_TYPE, TRUE); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_BBOOL)); memcpy(&ck_value, attr->value, sizeof (CK_BBOOL)); - g_assert (ck_value == CK_TRUE); + g_assert_cmpuint (ck_value, ==, CK_TRUE); gck_attribute_free (attr); } @@ -182,9 +178,8 @@ memcpy (ck_date.day, "05", 2); attr = gck_attribute_new_date (ATTR_TYPE, date); g_date_free (date); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_DATE)); - g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, &ck_date, sizeof (CK_DATE)); gck_attribute_free (attr); } @@ -196,10 +191,10 @@ CK_ULONG ck_value = 0; attr = gck_attribute_new_ulong (ATTR_TYPE, 88); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_ULONG)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_ULONG)); memcpy(&ck_value, attr->value, sizeof (CK_ULONG)); - g_assert (ck_value == 88); + g_assert_cmpuint (ck_value, ==, 88); gck_attribute_free (attr); } @@ -211,9 +206,8 @@ GckAttribute *attr; attr = gck_attribute_new_string (ATTR_TYPE, "a test string"); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == strlen ("a test string")); - g_assert (memcmp (attr->value, "a test string", attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, "a test string", strlen ("a test string")); gck_attribute_free (attr); } @@ -224,11 +218,11 @@ GckAttribute *attr; attr = gck_attribute_new_invalid (ATTR_TYPE); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == (gulong)-1); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, (gulong)-1); + g_assert_null (attr->value); - g_assert (gck_attribute_is_invalid (attr)); + g_assert_true (gck_attribute_is_invalid (attr)); gck_attribute_free (attr); } @@ -239,9 +233,9 @@ GckAttribute *attr; attr = gck_attribute_new_empty (ATTR_TYPE); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == 0); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, 0); + g_assert_null (attr->value); gck_attribute_free (attr); } @@ -252,7 +246,7 @@ GckAttribute *attr; attr = gck_attribute_new_boolean (ATTR_TYPE, TRUE); - g_assert (gck_attribute_get_boolean (attr) == TRUE); + g_assert_true (gck_attribute_get_boolean (attr)); gck_attribute_free (attr); } @@ -269,7 +263,7 @@ memcpy (ck_date.day, "05", 2); attr = gck_attribute_new_date (ATTR_TYPE, &date); gck_attribute_get_date (attr, &date2); - g_assert (g_date_compare (&date, &date2) == 0); + g_assert_true (g_date_compare (&date, &date2) == 0); gck_attribute_free (attr); } @@ -279,7 +273,7 @@ GckAttribute *attr; attr = gck_attribute_new_ulong (ATTR_TYPE, 88); - g_assert (gck_attribute_get_ulong (attr) == 88); + g_assert_cmpuint (gck_attribute_get_ulong (attr), ==, 88); gck_attribute_free (attr); } @@ -291,14 +285,14 @@ attr = gck_attribute_new_string (ATTR_TYPE, "a test string"); value = gck_attribute_get_string (attr); - g_assert (strcmp ("a test string", value) == 0); + g_assert_cmpstr ("a test string", ==, value); g_free (value); gck_attribute_free (attr); /* Should be able to store null strings */ attr = gck_attribute_new_string (ATTR_TYPE, NULL); value = gck_attribute_get_string (attr); - g_assert (value == NULL); + g_assert_null (value); gck_attribute_free (attr); } @@ -310,13 +304,13 @@ gck_attribute_init_ulong (&attr, ATTR_TYPE, 88); dup = gck_attribute_dup (&attr); gck_attribute_clear (&attr); - g_assert (gck_attribute_get_ulong (dup) == 88); - g_assert (dup->type == ATTR_TYPE); + g_assert_cmpuint (gck_attribute_get_ulong (dup), ==, 88); + g_assert_cmpuint (dup->type, ==, ATTR_TYPE); gck_attribute_free (dup); /* Should be able to dup null */ dup = gck_attribute_dup (NULL); - g_assert (dup == NULL); + g_assert_null (dup); } static void @@ -327,8 +321,8 @@ gck_attribute_init_ulong (&attr, ATTR_TYPE, 88); gck_attribute_init_copy (©, &attr); gck_attribute_clear (&attr); - g_assert (gck_attribute_get_ulong (©) == 88); - g_assert (copy.type == ATTR_TYPE); + g_assert_cmpuint (gck_attribute_get_ulong (©), ==, 88); + g_assert_cmpuint (copy.type, ==, ATTR_TYPE); gck_attribute_clear (©); } @@ -353,7 +347,7 @@ GckBuilder builder; gck_builder_init (&builder); - g_assert (gck_builder_find (&builder, 88) == NULL); + g_assert_null (gck_builder_find (&builder, 88)); gck_builder_clear (&builder); } @@ -366,20 +360,17 @@ gck_builder_add_data (&builder, ATTR_TYPE, (const guchar *)"Hello", 5); attr = gck_builder_find (&builder, ATTR_TYPE); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == 5); - g_assert (memcmp (attr->value, "Hello", attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, "Hello", 5); gck_builder_set_data (&builder, ATTR_TYPE, (const guchar *)ATTR_DATA, N_ATTR_DATA); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == N_ATTR_DATA); - g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, ATTR_DATA, N_ATTR_DATA); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == N_ATTR_DATA); - g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, ATTR_DATA, N_ATTR_DATA); gck_attributes_unref (attrs); } @@ -395,8 +386,8 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (gck_attribute_is_invalid (attr)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_true (gck_attribute_is_invalid (attr)); gck_attributes_unref (attrs); } @@ -414,10 +405,9 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == 8); - g_assert (memcmp (attr->value, "password", attr->length) == 0); - g_assert (egg_secure_check (attr->value) == TRUE); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, "password", 8); + g_assert_true (egg_secure_check (attr->value)); egg_secure_free (memory); gck_attributes_unref (attrs); @@ -437,9 +427,8 @@ attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == N_ATTR_DATA); - g_assert (memcmp (attr->value, ATTR_DATA, attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, ATTR_DATA, N_ATTR_DATA); gck_attributes_unref (attrs); } @@ -463,8 +452,8 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (gck_attribute_is_invalid (attr)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_true (gck_attribute_is_invalid (attr)); gck_attributes_unref (attrs); } @@ -482,10 +471,9 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == 8); - g_assert (memcmp (attr->value, "password", attr->length) == 0); - g_assert (egg_secure_check (attr->value) == TRUE); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, "password", 8); + g_assert_true (egg_secure_check (attr->value)); gck_attributes_unref (attrs); } @@ -500,7 +488,7 @@ if (!gck_value_to_boolean (&data, sizeof (data), &result)) g_assert_not_reached (); - g_assert (result == TRUE); + g_assert_true (result); if (!gck_value_to_boolean (&data, sizeof (data), NULL)) g_assert_not_reached (); @@ -523,7 +511,7 @@ if (!gck_value_to_ulong ((const guchar *)&data, sizeof (data), &result)) g_assert_not_reached (); - g_assert (result == 34343); + g_assert_cmpuint (result, ==, 34343); if (!gck_value_to_ulong ((const guchar *)&data, sizeof (data), NULL)) g_assert_not_reached (); @@ -546,51 +534,51 @@ gboolean value; CK_BBOOL ck_value = CK_FALSE; - g_assert (gck_builder_find_boolean (&builder, 5, &value) == FALSE); + g_assert_false (gck_builder_find_boolean (&builder, 5, &value)); gck_builder_add_boolean (&builder, ATTR_TYPE, FALSE); gck_builder_set_invalid (&builder, 5); - g_assert (gck_builder_find_boolean (&builder, 5, &value) == FALSE); + g_assert_false (gck_builder_find_boolean (&builder, 5, &value)); gck_builder_set_boolean (&builder, 5, TRUE); attr = gck_builder_find (&builder, ATTR_TYPE); - g_assert (attr != NULL); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert_nonnull (attr); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_BBOOL)); memcpy(&ck_value, attr->value, sizeof (CK_BBOOL)); - g_assert (ck_value == CK_FALSE); + g_assert_cmpuint (ck_value, ==, CK_FALSE); if (!gck_builder_find_boolean (&builder, ATTR_TYPE, &value)) g_assert_not_reached (); - g_assert (value == FALSE); + g_assert_false (value); gck_builder_set_boolean (&builder, ATTR_TYPE, TRUE); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_BBOOL)); memcpy(&ck_value, attr->value, sizeof (CK_BBOOL)); - g_assert (ck_value == CK_TRUE); + g_assert_cmpuint (ck_value, ==, CK_TRUE); if (!gck_builder_find_boolean (&builder, ATTR_TYPE, &value)) g_assert_not_reached (); - g_assert (value == TRUE); + g_assert_true (value); if (!gck_builder_find_boolean (&builder, 5, &value)) g_assert_not_reached (); - g_assert (value == TRUE); + g_assert_true (value); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr != NULL); + g_assert_nonnull (attr); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_BBOOL)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_BBOOL)); memcpy(&ck_value, attr->value, sizeof (CK_BBOOL)); - g_assert (ck_value == CK_TRUE); + g_assert_cmpuint (ck_value, ==, CK_TRUE); if (!gck_attributes_find_boolean (attrs, ATTR_TYPE, &value)) g_assert_not_reached (); - g_assert (value == TRUE); + g_assert_true (value); - g_assert (gck_attribute_get_boolean (attr) == TRUE); + g_assert_true (gck_attribute_get_boolean (attr)); g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); gck_attributes_unref (attrs); @@ -605,7 +593,7 @@ CK_DATE ck_date; GDate *date, date2; - g_assert (gck_builder_find_date (&builder, 5, &date2) == FALSE); + g_assert_false (gck_builder_find_date (&builder, 5, &date2)); date = g_date_new_dmy(8, 8, 1960); memcpy (ck_date.year, "1960", 4); @@ -615,7 +603,7 @@ gck_builder_add_date (&builder, ATTR_TYPE, date); gck_builder_set_invalid (&builder, 5); - g_assert (gck_builder_find_date (&builder, 5, &date2) == FALSE); + g_assert_false (gck_builder_find_date (&builder, 5, &date2)); attr = gck_builder_find (&builder, 5); gck_attribute_get_date (attr, &date2); g_assert_cmpint (date2.day, ==, 0); @@ -625,17 +613,16 @@ gck_builder_set_date (&builder, 5, date); attr = gck_builder_find (&builder, ATTR_TYPE); - g_assert (attr != NULL); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_DATE)); - g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + g_assert_nonnull (attr); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, &ck_date, sizeof (CK_DATE)); if (!gck_builder_find_date (&builder, ATTR_TYPE, &date2)) g_assert_not_reached (); - g_assert (g_date_compare (date, &date2) == 0); + g_assert_true (g_date_compare (date, &date2) == 0); if (!gck_builder_find_date (&builder, 5, &date2)) g_assert_not_reached (); - g_assert (g_date_compare (date, &date2) == 0); + g_assert_true (g_date_compare (date, &date2) == 0); g_date_free (date); @@ -644,22 +631,20 @@ memcpy (ck_date.month, "06", 2); memcpy (ck_date.day, "05", 2); gck_builder_set_date (&builder, ATTR_TYPE, date); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_DATE)); - g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, &ck_date, sizeof (CK_DATE)); if (!gck_builder_find_date (&builder, ATTR_TYPE, &date2)) g_assert_not_reached (); - g_assert (g_date_compare (date, &date2) == 0); + g_assert_true (g_date_compare (date, &date2) == 0); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr != NULL); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_DATE)); - g_assert (memcmp (attr->value, &ck_date, attr->length) == 0); + g_assert_nonnull (attr); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, &ck_date, sizeof (CK_DATE)); gck_attribute_get_date (attr, &date2); - g_assert (g_date_compare (date, &date2) == 0); + g_assert_true (g_date_compare (date, &date2) == 0); g_date_free (date); @@ -676,49 +661,49 @@ gulong value; CK_ULONG ck_value = 0; - g_assert (gck_builder_find_ulong (&builder, 5, &value) == FALSE); + g_assert_false (gck_builder_find_ulong (&builder, 5, &value)); gck_builder_add_ulong (&builder, ATTR_TYPE, 99); gck_builder_set_invalid (&builder, 5); - g_assert (gck_builder_find_ulong (&builder, 5, &value) == FALSE); + g_assert_false (gck_builder_find_ulong (&builder, 5, &value)); gck_builder_set_ulong (&builder, 5, 292); attr = gck_builder_find (&builder, ATTR_TYPE); - g_assert (attr != NULL); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_ULONG)); + g_assert_nonnull (attr); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_ULONG)); memcpy(&ck_value, attr->value, sizeof (CK_ULONG)); - g_assert (ck_value == 99); + g_assert_cmpuint (ck_value, ==, 99); if (!gck_builder_find_ulong (&builder, ATTR_TYPE, &value)) g_assert_not_reached (); - g_assert (value == 99); + g_assert_cmpuint (value, ==, 99); gck_builder_set_ulong (&builder, ATTR_TYPE, 88); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_ULONG)); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_ULONG)); memcpy(&ck_value, attr->value, sizeof (CK_ULONG)); - g_assert (ck_value == 88); + g_assert_cmpuint (ck_value, ==, 88); if (!gck_builder_find_ulong (&builder, ATTR_TYPE, &value)) g_assert_not_reached (); - g_assert (value == 88); + g_assert_cmpuint (value, ==, 88); if (!gck_builder_find_ulong (&builder, 5, &value)) g_assert_not_reached (); - g_assert (value == 292); + g_assert_cmpuint (value, ==, 292); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr != NULL); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == sizeof (CK_ULONG)); + g_assert_nonnull (attr); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, sizeof (CK_ULONG)); memcpy(&ck_value, attr->value, sizeof (CK_ULONG)); - g_assert (ck_value == 88); + g_assert_cmpuint (ck_value, ==, 88); if (!gck_attributes_find_ulong (attrs, ATTR_TYPE, &value)) g_assert_not_reached (); - g_assert (value == 88); - g_assert (gck_attribute_get_ulong (attr) == 88); + g_assert_cmpuint (value, ==, 88); + g_assert_cmpuint (gck_attribute_get_ulong (attr), ==, 88); g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); gck_attributes_unref (attrs); @@ -732,19 +717,18 @@ const GckAttribute *attr; gchar *value; - g_assert (gck_builder_find_string (&builder, 5, &value) == FALSE); + g_assert_false (gck_builder_find_string (&builder, 5, &value)); gck_builder_add_string (&builder, ATTR_TYPE, "My my"); gck_builder_set_invalid (&builder, 5); - g_assert (gck_builder_find_string (&builder, 5, &value) == FALSE); + g_assert_false (gck_builder_find_string (&builder, 5, &value)); gck_builder_set_string (&builder, 5, "Hello"); attr = gck_builder_find (&builder, ATTR_TYPE); - g_assert (attr != NULL); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == strlen ("My my")); - g_assert (memcmp (attr->value, "My my", attr->length) == 0); + g_assert_nonnull (attr); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, "My my", strlen ("My my")); if (!gck_builder_find_string (&builder, 5, &value)) g_assert_not_reached (); @@ -752,17 +736,17 @@ g_free (value); gck_builder_set_string (&builder, ATTR_TYPE, "a test string"); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == strlen ("a test string")); - g_assert (memcmp (attr->value, "a test string", attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, + "a test string", strlen ("a test string")); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr != NULL); + g_assert_nonnull (attr); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == strlen ("a test string")); - g_assert (memcmp (attr->value, "a test string", attr->length) == 0); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpmem (attr->value, attr->length, + "a test string", strlen ("a test string")); if (!gck_attributes_find_string (attrs, ATTR_TYPE, &value)) g_assert_not_reached (); @@ -787,15 +771,15 @@ gck_builder_add_string (&builder, ATTR_TYPE, NULL); - g_assert (gck_builder_find_string (&builder, ATTR_TYPE, &value) == FALSE); + g_assert_false (gck_builder_find_string (&builder, ATTR_TYPE, &value)); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->value == NULL); - g_assert (attr->length == 0); + g_assert_null (attr->value); + g_assert_cmpuint (attr->length, ==, 0); value = gck_attribute_get_string (attr); - g_assert (value == NULL); + g_assert_null (value); gck_attributes_unref (attrs); } @@ -813,11 +797,11 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == (gulong)-1); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, (gulong)-1); + g_assert_null (attr->value); - g_assert (gck_attribute_is_invalid (attr)); + g_assert_true (gck_attribute_is_invalid (attr)); g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); gck_attributes_unref (attrs); @@ -835,15 +819,15 @@ gck_builder_set_empty (&builder, 5); attr = gck_builder_find (&builder, 5); - g_assert (attr->type == 5); - g_assert (attr->length == 0); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, 5); + g_assert_cmpuint (attr->length, ==, 0); + g_assert_null (attr->value); attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == ATTR_TYPE); - g_assert (attr->length == 0); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); + g_assert_cmpuint (attr->length, ==, 0); + g_assert_null (attr->value); g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); gck_attributes_unref (attrs); @@ -862,7 +846,7 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_at (attrs, 0); - g_assert (egg_secure_check (attr->value)); + g_assert_true (egg_secure_check (attr->value)); gck_attributes_unref (attrs); } @@ -883,12 +867,12 @@ gck_builder_unref (copy); attr = gck_attributes_at (attrs, 0); - g_assert (gck_attribute_get_ulong (attr) == 88); - g_assert (attr->type == ATTR_TYPE); + g_assert_cmpuint (gck_attribute_get_ulong (attr), ==, 88); + g_assert_cmpuint (attr->type, ==, ATTR_TYPE); /* Should be able to copy null */ copy = gck_builder_copy (NULL); - g_assert (copy == NULL); + g_assert_null (copy); gck_attributes_unref (attrs); } @@ -904,17 +888,17 @@ two = gck_builder_ref (builder); - g_assert (builder == two); + g_assert_true (builder == two); if (!gck_builder_find_ulong (builder, 88, &check)) g_assert_not_reached (); - g_assert (check == 99); + g_assert_cmpuint (check, ==, 99); gck_builder_unref (builder); if (!gck_builder_find_ulong (two, 88, &check)) g_assert_not_reached (); - g_assert (check == 99); + g_assert_cmpuint (check, ==, 99); gck_builder_unref (two); } @@ -930,17 +914,17 @@ two = g_boxed_copy (GCK_TYPE_BUILDER, builder); - g_assert (builder == two); + g_assert_true (builder == two); if (!gck_builder_find_ulong (builder, 88, &check)) g_assert_not_reached (); - g_assert (check == 99); + g_assert_cmpuint (check, ==, 99); g_boxed_free (GCK_TYPE_BUILDER, builder); if (!gck_builder_find_ulong (two, 88, &check)) g_assert_not_reached (); - g_assert (check == 99); + g_assert_cmpuint (check, ==, 99); gck_builder_unref (two); } @@ -964,7 +948,7 @@ /* Should be equal, and also share the values */ gck_attribute_equal (aone, atwo); - g_assert (aone->value == atwo->value); + g_assert_true (aone->value == atwo->value); gck_attributes_unref (aones); @@ -1007,10 +991,10 @@ GckAttributes *attrs; attrs = gck_builder_end (&builder); - g_assert (attrs != NULL); - g_assert (gck_attributes_count (attrs) == 0); + g_assert_nonnull (attrs); + g_assert_cmpuint (gck_attributes_count (attrs), ==, 0); - g_assert (gck_attributes_ref (attrs) == attrs); + g_assert_true (gck_attributes_ref (attrs) == attrs); gck_attributes_unref (attrs); gck_attributes_unref (attrs); @@ -1028,50 +1012,49 @@ gchar *value; GDate date, *check; - g_assert (attrs != NULL); + g_assert_nonnull (attrs); if (count < 0) count = extras ? 7 : 5; g_assert_cmpuint (gck_attributes_count (attrs), ==, count); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == 0); - g_assert (gck_attribute_get_boolean (attr) == TRUE); + g_assert_cmpuint (attr->type, ==, 0); + g_assert_true (gck_attribute_get_boolean (attr)); attr = gck_attributes_at (attrs, 1); - g_assert (attr->type == 101); + g_assert_cmpuint (attr->type, ==, 101); gck_assert_cmpulong (gck_attribute_get_ulong (attr), ==, 888); attr = gck_attributes_at (attrs, 2); - g_assert (attr->type == 202); + g_assert_cmpuint (attr->type, ==, 202); value = gck_attribute_get_string (attr); - g_assert (strcmp (value, "string") == 0); + g_assert_cmpstr (value, ==, "string"); g_free (value); attr = gck_attributes_at (attrs, 3); - g_assert (attr->type == 303); + g_assert_cmpuint (attr->type, ==, 303); check = g_date_new_dmy (11, 12, 2008); gck_attribute_get_date (attr, &date); - g_assert (g_date_compare (&date, check) == 0); + g_assert_true (g_date_compare (&date, check) == 0); g_date_free (check); attr = gck_attributes_at (attrs, 4); - g_assert (attr->type == 404); - g_assert (attr->length == N_ATTR_DATA); - g_assert (memcmp (attr->value, ATTR_DATA, N_ATTR_DATA) == 0); + g_assert_cmpuint (attr->type, ==, 404); + g_assert_cmpmem (attr->value, attr->length, ATTR_DATA, N_ATTR_DATA); if (!extras) return; attr = gck_attributes_at (attrs, 5); - g_assert (attr->type == 505); - g_assert (attr->length == (gulong)-1); - g_assert (attr->value == NULL); - g_assert (gck_attribute_is_invalid (attr)); + g_assert_cmpuint (attr->type, ==, 505); + g_assert_cmpuint (attr->length, ==, (gulong)-1); + g_assert_null (attr->value); + g_assert_true (gck_attribute_is_invalid (attr)); attr = gck_attributes_at (attrs, 6); - g_assert (attr->type == 606); - g_assert (attr->length == 0); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, 606); + g_assert_cmpuint (attr->length, ==, 0); + g_assert_null (attr->value); } static void @@ -1087,13 +1070,13 @@ attrs = gck_attributes_new_empty (CKA_ID, CKA_LABEL, GCK_INVALID); g_assert_cmpuint (gck_attributes_count (attrs), ==, 2); attr = gck_attributes_at (attrs, 0); - g_assert (attr->type == CKA_ID); - g_assert (attr->length == 0); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, CKA_ID); + g_assert_cmpuint (attr->length, ==, 0); + g_assert_null (attr->value); attr = gck_attributes_at (attrs, 1); - g_assert (attr->type == CKA_LABEL); - g_assert (attr->length == 0); - g_assert (attr->value == NULL); + g_assert_cmpuint (attr->type, ==, CKA_LABEL); + g_assert_cmpuint (attr->length, ==, 0); + g_assert_null (attr->value); gck_attributes_unref (attrs); } @@ -1114,9 +1097,9 @@ g_assert_cmpuint (gck_attributes_count (attrs), ==, 4); for (i = 0; i < gck_attributes_count (attrs); ++i) { attr = gck_attributes_at (attrs, i); - g_assert (attr->type == ((i + 1) * 100) + i + 1); - g_assert (attr->value == NULL); - g_assert (attr->length == 0); + g_assert_cmpuint (attr->type, ==, ((i + 1) * 100) + i + 1); + g_assert_null (attr->value); + g_assert_cmpuint (attr->length, ==, 0); } gck_attributes_unref (attrs); @@ -1191,7 +1174,7 @@ gck_builder_set_boolean (&builder, 5, TRUE); if (!gck_builder_find_boolean (&builder, 5, &value)) g_assert_not_reached (); - g_assert (value == TRUE); + g_assert_true (value); gck_builder_clear (&builder); } @@ -1209,14 +1192,14 @@ gck_attributes_unref (attrs); attrs = gck_builder_end (&two); - g_assert (gck_attributes_find (attrs, 0UL) != NULL); - g_assert (gck_attributes_find (attrs, 202UL) != NULL); - g_assert (gck_attributes_find (attrs, 404UL) != NULL); - g_assert (gck_attributes_find (attrs, 606UL) != NULL); - - g_assert (gck_attributes_find (attrs, 101UL) == NULL); - g_assert (gck_attributes_find (attrs, 303UL) == NULL); - g_assert (gck_attributes_find (attrs, 505UL) == NULL); + g_assert_nonnull (gck_attributes_find (attrs, 0UL)); + g_assert_nonnull (gck_attributes_find (attrs, 202UL)); + g_assert_nonnull (gck_attributes_find (attrs, 404UL)); + g_assert_nonnull (gck_attributes_find (attrs, 606UL)); + + g_assert_null (gck_attributes_find (attrs, 101UL)); + g_assert_null (gck_attributes_find (attrs, 303UL)); + g_assert_null (gck_attributes_find (attrs, 505UL)); gck_attributes_unref (attrs); } @@ -1235,14 +1218,14 @@ gck_attributes_unref (attrs); attrs = gck_builder_end (&two); - g_assert (gck_attributes_find (attrs, 0UL) == NULL); - g_assert (gck_attributes_find (attrs, 202UL) == NULL); - g_assert (gck_attributes_find (attrs, 404UL) == NULL); - g_assert (gck_attributes_find (attrs, 606UL) == NULL); - - g_assert (gck_attributes_find (attrs, 101UL) != NULL); - g_assert (gck_attributes_find (attrs, 303UL) != NULL); - g_assert (gck_attributes_find (attrs, 505UL) != NULL); + g_assert_null (gck_attributes_find (attrs, 0UL)); + g_assert_null (gck_attributes_find (attrs, 202UL)); + g_assert_null (gck_attributes_find (attrs, 404UL)); + g_assert_null (gck_attributes_find (attrs, 606UL)); + + g_assert_nonnull (gck_attributes_find (attrs, 101UL)); + g_assert_nonnull (gck_attributes_find (attrs, 303UL)); + g_assert_nonnull (gck_attributes_find (attrs, 505UL)); gck_attributes_unref (attrs); } @@ -1285,27 +1268,26 @@ attrs = gck_builder_end (&builder); attr = gck_attributes_find (attrs, 404); - g_assert (attr != NULL); - g_assert (attr->length == N_ATTR_DATA); - g_assert (memcmp (attr->value, ATTR_DATA, N_ATTR_DATA) == 0); + g_assert_nonnull (attr); + g_assert_cmpmem (attr->value, attr->length, ATTR_DATA, N_ATTR_DATA); ret = gck_attributes_find_boolean (attrs, 0UL, &bvalue); - g_assert (ret == TRUE); - g_assert (bvalue == TRUE); + g_assert_true (ret); + g_assert_true (bvalue); ret = gck_attributes_find_ulong (attrs, 101UL, &uvalue); - g_assert (ret == TRUE); - g_assert (uvalue == 888); + g_assert_true (ret); + g_assert_cmpuint (uvalue, ==, 888); ret = gck_attributes_find_string (attrs, 202UL, &svalue); - g_assert (ret == TRUE); - g_assert (svalue != NULL); - g_assert (strcmp (svalue, "string") == 0); + g_assert_true (ret); + g_assert_nonnull (svalue); + g_assert_cmpstr (svalue, ==, "string"); g_free (svalue); ret = gck_attributes_find_date (attrs, 303UL, &check); - g_assert (ret == TRUE); - g_assert (g_date_compare (date, &check) == 0); + g_assert_true (ret); + g_assert_true (g_date_compare (date, &check) == 0); gck_attributes_unref (attrs); g_date_free (date); diff -Nru gcr-3.38.1/gck/test-gck-crypto.c gcr-3.40.0/gck/test-gck-crypto.c --- gcr-3.38.1/gck/test-gck-crypto.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-crypto.c 2021-03-27 08:40:56.318531300 +0000 @@ -58,23 +58,23 @@ /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_MODULE (test->module)); + g_assert_true (GCK_IS_MODULE (test->module)); g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); slots = gck_module_get_slots (test->module, TRUE); - g_assert (slots != NULL); + g_assert_nonnull (slots); test->session = gck_slot_open_session (slots->data, 0, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (test->session)); + g_assert_true (GCK_IS_SESSION (test->session)); g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); slot = gck_session_get_slot (test->session); - g_assert (slot); + g_assert_nonnull (slot); test->session_with_auth = gck_session_from_handle (slot, gck_session_get_handle (test->session), GCK_SESSION_AUTHENTICATE); g_signal_connect (test->session_with_auth, "discard-handle", G_CALLBACK (on_discard_handle_ignore), NULL); - g_assert (test->session_with_auth); + g_assert_nonnull (test->session_with_auth); g_object_add_weak_pointer (G_OBJECT (test->session_with_auth), (gpointer *)&test->session_with_auth); g_object_unref (slot); @@ -88,9 +88,11 @@ g_object_unref (test->module); g_object_unref (test->session_with_auth); - g_assert (test->session == NULL); - g_assert (test->session_with_auth == NULL); - g_assert (test->module == NULL); + egg_test_wait_for_gtask_thread (test->session || test->session_with_auth || test->module); + + g_assert_null (test->session); + g_assert_null (test->session_with_auth); + g_assert_null (test->module); } static void @@ -113,14 +115,14 @@ gck_builder_add_boolean (&builder, method, TRUE); objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL); - g_assert (objects); + g_assert_nonnull (objects); for (l = objects; l; l = g_list_next (l)) { if (mech) { mechs = (gulong *)gck_object_get_data (l->data, CKA_ALLOWED_MECHANISMS, NULL, &n_mechs, NULL); - g_assert (mechs); - g_assert (n_mechs == sizeof (CK_MECHANISM_TYPE)); + g_assert_nonnull (mechs); + g_assert_cmpuint (n_mechs, ==, sizeof (CK_MECHANISM_TYPE)); /* We know all of them only have one allowed mech */ match = (*mechs != mech); @@ -147,7 +149,7 @@ gck_builder_add_string (&builder, CKA_VALUE, value); objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL); - g_assert (objects); + g_assert_nonnull (objects); object = g_object_ref (objects->data); gck_list_unref_free (objects); @@ -162,17 +164,16 @@ gulong check; attrs = gck_object_get (key, NULL, NULL, CKA_CLASS, CKA_VALUE, GCK_INVALID); - g_assert (attrs); + g_assert_nonnull (attrs); if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &check)) g_assert_not_reached (); - g_assert (check == klass); + g_assert_cmpuint (check, ==, klass); attr = gck_attributes_find (attrs, CKA_VALUE); - g_assert (attr); - g_assert (!gck_attribute_is_invalid (attr)); - egg_assert_cmpsize (attr->length, ==, strlen (value)); - g_assert (memcmp (attr->value, value, attr->length) == 0); + g_assert_nonnull (attr); + g_assert_false (gck_attribute_is_invalid (attr)); + g_assert_cmpmem (attr->value, attr->length, value, strlen (value)); gck_attributes_unref (attrs); } @@ -180,10 +181,10 @@ static gboolean authenticate_object (GckSlot *module, GckObject *object, gchar *label, gchar **password) { - g_assert (GCK_IS_MODULE (module)); - g_assert (GCK_IS_OBJECT (object)); - g_assert (password); - g_assert (!*password); + g_assert_true (GCK_IS_MODULE (module)); + g_assert_true (GCK_IS_OBJECT (object)); + g_assert_nonnull (password); + g_assert_null (*password); *password = g_strdup ("booo"); return TRUE; @@ -201,13 +202,13 @@ /* Find the right key */ key = find_key (test->session, CKA_ENCRYPT, CKM_MOCK_CAPITALIZE); - g_assert (key); + g_assert_nonnull (key); /* Simple one */ output = gck_session_encrypt (test->session, key, CKM_MOCK_CAPITALIZE, (const guchar*)"blah blah", 10, &n_output, NULL, &error); g_assert_no_error (error); - g_assert (output); - g_assert (n_output == 10); + g_assert_nonnull (output); + g_assert_cmpuint (n_output, ==, 10); g_assert_cmpstr ((gchar*)output, ==, "BLAH BLAH"); g_free (output); @@ -215,13 +216,13 @@ gck_session_encrypt_async (test->session, key, &mech, (const guchar*)"second chance", 14, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ output = gck_session_encrypt_finish (test->session, result, &n_output, &error); g_assert_no_error (error); - g_assert (output); - g_assert (n_output == 14); + g_assert_nonnull (output); + g_assert_cmpuint (n_output, ==, 14); g_assert_cmpstr ((gchar*)output, ==, "SECOND CHANCE"); g_free (output); @@ -241,13 +242,13 @@ /* Find the right key */ key = find_key (test->session, CKA_DECRYPT, CKM_MOCK_CAPITALIZE); - g_assert (key); + g_assert_nonnull (key); /* Simple one */ output = gck_session_decrypt (test->session, key, CKM_MOCK_CAPITALIZE, (const guchar*)"FRY???", 7, &n_output, NULL, &error); g_assert_no_error (error); - g_assert (output); - g_assert (n_output == 7); + g_assert_nonnull (output); + g_assert_cmpuint (n_output, ==, 7); g_assert_cmpstr ((gchar*)output, ==, "fry???"); g_free (output); @@ -255,13 +256,13 @@ gck_session_decrypt_async (test->session, key, &mech, (const guchar*)"FAT CHANCE", 11, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ output = gck_session_decrypt_finish (test->session, result, &n_output, &error); g_assert_no_error (error); - g_assert (output); - g_assert (n_output == 11); + g_assert_nonnull (output); + g_assert_cmpuint (n_output, ==, 11); g_assert_cmpstr ((gchar*)output, ==, "fat chance"); g_free (output); @@ -281,17 +282,18 @@ /* Find the right key */ key = find_key (test->session, CKA_SIGN, CKM_MOCK_PREFIX); - g_assert (GCK_IS_OBJECT (key)); + g_assert_true (GCK_IS_OBJECT (key)); g_object_add_weak_pointer (G_OBJECT (key), (gpointer *)&key); /* Simple one */ output = gck_session_sign (test->session, key, CKM_MOCK_PREFIX, (const guchar*)"TV Monster", 11, &n_output, NULL, &error); g_assert_error (error, GCK_ERROR, CKR_USER_NOT_LOGGED_IN); - g_assert (output == NULL); + g_assert_null (output); g_error_free (error); g_object_unref (key); - g_assert (key == NULL); + egg_test_wait_for_gtask_thread (key); + g_assert_null (key); } static void @@ -309,12 +311,12 @@ /* Find the right key */ key = find_key (test->session_with_auth, CKA_SIGN, CKM_MOCK_PREFIX); - g_assert (key); + g_assert_nonnull (key); /* Simple one */ output = gck_session_sign (test->session_with_auth, key, CKM_MOCK_PREFIX, (const guchar*)"Labarbara", 10, &n_output, NULL, &error); g_assert_no_error (error); - g_assert (output); + g_assert_nonnull (output); g_assert_cmpuint (n_output, ==, 24); g_assert_cmpstr ((gchar*)output, ==, "signed-prefix:Labarbara"); g_free (output); @@ -323,12 +325,12 @@ gck_session_sign_async (test->session_with_auth, key, &mech, (const guchar*)"Conrad", 7, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ output = gck_session_sign_finish (test->session_with_auth, result, &n_output, &error); g_assert_no_error (error); - g_assert (output); + g_assert_nonnull (output); g_assert_cmpuint (n_output, ==, 17); g_assert_cmpstr ((gchar*)output, ==, "my-prefix:Conrad"); g_free (output); @@ -351,30 +353,30 @@ /* Find the right key */ key = find_key (test->session, CKA_VERIFY, CKM_MOCK_PREFIX); - g_assert (GCK_IS_OBJECT (key)); + g_assert_true (GCK_IS_OBJECT (key)); g_object_add_weak_pointer (G_OBJECT (key), (gpointer *)&key); /* Simple one */ ret = gck_session_verify (test->session, key, CKM_MOCK_PREFIX, (const guchar*)"Labarbara", 10, (const guchar*)"signed-prefix:Labarbara", 24, NULL, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); /* Failure one */ ret = gck_session_verify_full (test->session, key, &mech, (const guchar*)"Labarbara", 10, (const guchar*)"my-prefix:Loborboro", 20, NULL, &error); - g_assert (error != NULL); - g_assert (!ret); + g_assert_nonnull (error); + g_assert_false (ret); g_clear_error (&error); /* Asynchronous one */ gck_session_verify_async (test->session, key, &mech, (const guchar*)"Labarbara", 10, (const guchar*)"my-prefix:Labarbara", 20, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_verify_finish (test->session, result, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); g_object_unref (result); /* Asynchronous failure */ @@ -382,15 +384,16 @@ gck_session_verify_async (test->session, key, &mech, (const guchar*)"Labarbara", 10, (const guchar*)"my-prefix:Labarxoro", 20, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_verify_finish (test->session, result, &error); - g_assert (error != NULL); - g_assert (!ret); + g_assert_nonnull (error); + g_assert_false (ret); g_clear_error (&error); g_object_unref (result); g_object_unref (key); - g_assert (key == NULL); + egg_test_wait_for_gtask_thread (key); + g_assert_null (key); } static void @@ -413,7 +416,7 @@ ret = gck_session_generate_key_pair_full (test->session, &mech, pub_attrs, prv_attrs, &pub_key, &prv_key, NULL, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); g_object_unref (pub_key); g_object_unref (prv_key); @@ -422,20 +425,20 @@ pub_key = prv_key = NULL; ret = gck_session_generate_key_pair_full (test->session, &mech, pub_attrs, prv_attrs, &pub_key, &prv_key, NULL, &error); - g_assert (error != NULL); - g_assert (!ret); + g_assert_nonnull (error); + g_assert_false (ret); g_clear_error (&error); - g_assert (pub_key == NULL); - g_assert (prv_key == NULL); + g_assert_null (pub_key); + g_assert_null (prv_key); /* Asynchronous one */ mech.type = CKM_MOCK_GENERATE; gck_session_generate_key_pair_async (test->session, &mech, pub_attrs, prv_attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_generate_key_pair_finish (test->session, result, &pub_key, &prv_key, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); g_object_unref (result); g_object_unref (pub_key); g_object_unref (prv_key); @@ -446,14 +449,14 @@ pub_key = prv_key = NULL; gck_session_generate_key_pair_async (test->session, &mech, pub_attrs, prv_attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_generate_key_pair_finish (test->session, result, &pub_key, &prv_key, &error); - g_assert (error != NULL); - g_assert (!ret); + g_assert_nonnull (error); + g_assert_false (ret); g_clear_error (&error); g_object_unref (result); - g_assert (pub_key == NULL); - g_assert (prv_key == NULL); + g_assert_null (pub_key); + g_assert_null (prv_key); gck_attributes_unref (pub_attrs); gck_attributes_unref (prv_attrs); @@ -475,25 +478,23 @@ /* Simple One */ output = gck_session_wrap_key (test->session, wrapper, CKM_MOCK_WRAP, wrapped, &n_output, NULL, &error); g_assert_no_error (error); - g_assert (output); - egg_assert_cmpsize (n_output, ==, 5); - g_assert (memcmp (output, "value", 5) == 0); + g_assert_nonnull (output); + g_assert_cmpmem (output, n_output, "value", 5); g_free (output); /* Full One*/ output = gck_session_wrap_key_full (test->session, wrapper, &mech, wrapped, &n_output, NULL, &error); g_assert_no_error (error); - g_assert (output); - egg_assert_cmpsize (n_output, ==, 5); - g_assert (memcmp (output, "value", 5) == 0); + g_assert_nonnull (output); + g_assert_cmpmem (output, n_output, "value", 5); g_free (output); /* Failure one */ mech.type = 0; n_output = 0; output = gck_session_wrap_key_full (test->session, wrapper, &mech, wrapped, &n_output, NULL, &error); - g_assert (error != NULL); - g_assert (!output); + g_assert_nonnull (error); + g_assert_null (output); g_clear_error (&error); egg_assert_cmpsize (n_output, ==, 0); @@ -501,12 +502,11 @@ mech.type = CKM_MOCK_WRAP; gck_session_wrap_key_async (test->session, wrapper, &mech, wrapped, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); output = gck_session_wrap_key_finish (test->session, result, &n_output, &error); g_assert_no_error (error); - g_assert (output); - egg_assert_cmpsize (n_output, ==, 5); - g_assert (memcmp (output, "value", 5) == 0); + g_assert_nonnull (output); + g_assert_cmpmem (output, n_output, "value", 5); g_object_unref (result); g_free (output); @@ -516,10 +516,10 @@ n_output = 0; gck_session_wrap_key_async (test->session, wrapper, &mech, wrapped, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); output = gck_session_wrap_key_finish (test->session, result, &n_output, &error); - g_assert (error != NULL); - g_assert (!output); + g_assert_nonnull (error); + g_assert_null (output); g_clear_error (&error); egg_assert_cmpsize (n_output, ==, 0); g_object_unref (result); @@ -545,25 +545,25 @@ /* Full One*/ unwrapped = gck_session_unwrap_key_full (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, &error); g_assert_no_error (error); - g_assert (GCK_IS_OBJECT (unwrapped)); + g_assert_true (GCK_IS_OBJECT (unwrapped)); check_key_with_value (test->session, unwrapped, CKO_SECRET_KEY, "special"); g_object_unref (unwrapped); /* Failure one */ mech.type = 0; unwrapped = gck_session_unwrap_key_full (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, &error); - g_assert (error != NULL); - g_assert (!unwrapped); + g_assert_nonnull (error); + g_assert_null (unwrapped); g_clear_error (&error); /* Asynchronous one */ mech.type = CKM_MOCK_WRAP; gck_session_unwrap_key_async (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); unwrapped = gck_session_unwrap_key_finish (test->session, result, &error); g_assert_no_error (error); - g_assert (GCK_IS_OBJECT (unwrapped)); + g_assert_true (GCK_IS_OBJECT (unwrapped)); check_key_with_value (test->session, unwrapped, CKO_SECRET_KEY, "special"); g_object_unref (unwrapped); g_object_unref (result); @@ -573,10 +573,10 @@ mech.type = 0; gck_session_unwrap_key_async (test->session, wrapper, &mech, (const guchar *)"special", 6, attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); unwrapped = gck_session_unwrap_key_finish (test->session, result, &error); - g_assert (error != NULL); - g_assert (!unwrapped); + g_assert_nonnull (error); + g_assert_null (unwrapped); g_clear_error (&error); g_object_unref (result); @@ -601,25 +601,25 @@ /* Full One*/ derived = gck_session_derive_key_full (test->session, wrapper, &mech, attrs, NULL, &error); g_assert_no_error (error); - g_assert (GCK_IS_OBJECT (derived)); + g_assert_true (GCK_IS_OBJECT (derived)); check_key_with_value (test->session, derived, CKO_SECRET_KEY, "derived"); g_object_unref (derived); /* Failure one */ mech.type = 0; derived = gck_session_derive_key_full (test->session, wrapper, &mech, attrs, NULL, &error); - g_assert (error != NULL); - g_assert (!derived); + g_assert_nonnull (error); + g_assert_null (derived); g_clear_error (&error); /* Asynchronous one */ mech.type = CKM_MOCK_DERIVE; gck_session_derive_key_async (test->session, wrapper, &mech, attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); derived = gck_session_derive_key_finish (test->session, result, &error); g_assert_no_error (error); - g_assert (GCK_IS_OBJECT (derived)); + g_assert_true (GCK_IS_OBJECT (derived)); check_key_with_value (test->session, derived, CKO_SECRET_KEY, "derived"); g_object_unref (derived); g_object_unref (result); @@ -629,10 +629,10 @@ mech.type = 0; gck_session_derive_key_async (test->session, wrapper, &mech, attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); derived = gck_session_derive_key_finish (test->session, result, &error); - g_assert (error != NULL); - g_assert (!derived); + g_assert_nonnull (error); + g_assert_null (derived); g_clear_error (&error); g_object_unref (result); diff -Nru gcr-3.38.1/gck/test-gck-enumerator.c gcr-3.40.0/gck/test-gck-enumerator.c --- gcr-3.38.1/gck/test-gck-enumerator.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-enumerator.c 2021-03-27 08:40:56.318531300 +0000 @@ -50,7 +50,7 @@ /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_MODULE (test->module)); + g_assert_true (GCK_IS_MODULE (test->module)); g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); test->modules = g_list_append (NULL, g_object_ref (test->module)); @@ -62,9 +62,8 @@ gck_list_unref_free (test->modules); g_object_unref (test->module); - g_assert (test->module == NULL); - - g_thread_pool_stop_unused_threads (); + egg_test_wait_for_gtask_thread (test->module); + g_assert_null (test->module); } static void @@ -76,10 +75,10 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); g_object_get (en, "object-type", &object_type, NULL); - g_assert (object_type == GCK_TYPE_OBJECT); + g_assert_true (object_type == GCK_TYPE_OBJECT); g_object_unref (en); } @@ -94,7 +93,7 @@ uri_data = gck_uri_data_new (); slots = gck_module_get_slots (test->module, FALSE); en = _gck_enumerator_new_for_slots (slots, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); g_object_unref (en); gck_list_unref_free (slots); } @@ -109,10 +108,10 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); obj = gck_enumerator_next (en, NULL, &error); - g_assert (GCK_IS_OBJECT (obj)); + g_assert_true (GCK_IS_OBJECT (obj)); g_object_unref (obj); g_object_unref (en); @@ -130,10 +129,10 @@ uri_data = gck_uri_data_new (); slots = gck_module_get_slots (test->module, FALSE); en = _gck_enumerator_new_for_slots (slots, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); obj = gck_enumerator_next (en, NULL, &error); - g_assert (GCK_IS_OBJECT (obj)); + g_assert_true (GCK_IS_OBJECT (obj)); g_object_unref (obj); g_object_unref (en); @@ -150,17 +149,17 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); obj = gck_enumerator_next (en, NULL, &error); g_assert_no_error (error); - g_assert (GCK_IS_OBJECT (obj)); + g_assert_true (GCK_IS_OBJECT (obj)); obj2 = gck_enumerator_next (en, NULL, &error); g_assert_no_error (error); - g_assert (GCK_IS_OBJECT (obj2)); + g_assert_true (GCK_IS_OBJECT (obj2)); - g_assert (!gck_object_equal (obj, obj2)); + g_assert_false (gck_object_equal (obj, obj2)); g_object_unref (obj); g_object_unref (obj2); @@ -177,13 +176,13 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); objects = gck_enumerator_next_n (en, -1, NULL, &error); g_assert_no_error (error); g_assert_cmpint (g_list_length (objects), ==, 5); for (l = objects; l; l = g_list_next (l)) - g_assert (GCK_IS_OBJECT (l->data)); + g_assert_true (GCK_IS_OBJECT (l->data)); gck_list_unref_free (objects); g_object_unref (en); @@ -208,17 +207,17 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); gck_enumerator_next_async (en, -1, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result); + g_assert_nonnull (result); objects = gck_enumerator_next_finish (en, result, &error); g_assert_no_error (error); g_assert_cmpint (g_list_length (objects), ==, 5); for (l = objects; l; l = g_list_next (l)) - g_assert (GCK_IS_OBJECT (l->data)); + g_assert_true (GCK_IS_OBJECT (l->data)); g_object_unref (result); gck_list_unref_free (objects); @@ -238,16 +237,17 @@ GList *slots; slots = gck_module_get_slots (test->module, FALSE); - g_assert (slots != NULL && GCK_IS_SLOT (slots->data)); + g_assert_nonnull (slots); + g_assert_true (GCK_IS_SLOT (slots->data)); session = gck_session_open (slots->data, 0, NULL, NULL, &error); g_assert_no_error (error); en = gck_session_enumerate_objects (session, gck_builder_end (&builder)); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); obj = gck_enumerator_next (en, NULL, &error); - g_assert (GCK_IS_OBJECT (obj)); + g_assert_true (GCK_IS_OBJECT (obj)); g_object_unref (obj); g_object_unref (en); @@ -268,12 +268,12 @@ gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); objects = gck_enumerator_next_n (en, -1, NULL, &error); g_assert_no_error (error); g_assert_cmpint (g_list_length (objects), ==, 1); - g_assert (GCK_IS_OBJECT (objects->data)); + g_assert_true (GCK_IS_OBJECT (objects->data)); gck_list_unref_free (objects); g_object_unref (en); @@ -292,7 +292,7 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en); interaction = mock_interaction_new ("booo"); @@ -301,20 +301,20 @@ check = NULL; g_object_get (en, "interaction", &check, NULL); - g_assert (interaction == check); + g_assert_true (interaction == check); g_object_unref (interaction); g_object_unref (check); obj = gck_enumerator_next (en, NULL, &error); - g_assert (GCK_IS_OBJECT (obj)); + g_assert_true (GCK_IS_OBJECT (obj)); g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj); g_object_unref (obj); g_object_unref (en); - g_assert (en == NULL); - g_assert (obj == NULL); - g_assert (interaction == NULL); + g_assert_null (en); + g_assert_null (obj); + g_assert_null (interaction); } static gboolean @@ -324,11 +324,11 @@ gchar **password, gpointer unused) { - g_assert (unused == GUINT_TO_POINTER (35)); - g_assert (password != NULL); - g_assert (*password == NULL); - g_assert (GCK_IS_MODULE (module)); - g_assert (GCK_IS_SLOT (slot)); + g_assert_true (unused == GUINT_TO_POINTER (35)); + g_assert_nonnull (password); + g_assert_null (*password); + g_assert_true (GCK_IS_MODULE (module)); + g_assert_true (GCK_IS_SLOT (slot)); *password = g_strdup ("booo"); return TRUE; @@ -349,11 +349,11 @@ uri_data = gck_uri_data_new (); en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en); obj = gck_enumerator_next (en, NULL, &error); - g_assert (GCK_IS_OBJECT (obj)); + g_assert_true (GCK_IS_OBJECT (obj)); g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj); g_object_unref (obj); @@ -361,8 +361,8 @@ g_signal_handler_disconnect (test->modules->data, sig); - g_assert (obj == NULL); - g_assert (en == NULL); + g_assert_null (obj); + g_assert_null (en); } static void @@ -377,11 +377,11 @@ uri_data->token_info = g_new0 (GckTokenInfo, 1); uri_data->token_info->label = g_strdup ("Invalid token name"); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); objects = gck_enumerator_next_n (en, -1, NULL, &error); g_assert_cmpint (g_list_length (objects), ==, 0); - g_assert (error == NULL); + g_assert_no_error (error); gck_list_unref_free (objects); g_object_unref (en); @@ -453,9 +453,9 @@ switch (prop_id) { case PROP_ATTRIBUTES: - g_assert (self->attrs == NULL); + g_assert_null (self->attrs); self->attrs = g_value_dup_boxed (value); - g_assert (self->attrs != NULL); + g_assert_nonnull (self->attrs); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); @@ -525,8 +525,8 @@ for (l = objects; l != NULL; l = g_list_next (l)) { mock = l->data; - g_assert (G_TYPE_CHECK_INSTANCE_TYPE (mock, mock_object_get_type ())); - g_assert (mock->attrs != NULL); + g_assert_true (G_TYPE_CHECK_INSTANCE_TYPE (mock, mock_object_get_type ())); + g_assert_nonnull (mock->attrs); } gck_list_unref_free (objects); @@ -553,9 +553,9 @@ if (object == NULL) break; - g_assert (G_TYPE_CHECK_INSTANCE_TYPE (object, mock_object_get_type ())); + g_assert_true (G_TYPE_CHECK_INSTANCE_TYPE (object, mock_object_get_type ())); mock = (MockObject *)object; - g_assert (mock->attrs != NULL); + g_assert_nonnull (mock->attrs); g_object_unref (object); } diff -Nru gcr-3.38.1/gck/test-gck-module.c gcr-3.40.0/gck/test-gck-module.c --- gcr-3.38.1/gck/test-gck-module.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-module.c 2021-03-27 08:40:56.318531300 +0000 @@ -43,7 +43,7 @@ /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (test->module); + g_assert_nonnull (test->module); g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); } @@ -51,7 +51,8 @@ teardown (Test *test, gconstpointer unused) { g_object_unref (test->module); - g_assert (test->module == NULL); + egg_test_wait_for_gtask_thread (test->module); + g_assert_null (test->module); } static void @@ -74,12 +75,12 @@ NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ module = gck_module_initialize_finish (result, &error); g_assert_no_error (error); - g_assert (GCK_IS_MODULE (module)); + g_assert_true (GCK_IS_MODULE (module)); g_object_unref (result); g_object_unref (module); @@ -95,14 +96,14 @@ /* Shouldn't be able to load modules */ invalid = gck_module_initialize ("blah-blah-non-existant", NULL, &error); g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM); - g_assert (invalid == NULL); + g_assert_null (invalid); g_clear_error (&error); /* Shouldn't be able to load any file successfully */ invalid = gck_module_initialize ("/usr/lib/libm.so", NULL, &error); g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM); - g_assert (invalid == NULL); + g_assert_null (invalid); g_clear_error (&error); } @@ -115,17 +116,17 @@ guint hash; hash = gck_module_hash (test->module); - g_assert (hash != 0); + g_assert_cmpuint (hash, !=, 0); - g_assert (gck_module_equal (test->module, test->module)); + g_assert_true (gck_module_equal (test->module, test->module)); other = gck_module_new (gck_module_get_functions (test->module)); obj = g_object_new (G_TYPE_OBJECT, NULL); - g_assert (gck_module_equal (test->module, other)); + g_assert_true (gck_module_equal (test->module, other)); /* TODO: Could do with another test for inequality */ - g_assert (!gck_module_equal (test->module, obj)); + g_assert_false (gck_module_equal (test->module, obj)); g_object_unref (other); g_object_unref (obj); @@ -137,8 +138,8 @@ gchar *path; g_object_get (test->module, "path", &path, NULL); - g_assert (path != NULL && "no module-path"); - g_assert (strcmp (_GCK_TEST_MODULE_PATH, path) == 0 && "module path wrong"); + g_assert_nonnull (path); + g_assert_cmpstr (_GCK_TEST_MODULE_PATH, ==, path); g_free (path); } @@ -148,15 +149,15 @@ GckModuleInfo *info; info = gck_module_get_info (test->module); - g_assert (info != NULL && "no module info"); + g_assert_nonnull (info); - g_assert (info->pkcs11_version_major == CRYPTOKI_VERSION_MAJOR && "wrong major version"); - g_assert (info->pkcs11_version_minor == CRYPTOKI_VERSION_MINOR && "wrong minor version"); - g_assert (strcmp ("TEST MANUFACTURER", info->manufacturer_id) == 0); - g_assert (strcmp ("TEST LIBRARY", info->library_description) == 0); - g_assert (0 == info->flags); - g_assert (45 == info->library_version_major); - g_assert (145 == info->library_version_minor); + g_assert_cmpuint (info->pkcs11_version_major, ==, CRYPTOKI_VERSION_MAJOR); + g_assert_cmpuint (info->pkcs11_version_minor, ==, CRYPTOKI_VERSION_MINOR); + g_assert_cmpstr ("TEST MANUFACTURER", ==, info->manufacturer_id); + g_assert_cmpstr ("TEST LIBRARY", ==, info->library_description); + g_assert_cmpuint (0, ==, info->flags); + g_assert_cmpuint (45, ==, info->library_version_major); + g_assert_cmpuint (145, ==, info->library_version_minor); gck_module_info_free (info); } diff -Nru gcr-3.38.1/gck/test-gck-modules.c gcr-3.40.0/gck/test-gck-modules.c --- gcr-3.38.1/gck/test-gck-modules.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-modules.c 2021-03-27 08:40:56.318531300 +0000 @@ -49,7 +49,7 @@ /* Successful load */ module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_MODULE (module)); + g_assert_true (GCK_IS_MODULE (module)); test->modules = g_list_append (NULL, module); } @@ -71,12 +71,12 @@ gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); en = gck_modules_enumerate_objects (test->modules, gck_builder_end (&builder), 0); - g_assert (GCK_IS_ENUMERATOR (en)); + g_assert_true (GCK_IS_ENUMERATOR (en)); objects = gck_enumerator_next_n (en, -1, NULL, &error); g_assert_no_error (error); g_assert_cmpint (g_list_length (objects), ==, 1); - g_assert (GCK_IS_OBJECT (objects->data)); + g_assert_true (GCK_IS_OBJECT (objects->data)); gck_list_unref_free (objects); g_object_unref (en); @@ -90,7 +90,7 @@ GError *error = NULL; slot = gck_modules_token_for_uri (test->modules, "pkcs11:token=TEST%20LABEL", &error); - g_assert (GCK_IS_SLOT (slot)); + g_assert_true (GCK_IS_SLOT (slot)); g_object_unref (slot); } @@ -102,8 +102,8 @@ GError *error = NULL; slot = gck_modules_token_for_uri (test->modules, "pkcs11:token=UNKNOWN", &error); - g_assert (slot == NULL); - g_assert (error == NULL); + g_assert_null (slot); + g_assert_no_error (error); } static void @@ -113,9 +113,8 @@ GError *error = NULL; slot = gck_modules_token_for_uri (test->modules, "http://invalid.uri", &error); - g_assert (slot == NULL); - g_assert (error != NULL); - g_assert (g_error_matches (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX)); + g_assert_null (slot); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); g_error_free (error); } @@ -126,7 +125,7 @@ GError *error = NULL; object = gck_modules_object_for_uri (test->modules, "pkcs11:object=Public%20Capitalize%20Key;objecttype=public", 0, &error); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); g_object_unref (object); } @@ -137,8 +136,8 @@ GError *error = NULL; object = gck_modules_object_for_uri (test->modules, "pkcs11:object=Unknown%20Label", 0, &error); - g_assert (object == NULL); - g_assert (error == NULL); + g_assert_null (object); + g_assert_null (error); } static void @@ -148,9 +147,8 @@ GError *error = NULL; object = gck_modules_object_for_uri (test->modules, "http://invalid.uri", 0, &error); - g_assert (object == NULL); - g_assert (error != NULL); - g_assert (g_error_matches (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX)); + g_assert_null (object); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); g_error_free (error); } @@ -161,8 +159,8 @@ GError *error = NULL; objects = gck_modules_objects_for_uri (test->modules, "pkcs11:token=TEST%20LABEL", 0, &error); - g_assert (objects); - g_assert (!error); + g_assert_nonnull (objects); + g_assert_no_error (error); g_assert_cmpint (g_list_length (objects), ==, 5); gck_list_unref_free (objects); @@ -176,12 +174,12 @@ GError *error = NULL; en = gck_modules_enumerate_uri (test->modules, "pkcs11:token=TEST%20LABEL", 0, &error); - g_assert (GCK_IS_ENUMERATOR (en)); - g_assert (!error); + g_assert_true (GCK_IS_ENUMERATOR (en)); + g_assert_no_error (error); objects = gck_enumerator_next_n (en, -1, NULL, &error); g_assert_cmpint (g_list_length (objects), ==, 5); - g_assert (!error); + g_assert_no_error (error); g_object_unref (en); gck_list_unref_free (objects); diff -Nru gcr-3.38.1/gck/test-gck-object.c gcr-3.40.0/gck/test-gck-object.c --- gcr-3.38.1/gck/test-gck-object.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-object.c 2021-03-27 08:40:56.319531200 +0000 @@ -51,10 +51,10 @@ /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_MODULE (test->module)); + g_assert_true (GCK_IS_MODULE (test->module)); slots = gck_module_get_slots (test->module, TRUE); - g_assert (slots != NULL); + g_assert_nonnull (slots); test->slot = GCK_SLOT (slots->data); g_object_ref (test->slot); @@ -62,11 +62,11 @@ test->session = gck_slot_open_session (test->slot, 0, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (test->session)); + g_assert_true (GCK_IS_SESSION (test->session)); /* Our module always exports a token object with this */ test->object = gck_object_from_handle (test->session, 2); - g_assert (test->object != NULL); + g_assert_nonnull (test->object); } static void @@ -85,11 +85,11 @@ GckModule *mod; CK_OBJECT_HANDLE handle; g_object_get (test->object, "session", &sess, "module", &mod, "handle", &handle, NULL); - g_assert (test->session == sess); + g_assert_true (test->session == sess); g_object_unref (sess); - g_assert (test->module == mod); + g_assert_true (test->module == mod); g_object_unref (mod); - g_assert (handle == 2); + g_assert_cmpuint (handle, ==, 2); } static void @@ -103,30 +103,30 @@ guint hash; hash = gck_object_hash (test->object); - g_assert (hash != 0); + g_assert_cmpuint (hash, !=, 0); - g_assert (gck_object_equal (test->object, test->object)); + g_assert_true (gck_object_equal (test->object, test->object)); other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", GCK_MOCK_SLOT_TWO_ID, NULL); other_session = gck_slot_open_session (other_slot, 0, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (other_session)); + g_assert_true (GCK_IS_SESSION (other_session)); other_object = gck_object_from_handle (other_session, gck_object_get_handle (test->object)); - g_assert (!gck_object_equal (test->object, other_object)); + g_assert_false (gck_object_equal (test->object, other_object)); g_object_unref (other_slot); g_object_unref (other_session); g_object_unref (other_object); obj = g_object_new (G_TYPE_OBJECT, NULL); - g_assert (!gck_object_equal (test->object, obj)); + g_assert_false (gck_object_equal (test->object, obj)); g_object_unref (obj); other_object = gck_object_from_handle (test->session, 383838); - g_assert (!gck_object_equal (test->object, other_object)); + g_assert_false (gck_object_equal (test->object, other_object)); g_object_unref (other_object); other_object = gck_object_from_handle (test->session, gck_object_get_handle (test->object)); - g_assert (gck_object_equal (test->object, other_object)); + g_assert_true (gck_object_equal (test->object, other_object)); g_object_unref (other_object); } @@ -155,7 +155,7 @@ attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); object = gck_session_create_object (test->session, attrs, NULL, &err); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); g_assert_no_error (err); last_handle = gck_object_get_handle (object); @@ -164,14 +164,14 @@ /* Using async */ gck_session_create_object_async (test->session, attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); object = gck_session_create_object_finish (test->session, result, &err); g_object_unref (result); g_assert_no_error (err); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); - g_assert (last_handle != gck_object_get_handle (object)); + g_assert_cmpuint (last_handle, !=, gck_object_get_handle (object)); g_object_unref (object); gck_attributes_unref (attrs); @@ -195,27 +195,27 @@ /* Using simple */ object = gck_session_create_object (test->session, attrs, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); ret = gck_object_destroy (object, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); g_object_unref (object); /* Using async */ object = gck_session_create_object (test->session, attrs, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); /* Using async */ gck_object_destroy_async (object, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_object_destroy_finish (object, result, &err); g_object_unref (result); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); g_object_unref (object); gck_attributes_unref (attrs); @@ -238,8 +238,8 @@ attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); g_assert_no_error (err); if (attrs != NULL) { - g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); - g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); + g_assert_true (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); + g_assert_true (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); g_free (value); value = NULL; } gck_attributes_unref (attrs); @@ -247,23 +247,23 @@ /* Full */ attrs = gck_object_get_full (test->object, attr_types, G_N_ELEMENTS (attr_types), NULL, &err); g_assert_no_error (err); - g_assert (attrs); - g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); - g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); + g_assert_nonnull (attrs); + g_assert_true (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); + g_assert_true (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); g_free (value); value = NULL; gck_attributes_unref (attrs); /* Async */ gck_object_get_async (test->object, attr_types, G_N_ELEMENTS (attr_types), NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); attrs = gck_object_get_finish (test->object, result, &err); g_object_unref (result); g_assert_no_error (err); - g_assert (attrs); - g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); - g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); + g_assert_nonnull (attrs); + g_assert_true (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == CKO_DATA); + g_assert_true (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "TEST LABEL") == 0); g_free (value); value = NULL; gck_attributes_unref (attrs); } @@ -279,30 +279,30 @@ /* Simple */ klass = (gulong *)gck_object_get_data (test->object, CKA_CLASS, NULL, &n_data, &err); g_assert_no_error (err); - g_assert (klass); - g_assert (n_data == sizeof (CK_OBJECT_CLASS)); - g_assert (*klass == CKO_DATA); + g_assert_nonnull (klass); + g_assert_cmpuint (n_data, ==, sizeof (CK_OBJECT_CLASS)); + g_assert_true (*klass == CKO_DATA); g_free (klass); /* Full */ klass = (gulong *)gck_object_get_data_full (test->object, CKA_CLASS, NULL, NULL, &n_data, &err); g_assert_no_error (err); - g_assert (klass); - g_assert (n_data == sizeof (CK_OBJECT_CLASS)); - g_assert (*klass == CKO_DATA); + g_assert_nonnull (klass); + g_assert_cmpuint (n_data, ==, sizeof (CK_OBJECT_CLASS)); + g_assert_true (*klass == CKO_DATA); g_free (klass); /* Async */ gck_object_get_data_async (test->object, CKA_CLASS, NULL, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); klass = (gulong *)gck_object_get_data_finish (test->object, result, &n_data, &err); g_object_unref (result); g_assert_no_error (err); - g_assert (klass); - g_assert (n_data == sizeof (CK_OBJECT_CLASS)); - g_assert (*klass == CKO_DATA); + g_assert_nonnull (klass); + g_assert_cmpuint (n_data, ==, sizeof (CK_OBJECT_CLASS)); + g_assert_true (*klass == CKO_DATA); g_free (klass); } @@ -324,10 +324,10 @@ /* Full */ ret = gck_object_set (test->object, gck_builder_end (&builder), NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); - g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == 6); - g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "CHANGE TWO") == 0); + g_assert_true (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == 6); + g_assert_true (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "CHANGE TWO") == 0); g_free (value); value = NULL; gck_attributes_unref (attrs); @@ -337,15 +337,15 @@ /* Async */ gck_object_set_async (test->object, gck_builder_end (&builder), NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_object_set_finish (test->object, result, &err); g_object_unref (result); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); - g_assert (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == 7); - g_assert (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "CHANGE THREE") == 0); + g_assert_true (gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) && klass == 7); + g_assert_true (gck_attributes_find_string (attrs, CKA_LABEL, &value) && strcmp (value, "CHANGE THREE") == 0); g_free (value); value = NULL; gck_attributes_unref (attrs); } @@ -373,24 +373,24 @@ gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL"); objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err); g_assert_no_error (err); - g_assert (g_list_length (objects) == 1); + g_assert_cmpuint (g_list_length (objects), ==, 1); gck_list_unref_free (objects); /* Full, All */ objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err); g_assert_no_error (err); - g_assert (g_list_length (objects) > 1); + g_assert_cmpuint (g_list_length (objects), >, 1); gck_list_unref_free (objects); /* Async, None */ gck_builder_add_string (&builder, CKA_LABEL, "blah blah"); gck_session_find_objects_async (test->session, gck_builder_end (&builder), NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); objects = gck_session_find_objects_finish (test->session, result, &err); g_object_unref (result); - g_assert (objects == NULL); + g_assert_null (objects); gck_list_unref_free (objects); } diff -Nru gcr-3.38.1/gck/test-gck-session.c gcr-3.40.0/gck/test-gck-session.c --- gcr-3.38.1/gck/test-gck-session.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-session.c 2021-03-27 08:40:56.319531200 +0000 @@ -50,11 +50,11 @@ /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_MODULE (test->module)); + g_assert_true (GCK_IS_MODULE (test->module)); g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module); slots = gck_module_get_slots (test->module, TRUE); - g_assert (slots != NULL); + g_assert_nonnull (slots); test->slot = GCK_SLOT (slots->data); g_object_ref (test->slot); @@ -63,7 +63,7 @@ test->session = gck_slot_open_session (test->slot, 0, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (test->session)); + g_assert_true (GCK_IS_SESSION (test->session)); g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); } @@ -74,9 +74,11 @@ g_object_unref (test->slot); g_object_unref (test->module); - g_assert (test->session == NULL); - g_assert (test->slot == NULL); - g_assert (test->module == NULL); + egg_test_wait_for_gtask_thread (test->session || test->slot || test->module); + + g_assert_null (test->session); + g_assert_null (test->slot); + g_assert_null (test->module); } static void @@ -87,13 +89,13 @@ gulong handle; g_object_get (test->session, "module", &mod, "handle", &handle, "slot", &sl, NULL); - g_assert (mod == test->module); - g_assert (sl == test->slot); + g_assert_true (mod == test->module); + g_assert_true (sl == test->slot); g_object_unref (mod); g_object_unref (sl); - g_assert (handle != 0); - g_assert (gck_session_get_handle (test->session) == handle); + g_assert_cmpuint (handle, !=, 0); + g_assert_cmpuint (gck_session_get_handle (test->session), ==, handle); } static void @@ -102,11 +104,11 @@ GckSessionInfo *info; info = gck_session_get_info (test->session); - g_assert (info != NULL && "no session info"); + g_assert_nonnull (info); - g_assert (info->slot_id == gck_slot_get_handle (test->slot)); - g_assert ((info->flags & CKF_SERIAL_SESSION) == CKF_SERIAL_SESSION); - g_assert (info->device_error == 1414); + g_assert_cmpuint (info->slot_id, ==, gck_slot_get_handle (test->slot)); + g_assert_cmphex ((info->flags & CKF_SERIAL_SESSION), ==, CKF_SERIAL_SESSION); + g_assert_cmpuint (info->device_error, ==, 1414); gck_session_info_free (info); } @@ -127,7 +129,7 @@ sess = gck_slot_open_session (test->slot, 0, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (sess)); + g_assert_true (GCK_IS_SESSION (sess)); g_object_unref (sess); @@ -135,20 +137,21 @@ gck_slot_open_session_async (test->slot, 0, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ g_object_add_weak_pointer (G_OBJECT (result), (gpointer *)&result); sess = gck_slot_open_session_finish (test->slot, result, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (sess)); + g_assert_true (GCK_IS_SESSION (sess)); g_object_add_weak_pointer (G_OBJECT (sess), (gpointer *)&sess); g_object_unref (result); - g_assert (result == NULL); + g_assert_null (result); g_object_unref (sess); - g_assert (sess == NULL); + egg_test_wait_for_gtask_thread (sess); + g_assert_null (sess); } static void @@ -161,7 +164,7 @@ sess = gck_session_open (test->slot, 0, NULL, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (sess)); + g_assert_true (GCK_IS_SESSION (sess)); g_object_unref (sess); @@ -169,12 +172,12 @@ gck_session_open_async (test->slot, 0, NULL, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ sess = gck_session_open_finish (result, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (sess)); + g_assert_true (GCK_IS_SESSION (sess)); g_object_unref (result); g_object_unref (sess); @@ -193,12 +196,12 @@ CK_RV rv; funcs = gck_module_get_functions (test->module); - g_assert (funcs != NULL); + g_assert_nonnull (funcs); rv = funcs->C_OpenSession (gck_slot_get_handle (test->slot), CKF_SERIAL_SESSION, NULL, NULL, &handle); gck_assert_cmprv (rv, ==, CKR_OK); - g_assert (handle != 0); + g_assert_cmpuint (handle, !=, 0); session = g_initable_new (GCK_TYPE_SESSION, NULL, &error, "slot", test->slot, @@ -206,14 +209,14 @@ NULL); g_assert_no_error (error); - g_assert (GCK_IS_SESSION (session)); + g_assert_true (GCK_IS_SESSION (session)); gck_assert_cmpulong (handle, ==, gck_session_get_handle (session)); g_object_unref (session); rv = funcs->C_OpenSession (gck_slot_get_handle (test->slot), CKF_SERIAL_SESSION, NULL, NULL, &handle); gck_assert_cmprv (rv, ==, CKR_OK); - g_assert (handle != 0); + g_assert_cmpuint (handle, !=, 0); /* Test opening async */ g_async_initable_new_async (GCK_TYPE_SESSION, G_PRIORITY_DEFAULT, NULL, @@ -223,14 +226,14 @@ NULL); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ source = g_async_result_get_source_object (result); session = GCK_SESSION (g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, &error)); g_object_unref (source); g_assert_no_error (error); - g_assert (GCK_IS_SESSION (session)); + g_assert_true (GCK_IS_SESSION (session)); gck_assert_cmpulong (handle, ==, gck_session_get_handle (session)); g_object_unref (result); @@ -250,7 +253,7 @@ sess = gck_session_open (test->slot, GCK_SESSION_LOGIN_USER, interaction, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (sess)); + g_assert_true (GCK_IS_SESSION (sess)); g_object_unref (sess); @@ -258,12 +261,12 @@ gck_session_open_async (test->slot, GCK_SESSION_LOGIN_USER, interaction, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); /* Get the result */ sess = gck_session_open_finish (result, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (sess)); + g_assert_true (GCK_IS_SESSION (sess)); g_object_unref (interaction); g_object_unref (result); @@ -281,30 +284,30 @@ /* init pin */ ret = gck_session_init_pin (test->session, (guchar*)"booo", 4, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); /* set pin */ ret = gck_session_set_pin (test->session, (guchar*)"booo", 4, (guchar*)"tooo", 4, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); /* init pin async */ gck_session_init_pin_async (test->session, (guchar*)"booo", 4, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_init_pin_finish (test->session, result, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); g_object_unref (result); result = NULL; /* set pin async */ gck_session_set_pin_async (test->session, (guchar*)"booo", 4, (guchar*)"tooo", 4, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_set_pin_finish (test->session, result, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); g_object_unref (result); result = NULL; } @@ -320,14 +323,14 @@ /* login/logout */ ret = gck_session_login (test->session, CKU_USER, (guchar*)"booo", 4, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); state = gck_session_get_state (test->session); gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS); ret = gck_session_logout (test->session, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); state = gck_session_get_state (test->session); gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); @@ -335,11 +338,11 @@ /* login async */ gck_session_login_async (test->session, CKU_USER, (guchar*)"booo", 4, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_login_finish (test->session, result, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); g_object_unref (result); result = NULL; @@ -350,11 +353,11 @@ /* logout async */ gck_session_logout_async (test->session, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_logout_finish (test->session, result, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); state = gck_session_get_state (test->session); gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); @@ -378,14 +381,14 @@ /* login/logout */ ret = gck_session_login_interactive (test->session, CKU_USER, interaction, NULL, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); state = gck_session_get_state (test->session); gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS); ret = gck_session_logout (test->session, NULL, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); state = gck_session_get_state (test->session); gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); @@ -393,11 +396,11 @@ /* login async */ gck_session_login_interactive_async (test->session, CKU_USER, interaction, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); ret = gck_session_login_interactive_finish (test->session, result, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); g_object_unref (result); result = NULL; @@ -407,7 +410,7 @@ ret = gck_session_logout (test->session, NULL, &error); g_assert_no_error (error); - g_assert (ret); + g_assert_true (ret); state = gck_session_get_state (test->session); gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION); @@ -418,11 +421,11 @@ static gboolean authenticate_token (GckModule *module, GckSlot *slot, gchar *label, gchar **password, gpointer unused) { - g_assert (unused == GUINT_TO_POINTER (35)); - g_assert (password != NULL); - g_assert (*password == NULL); - g_assert (GCK_IS_MODULE (module)); - g_assert (GCK_IS_SLOT (slot)); + g_assert_true (unused == GUINT_TO_POINTER (35)); + g_assert_nonnull (password); + g_assert_null (*password); + g_assert_true (GCK_IS_MODULE (module)); + g_assert_true (GCK_IS_SLOT (slot)); *password = g_strdup ("booo"); return TRUE; @@ -446,52 +449,52 @@ /* Try to do something that requires a login */ object = gck_session_create_object (test->session, attrs, NULL, &err); - g_assert (!object); - g_assert (err && err->code == CKR_USER_NOT_LOGGED_IN); + g_assert_null (object); + g_assert_true (err && err->code == CKR_USER_NOT_LOGGED_IN); g_clear_error (&err); /* Setup for auto login */ g_signal_connect (test->module, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35)); new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (new_session)); + g_assert_true (GCK_IS_SESSION (new_session)); /* Try again to do something that requires a login */ object = gck_session_create_object (new_session, attrs, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); g_object_unref (object); /* We should now be logged in, try to log out */ ret = gck_session_logout (new_session, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); g_object_unref (new_session); /* Now try the same thing, but asyncronously */ gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); new_session = gck_slot_open_session_finish (test->slot, result, &err); g_assert_no_error (err); - g_assert (GCK_IS_SESSION (new_session)); + g_assert_true (GCK_IS_SESSION (new_session)); g_object_unref (result); result = NULL; gck_session_create_object_async (new_session, attrs, NULL, fetch_async_result, &result); egg_test_wait_until (500); - g_assert (result != NULL); + g_assert_nonnull (result); object = gck_session_create_object_finish (new_session, result, &err); g_assert_no_error (err); - g_assert (GCK_IS_OBJECT (object)); + g_assert_true (GCK_IS_OBJECT (object)); g_object_unref (result); g_object_unref (object); /* We should now be logged in, try to log out */ ret = gck_session_logout (new_session, NULL, &err); g_assert_no_error (err); - g_assert (ret); + g_assert_true (ret); gck_attributes_unref (attrs); g_object_unref (new_session); diff -Nru gcr-3.38.1/gck/test-gck-slot.c gcr-3.40.0/gck/test-gck-slot.c --- gcr-3.38.1/gck/test-gck-slot.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-slot.c 2021-03-27 08:40:56.319531200 +0000 @@ -44,7 +44,7 @@ /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); g_assert_no_error (err); - g_assert (GCK_IS_MODULE (test->module)); + g_assert_true (GCK_IS_MODULE (test->module)); slots = gck_module_get_slots (test->module, TRUE); g_assert_nonnull (slots); diff -Nru gcr-3.38.1/gck/test-gck-uri.c gcr-3.40.0/gck/test-gck-uri.c --- gcr-3.38.1/gck/test-gck-uri.c 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gck/test-gck-uri.c 2021-03-27 08:40:56.319531200 +0000 @@ -38,15 +38,15 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:", GCK_URI_FOR_MODULE, &error); - g_assert (uri_data != NULL); + g_assert_nonnull (uri_data); g_assert_no_error (error); - g_assert (uri_data->attributes == NULL); - g_assert (uri_data->token_info == NULL); + g_assert_null (uri_data->attributes); + g_assert_null (uri_data->token_info); - g_assert (uri_data->module_info != NULL); - g_assert (uri_data->module_info->library_description == NULL); - g_assert (uri_data->module_info->manufacturer_id == NULL); + g_assert_nonnull (uri_data->module_info); + g_assert_null (uri_data->module_info->library_description); + g_assert_null (uri_data->module_info->manufacturer_id); gck_uri_data_free (uri_data); } @@ -58,7 +58,7 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("http:\\example.com\test", GCK_URI_FOR_ANY, &error); - g_assert (uri_data == NULL); + g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); g_error_free (error); } @@ -71,8 +71,8 @@ gchar *value; uri_data = gck_uri_parse ("pkcs11:object=Test%20Label", GCK_URI_FOR_ANY, &error); - g_assert (uri_data != NULL); - g_assert (uri_data->attributes != NULL); + g_assert_nonnull (uri_data); + g_assert_nonnull (uri_data->attributes); if (!gck_attributes_find_string (uri_data->attributes, CKA_LABEL, &value)) g_assert_not_reached (); @@ -92,8 +92,8 @@ gulong klass; uri_data = gck_uri_parse ("pkcs11:object=Test%20Label;objecttype=cert", GCK_URI_FOR_ANY, &error); - g_assert (uri_data); - g_assert (uri_data->attributes); + g_assert_nonnull (uri_data); + g_assert_nonnull (uri_data->attributes); if (!gck_attributes_find_string (uri_data->attributes, CKA_LABEL, &value)) g_assert_not_reached (); @@ -102,7 +102,7 @@ g_assert_not_reached (); g_assert_cmpstr (value, ==, "Test Label"); - g_assert (klass == CKO_CERTIFICATE); + g_assert_cmphex (klass, ==, CKO_CERTIFICATE); g_free (value); gck_uri_data_free (uri_data); @@ -116,14 +116,13 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:id=%54%45%53%54%00", GCK_URI_FOR_OBJECT, &error); - g_assert (uri_data != NULL); - g_assert (uri_data->attributes != NULL); + g_assert_nonnull (uri_data); + g_assert_nonnull (uri_data->attributes); attr = gck_attributes_find (uri_data->attributes, CKA_ID); - g_assert (attr); - g_assert (attr->value); - g_assert (attr->length == 5); - g_assert (memcmp (attr->value, "TEST", 5) == 0); + g_assert_nonnull (attr); + g_assert_nonnull (attr->value); + g_assert_cmpmem (attr->value, attr->length, "TEST", 5); gck_uri_data_free (uri_data); } @@ -135,7 +134,7 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:object=Test%", GCK_URI_FOR_OBJECT, &error); - g_assert (uri_data == NULL); + g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); } @@ -146,7 +145,7 @@ GError *error = NULL; GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:id=%%", GCK_URI_FOR_ANY, &error); - g_assert (!uri_data); + g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); } @@ -160,8 +159,8 @@ uri_data = gck_uri_parse ("pkcs11:token=Token%20Label;serial=3333;model=Deluxe;manufacturer=Me", GCK_URI_FOR_TOKEN, &error); - g_assert (uri_data); - g_assert (uri_data->token_info); + g_assert_nonnull (uri_data); + g_assert_nonnull (uri_data->token_info); g_assert_cmpstr (uri_data->token_info->label, ==, "Token Label"); g_assert_cmpstr (uri_data->token_info->serial_number, ==, "3333"); g_assert_cmpstr (uri_data->token_info->model, ==, "Deluxe"); @@ -176,7 +175,7 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:token=Token%", GCK_URI_FOR_TOKEN, &error); - g_assert (!uri_data); + g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); } @@ -188,8 +187,8 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:token", GCK_URI_FOR_ANY, &error); - g_assert (uri_data == NULL); - g_assert (g_error_matches (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX)); + g_assert_null (uri_data); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX); g_error_free (error); } @@ -202,8 +201,8 @@ uri_data = gck_uri_parse ("pkcs11:library-description=The%20Library;library-manufacturer=Me", GCK_URI_FOR_MODULE, &error); - g_assert (uri_data); - g_assert (uri_data->module_info); + g_assert_nonnull (uri_data); + g_assert_nonnull (uri_data->module_info); g_assert_cmpstr (uri_data->module_info->manufacturer_id, ==, "Me"); g_assert_cmpstr (uri_data->module_info->library_description, ==, "The Library"); gck_uri_data_free (uri_data); @@ -216,7 +215,7 @@ GckUriData *uri_data; uri_data = gck_uri_parse ("pkcs11:library-description=Library%", GCK_URI_FOR_MODULE, &error); - g_assert (!uri_data); + g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); } @@ -248,22 +247,22 @@ uri_data.token_info->model = g_strdup ("Deluxe"); uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); - g_assert (uri); + g_assert_nonnull (uri); check = gck_uri_parse (uri, GCK_URI_FOR_TOKEN, NULL); - g_assert (check); - g_assert (check->token_info); + g_assert_nonnull (check); + g_assert_nonnull (check->token_info); - g_assert (_gck_token_info_match (uri_data.token_info, check->token_info)); + g_assert_true (_gck_token_info_match (uri_data.token_info, check->token_info)); gck_token_info_free (uri_data.token_info); gck_uri_data_free (check); - g_assert (g_str_has_prefix (uri, "pkcs11:")); - g_assert (strstr (uri, "token=The%20Label")); - g_assert (strstr (uri, "serial=44444")); - g_assert (strstr (uri, "manufacturer=Me")); - g_assert (strstr (uri, "model=Deluxe")); + g_assert_true (g_str_has_prefix (uri, "pkcs11:")); + g_assert_true (strstr (uri, "token=The%20Label")); + g_assert_true (strstr (uri, "serial=44444")); + g_assert_true (strstr (uri, "manufacturer=Me")); + g_assert_true (strstr (uri, "model=Deluxe")); g_free (uri); } @@ -279,11 +278,11 @@ uri_data.token_info->label = g_strdup ("The Label"); uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); - g_assert (uri); + g_assert_nonnull (uri); - g_assert (g_str_has_prefix (uri, "pkcs11:")); - g_assert (strstr (uri, "token=The%20Label")); - g_assert (!strstr (uri, "serial=")); + g_assert_true (g_str_has_prefix (uri, "pkcs11:")); + g_assert_true (strstr (uri, "token=The%20Label")); + g_assert_true (!strstr (uri, "serial=")); gck_token_info_free (uri_data.token_info); g_free (uri); @@ -301,11 +300,11 @@ uri_data.token_info->serial_number = g_strdup (""); uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); - g_assert (uri); + g_assert_nonnull (uri); - g_assert (g_str_has_prefix (uri, "pkcs11:")); - g_assert (strstr (uri, "token=The%20Label")); - g_assert (strstr (uri, "serial=")); + g_assert_true (g_str_has_prefix (uri, "pkcs11:")); + g_assert_true (strstr (uri, "token=The%20Label")); + g_assert_true (strstr (uri, "serial=")); gck_token_info_free (uri_data.token_info); g_free (uri); @@ -329,13 +328,13 @@ uri_data.attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); uri = gck_uri_build (&uri_data, GCK_URI_FOR_OBJECT); - g_assert (uri); + g_assert_nonnull (uri); gck_attributes_unref (uri_data.attributes); check = gck_uri_parse (uri, GCK_URI_FOR_ANY, NULL); - g_assert (check); - g_assert (check->attributes); + g_assert_nonnull (check); + g_assert_nonnull (check->attributes); if (!gck_attributes_find_string (check->attributes, CKA_LABEL, &string)) g_assert_not_reached (); @@ -344,19 +343,18 @@ if (!gck_attributes_find_ulong (check->attributes, CKA_CLASS, &value)) g_assert_not_reached (); - g_assert (value == CKO_DATA); + g_assert_cmphex (value, ==, CKO_DATA); attr = gck_attributes_find (check->attributes, CKA_ID); - g_assert (attr); - g_assert (attr->length == 5); - g_assert (memcmp (attr->value, "TEST", 5) == 0); + g_assert_nonnull (attr); + g_assert_cmpmem (attr->value, attr->length, "TEST", 5); gck_uri_data_free (check); - g_assert (g_str_has_prefix (uri, "pkcs11:")); - g_assert (strstr (uri, "object=The%20Label")); - g_assert (strstr (uri, "object-type=data") || strstr (uri, "type=data")); - g_assert (strstr (uri, "id=%54%45%53%54%00") || strstr (uri, "id=TEST%00")); + g_assert_true (g_str_has_prefix (uri, "pkcs11:")); + g_assert_true (strstr (uri, "object=The%20Label")); + g_assert_true (strstr (uri, "object-type=data") || strstr (uri, "type=data")); + g_assert_true (strstr (uri, "id=%54%45%53%54%00") || strstr (uri, "id=TEST%00")); g_free (uri); } @@ -369,10 +367,10 @@ gulong klass; uri_data = gck_uri_parse ("pkcs11:objecttype=private", GCK_URI_FOR_OBJECT, &error); - g_assert (uri_data); + g_assert_nonnull (uri_data); g_assert_no_error (error); - g_assert (uri_data->attributes); + g_assert_nonnull (uri_data->attributes); if (!gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) g_assert_not_reached (); gck_assert_cmpulong (klass, ==, CKO_PRIVATE_KEY); @@ -388,10 +386,10 @@ gulong klass; uri_data = gck_uri_parse ("pkcs11:objecttype=secretkey", GCK_URI_FOR_OBJECT, &error); - g_assert (uri_data); + g_assert_nonnull (uri_data); g_assert_no_error (error); - g_assert (uri_data->attributes); + g_assert_nonnull (uri_data->attributes); if (!gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) g_assert_not_reached (); gck_assert_cmpulong (klass, ==, CKO_SECRET_KEY); @@ -408,11 +406,11 @@ gulong klass; uri_data = gck_uri_parse ("pkcs11:objecttype=unknown", GCK_URI_FOR_OBJECT, &error); - g_assert (uri_data); + g_assert_nonnull (uri_data); g_assert_no_error (error); - g_assert (uri_data->attributes); - g_assert (uri_data->any_unrecognized == TRUE); + g_assert_nonnull (uri_data->attributes); + g_assert_true (uri_data->any_unrecognized); if (gck_attributes_find_ulong (uri_data->attributes, CKA_CLASS, &klass)) g_assert_not_reached (); @@ -431,8 +429,8 @@ uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); - g_assert (uri); - g_assert (strstr (uri, "object-type=cert") || strstr (uri, "type=cert")); + g_assert_nonnull (uri); + g_assert_true (strstr (uri, "object-type=cert") || strstr (uri, "type=cert")); gck_uri_data_free (uri_data); g_free (uri); @@ -450,8 +448,8 @@ uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); - g_assert (uri); - g_assert (strstr (uri, "object-type=private") || strstr (uri, "type=private")); + g_assert_nonnull (uri); + g_assert_true (strstr (uri, "object-type=private") || strstr (uri, "type=private")); gck_uri_data_free (uri_data); g_free (uri); @@ -469,8 +467,9 @@ uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); - g_assert (uri); - g_assert (strstr (uri, "object-type=public") || strstr (uri, "type=public")); + g_assert_nonnull (uri); + g_assert_true (strstr (uri, "object-type=public") || + strstr (uri, "type=public")); gck_uri_data_free (uri_data); g_free (uri); @@ -488,8 +487,9 @@ uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); - g_assert (uri); - g_assert (strstr (uri, "object-type=secret-key") || strstr (uri, "type=secret-key")); + g_assert_nonnull (uri); + g_assert_true (strstr (uri, "object-type=secret-key") || + strstr (uri, "type=secret-key")); gck_uri_data_free (uri_data); g_free (uri); @@ -506,8 +506,8 @@ uri_data->module_info->library_description = g_strdup ("The Description"); uri = gck_uri_build (uri_data, GCK_URI_FOR_MODULE); - g_assert (uri); - g_assert (strstr (uri, "library-description=The%20Description")); + g_assert_nonnull (uri); + g_assert_true (strstr (uri, "library-description=The%20Description")); gck_uri_data_free (uri_data); g_free (uri); diff -Nru gcr-3.38.1/gcr/console-interaction.c gcr-3.40.0/gcr/console-interaction.c --- gcr-3.38.1/gcr/console-interaction.c 2021-01-12 22:55:54.653056100 +0000 +++ gcr-3.40.0/gcr/console-interaction.c 2021-03-27 08:40:56.320531100 +0000 @@ -108,46 +108,49 @@ } static void -ask_password_with_getpass (GSimpleAsyncResult *res, - GObject *object, - GCancellable *cancellable) +ask_password_with_getpass (GTask *task, + gpointer src_object, + gpointer task_data, + GCancellable *cancellable) { GTlsPassword *password; GError *error = NULL; - password = g_simple_async_result_get_op_res_gpointer (res); - console_interaction_ask_password (G_TLS_INTERACTION (object), password, - cancellable, &error); - if (error != NULL) - g_simple_async_result_take_error (res, error); + password = g_task_get_task_data (task); + console_interaction_ask_password (G_TLS_INTERACTION (src_object), password, + cancellable, &error); + if (error == NULL) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&error)); } static void console_interaction_ask_password_async (GTlsInteraction *interaction, - GTlsPassword *password, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; - res = g_simple_async_result_new (G_OBJECT (interaction), callback, user_data, - console_interaction_ask_password); - g_simple_async_result_set_op_res_gpointer (res, g_object_ref (password), g_object_unref); - g_simple_async_result_run_in_thread (res, ask_password_with_getpass, - G_PRIORITY_DEFAULT, cancellable); - g_object_unref (res); + task = g_task_new (interaction, cancellable, callback, user_data); + g_task_set_source_tag (task, console_interaction_ask_password); + g_task_set_task_data (task, g_object_ref (password), g_object_unref); + + g_task_run_in_thread (task, ask_password_with_getpass); + g_clear_object (&task); } static GTlsInteractionResult -console_interaction_ask_password_finish (GTlsInteraction *interaction, - GAsyncResult *result, - GError **error) +console_interaction_ask_password_finish (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error) { - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (interaction), - console_interaction_ask_password), G_TLS_INTERACTION_FAILED); + g_return_val_if_fail (g_task_is_valid (result, interaction), + G_TLS_INTERACTION_FAILED); - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + if (!g_task_propagate_boolean (G_TASK (result), error)) return G_TLS_INTERACTION_FAILED; return G_TLS_INTERACTION_HANDLED; diff -Nru gcr-3.38.1/gcr/gcr-base.pc.in gcr-3.40.0/gcr/gcr-base.pc.in --- gcr-3.38.1/gcr/gcr-base.pc.in 2021-01-12 22:55:54.657056300 +0000 +++ gcr-3.40.0/gcr/gcr-base.pc.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ -datarootdir=@datarootdir@ -datadir=@datadir@ -sysconfdir=@sysconfdir@ - -Name: gcr-base-@GCR_MAJOR@ -Description: GObject library for high level crypto parsing -Version: @VERSION@ -Requires: glib-2.0 gobject-2.0 gio-2.0 gck-@GCK_MAJOR@ p11-kit-1 -Libs: -L${libdir} -lgcr-base-@GCR_MAJOR@ -Cflags: -I${includedir}/gcr-@GCR_MAJOR@ diff -Nru gcr-3.38.1/gcr/gcr-certificate-chain.c gcr-3.40.0/gcr/gcr-certificate-chain.c --- gcr-3.38.1/gcr/gcr-certificate-chain.c 2021-01-12 22:55:54.658056300 +0000 +++ gcr-3.40.0/gcr/gcr-certificate-chain.c 2021-03-27 08:40:56.326531200 +0000 @@ -372,19 +372,21 @@ } static void -thread_build_chain (GSimpleAsyncResult *result, GObject *object, +thread_build_chain (GTask *task, gpointer src_object, gpointer task_data, GCancellable *cancellable) { GcrCertificateChainPrivate *pv; GError *error = NULL; - pv = g_object_get_qdata (G_OBJECT (result), Q_OPERATION_DATA); + pv = g_object_get_qdata (G_OBJECT (task), Q_OPERATION_DATA); g_assert (pv); g_debug ("building asynchronously in another thread"); - if (!perform_build_chain (pv, cancellable, &error)) { - g_simple_async_result_set_from_error (result, error); + if (perform_build_chain (pv, cancellable, &error)) { + g_task_return_boolean (task, TRUE); + } else { + g_task_return_error (task, g_steal_pointer (&error)); g_clear_error (&error); } } @@ -784,22 +786,19 @@ gpointer user_data) { GcrCertificateChainPrivate *pv; - GSimpleAsyncResult *result; - - g_return_if_fail (GCR_IS_CERTIFICATE_CHAIN (self)); + GTask *task; g_return_if_fail (GCR_IS_CERTIFICATE_CHAIN (self)); g_return_if_fail (purpose); pv = prep_chain_private_thread_safe (self->pv, purpose, peer, flags); - result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - gcr_certificate_chain_build_async); - g_object_set_qdata_full (G_OBJECT (result), Q_OPERATION_DATA, pv, free_chain_private); - - g_simple_async_result_run_in_thread (result, thread_build_chain, - G_PRIORITY_DEFAULT, cancellable); - g_object_unref (result); + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_certificate_chain_build_async); + g_object_set_qdata_full (G_OBJECT (task), Q_OPERATION_DATA, pv, free_chain_private); + + g_task_run_in_thread (task, thread_build_chain); + g_clear_object (&task); } /** @@ -820,11 +819,9 @@ GcrCertificateChainPrivate *pv; g_return_val_if_fail (GCR_IS_CERTIFICATE_CHAIN (self), FALSE); - g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), - gcr_certificate_chain_build_async), FALSE); + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + if (!g_task_propagate_boolean (G_TASK (result), error)) return FALSE; pv = g_object_steal_qdata (G_OBJECT (result), Q_OPERATION_DATA); diff -Nru gcr-3.38.1/gcr/gcr-certificate-request.c gcr-3.40.0/gcr/gcr-certificate-request.c --- gcr-3.38.1/gcr/gcr-certificate-request.c 2021-01-12 22:55:54.658056300 +0000 +++ gcr-3.40.0/gcr/gcr-certificate-request.c 2021-03-27 08:40:56.326531200 +0000 @@ -516,7 +516,6 @@ typedef struct { GcrCertificateRequest *request; - GCancellable *cancellable; GQuark algorithm; GNode *subject_public_key; GckMechanism mechanism; @@ -530,7 +529,6 @@ CompleteClosure *closure = data; egg_asn1x_destroy (closure->subject_public_key); g_clear_object (&closure->request); - g_clear_object (&closure->cancellable); g_clear_object (&closure->session); if (closure->tbs) g_bytes_unref (closure->tbs); @@ -542,8 +540,8 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - CompleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + CompleteClosure *closure = g_task_get_task_data (task); GError *error = NULL; guchar *signature; gsize n_signature; @@ -555,12 +553,12 @@ closure->subject_public_key, signature, n_signature); + g_task_return_boolean (task, TRUE); } else { - g_simple_async_result_take_error (res, error); + g_task_return_error (task, g_steal_pointer (&error)); } - g_simple_async_result_complete (res); - g_object_unref (res); + g_clear_object (&task); } static void @@ -568,15 +566,15 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - CompleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + CompleteClosure *closure = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); closure->mechanism.type = _gcr_key_mechanisms_check_finish (closure->request->private_key, result, NULL); if (closure->mechanism.type == GCK_INVALID) { - g_simple_async_result_set_error (res, GCK_ERROR, CKR_KEY_TYPE_INCONSISTENT, - _("The key cannot be used to sign the request")); - g_simple_async_result_complete (res); + g_task_return_new_error (task, GCK_ERROR, CKR_KEY_TYPE_INCONSISTENT, + _("The key cannot be used to sign the request")); } else { closure->tbs = prepare_to_be_signed (closure->request, &closure->mechanism); @@ -585,12 +583,12 @@ &closure->mechanism, g_bytes_get_data (closure->tbs, NULL), g_bytes_get_size (closure->tbs), - closure->cancellable, + cancellable, on_certificate_request_signed, - g_object_ref (res)); + g_steal_pointer (&task)); } - g_object_unref (res); + g_clear_object (&task); } static void @@ -598,8 +596,9 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - CompleteClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + CompleteClosure *closure = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); const gulong *mechanisms; gsize n_mechanisms; GError *error = NULL; @@ -615,23 +614,21 @@ } if (error != NULL) { - g_simple_async_result_take_error (res, error); - g_simple_async_result_complete (res); - - } else { - _gcr_key_mechanisms_check_async (closure->request->private_key, - mechanisms, n_mechanisms, CKA_SIGN, - closure->cancellable, on_mechanism_check, - g_object_ref (res)); + g_task_return_error (task, g_steal_pointer (&error)); + g_clear_object (&task); + return; } - g_object_unref (res); + _gcr_key_mechanisms_check_async (closure->request->private_key, + mechanisms, n_mechanisms, CKA_SIGN, + cancellable, on_mechanism_check, + g_steal_pointer (&task)); } /** * gcr_certificate_request_complete_async: * @self: a certificate request - * @cancellable: a cancellation object + * @cancellable: (nullable): a cancellation object * @callback: called when the operation completes * @user_data: data to pass to the callback * @@ -646,25 +643,24 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; CompleteClosure *closure; g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST (self)); g_return_if_fail (cancellable == NULL || G_CANCELLABLE (cancellable)); - res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - gcr_certificate_request_complete_async); + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_certificate_request_complete_async); closure = g_new0 (CompleteClosure, 1); - closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL; closure->session = gck_object_get_session (self->private_key); closure->request = g_object_ref (self); - g_simple_async_result_set_op_res_gpointer (res, closure, complete_closure_free); + g_task_set_task_data (task, closure, complete_closure_free); _gcr_subject_public_key_load_async (self->private_key, cancellable, on_subject_public_key_loaded, - g_object_ref (res)); + g_steal_pointer (&task)); - g_object_unref (res); + g_clear_object (&task); } /** @@ -685,13 +681,9 @@ { g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST (self), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), - gcr_certificate_request_complete_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } /** diff -Nru gcr-3.38.1/gcr/gcr-collection.c gcr-3.40.0/gcr/gcr-collection.c --- gcr-3.38.1/gcr/gcr-collection.c 2021-01-12 22:55:54.659056200 +0000 +++ gcr-3.40.0/gcr/gcr-collection.c 2021-03-27 08:40:56.326531200 +0000 @@ -69,7 +69,7 @@ */ signals[ADDED] = g_signal_new ("added", GCR_TYPE_COLLECTION, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, added), - NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** @@ -81,7 +81,7 @@ */ signals[REMOVED] = g_signal_new ("removed", GCR_TYPE_COLLECTION, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, removed), - NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_OBJECT); g_once_init_leave (&initialized, 1); diff -Nru gcr-3.38.1/gcr/gcr-gnupg-collection.c gcr-3.40.0/gcr/gcr-gnupg-collection.c --- gcr-3.38.1/gcr/gcr-gnupg-collection.c 2021-01-12 22:55:54.661056300 +0000 +++ gcr-3.40.0/gcr/gcr-gnupg-collection.c 2021-03-27 08:40:56.327531000 +0000 @@ -233,7 +233,6 @@ GcrLoadingPhase loading_phase; /* Whether loading public or private */ GPtrArray *records; /* GcrRecord* not yet made into a key */ GcrGnupgProcess *process; /* The gnupg process itself */ - GCancellable *cancel; /* Cancellation for process */ GString *out_data; /* Pending output not yet parsed into colons */ GHashTable *difference; /* Hashset gchar *keyid -> gchar *keyid */ @@ -248,7 +247,7 @@ } GcrGnupgCollectionLoad; /* Forward declarations */ -static void spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GSimpleAsyncResult *res); +static void spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GTask *task); static void _gcr_gnupg_collection_load_free (gpointer data) @@ -274,9 +273,6 @@ g_output_stream_close (load->outattr, NULL, NULL); g_object_unref (load->outattr); - if (load->cancel) - g_object_unref (load->cancel); - if (load->attribute_queue) { while (!g_queue_is_empty (load->attribute_queue)) _gcr_record_free (g_queue_pop_head (load->attribute_queue)); @@ -517,8 +513,8 @@ gpointer user_data, GError **error) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GcrGnupgCollectionLoad *load = g_task_get_task_data (task); g_string_append_len (load->out_data, buffer, count); _gcr_util_parse_lines (load->out_data, FALSE, on_line_parse_output, load); @@ -536,8 +532,8 @@ on_gnupg_process_status_record (GcrGnupgProcess *process, GcrRecord *record, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GcrGnupgCollectionLoad *load = g_task_get_task_data (task); if (GCR_RECORD_SCHEMA_ATTRIBUTE != _gcr_record_get_schema (record)) return; @@ -556,8 +552,8 @@ gpointer user_data, GError **error) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GcrGnupgCollectionLoad *load = g_task_get_task_data (task); /* If we don't have a buffer, just claim this one */ if (!load->attribute_buf) @@ -572,18 +568,16 @@ static void on_gnupg_process_completed (GObject *source, GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GcrGnupgCollectionLoad *load = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GcrGnupgCollectionLoad *load = g_task_get_task_data (task); GHashTableIter iter; GError *error = NULL; GObject *object; gpointer keyid; if (!_gcr_gnupg_process_run_finish (GCR_GNUPG_PROCESS (source), result, &error)) { - g_simple_async_result_set_from_error (res, error); - g_simple_async_result_complete (res); - g_object_unref (res); - g_clear_error (&error); + g_task_return_error (task, g_steal_pointer (&error)); + g_clear_object (&task); return; } @@ -599,8 +593,8 @@ case GCR_LOADING_PHASE_PUBLIC: g_debug ("public load phase completed"); load->loading_phase = GCR_LOADING_PHASE_SECRET; - spawn_gnupg_list_process (load, res); - g_object_unref (res); + spawn_gnupg_list_process (load, task); + g_clear_object (&task); return; case GCR_LOADING_PHASE_SECRET: g_debug ("secret load phase completed"); @@ -623,13 +617,14 @@ } } - g_simple_async_result_complete (res); - g_object_unref (res); + g_task_return_boolean (task, TRUE); + g_clear_object (&task); } static void -spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GSimpleAsyncResult *res) +spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GTask *task) { + GCancellable *cancellable = g_task_get_cancellable (task); GcrGnupgProcessFlags flags = 0; GPtrArray *argv; @@ -658,8 +653,8 @@ /* res is unreffed in on_gnupg_process_completed */ _gcr_gnupg_process_run_async (load->process, (const gchar**)argv->pdata, NULL, flags, - load->cancel, on_gnupg_process_completed, - g_object_ref (res)); + cancellable, on_gnupg_process_completed, + g_object_ref (task)); g_ptr_array_unref (argv); } @@ -667,7 +662,7 @@ /** * _gcr_gnupg_collection_load_async: * @self: The collection - * @cancellable: Cancellation object or %NULL + * @cancellable: (nullable): Cancellation object or %NULL * @callback: Callback to call when result is ready * @user_data: Data for callback * @@ -678,7 +673,7 @@ _gcr_gnupg_collection_load_async (GcrGnupgCollection *self, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; GcrGnupgCollectionLoad *load; GHashTableIter iter; gpointer keyid; @@ -687,23 +682,22 @@ /* TODO: Cancellation not yet implemented */ - res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - _gcr_gnupg_collection_load_async); + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_gnupg_collection_load_async); load = g_slice_new0 (GcrGnupgCollectionLoad); load->records = g_ptr_array_new_with_free_func (_gcr_record_free); load->out_data = g_string_sized_new (1024); load->collection = g_object_ref (self); - load->cancel = cancellable ? g_object_ref (cancellable) : cancellable; - load->output = _gcr_callback_output_stream_new (on_gnupg_process_output_data, res, NULL); - load->outattr = _gcr_callback_output_stream_new (on_gnupg_process_attribute_data, res, NULL); + load->output = _gcr_callback_output_stream_new (on_gnupg_process_output_data, task, NULL); + load->outattr = _gcr_callback_output_stream_new (on_gnupg_process_attribute_data, task, NULL); load->process = _gcr_gnupg_process_new (self->pv->directory, NULL); _gcr_gnupg_process_set_output_stream (load->process, load->output); _gcr_gnupg_process_set_attribute_stream (load->process, load->outattr); - load->error_sig = g_signal_connect (load->process, "error-line", G_CALLBACK (on_gnupg_process_error_line), res); - load->status_sig = g_signal_connect (load->process, "status-record", G_CALLBACK (on_gnupg_process_status_record), res); + load->error_sig = g_signal_connect (load->process, "error-line", G_CALLBACK (on_gnupg_process_error_line), task); + load->status_sig = g_signal_connect (load->process, "status-record", G_CALLBACK (on_gnupg_process_status_record), task); /* * Track all the keys we currently have, at end remove those that @@ -714,13 +708,12 @@ while (g_hash_table_iter_next (&iter, &keyid, NULL)) g_hash_table_insert (load->difference, keyid, keyid); - g_simple_async_result_set_op_res_gpointer (res, load, - _gcr_gnupg_collection_load_free); + g_task_set_task_data (task, load, _gcr_gnupg_collection_load_free); load->loading_phase = GCR_LOADING_PHASE_PUBLIC; - spawn_gnupg_list_process (load, res); + spawn_gnupg_list_process (load, task); - g_object_unref (res); + g_clear_object (&task); } /** @@ -739,11 +732,7 @@ g_return_val_if_fail (GCR_IS_GNUPG_COLLECTION (self), FALSE); g_return_val_if_fail (!error || !*error, FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), - _gcr_gnupg_collection_load_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; + g_return_val_if_fail (g_task_is_valid (result, self), FALSE); - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } diff -Nru gcr-3.38.1/gcr/gcr-gnupg-importer.c gcr-3.40.0/gcr/gcr-gnupg-importer.c --- gcr-3.38.1/gcr/gcr-gnupg-importer.c 2021-01-12 22:55:54.661056300 +0000 +++ gcr-3.40.0/gcr/gcr-gnupg-importer.c 2021-03-27 08:40:56.327531000 +0000 @@ -295,23 +295,23 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (g_async_result_get_source_object (user_data)); + GTask *task = G_TASK (user_data); + GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (g_task_get_source_object (task)); GError *error = NULL; if (!_gcr_gnupg_process_run_finish (GCR_GNUPG_PROCESS (source), result, &error)) { if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED) && self->pv->first_error) { - g_simple_async_result_set_error (res, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, - "%s", self->pv->first_error); + g_task_return_new_error (task, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + "%s", self->pv->first_error); g_error_free (error); } else { - g_simple_async_result_take_error (res, error); + g_task_return_error (task, g_steal_pointer (&error)); } + } else { + g_task_return_boolean (task, TRUE); } - g_simple_async_result_complete (res); - g_object_unref (self); - g_object_unref (res); + g_clear_object (&task); } static void @@ -321,21 +321,20 @@ gpointer user_data) { GcrGnupgImporter *self = GCR_GNUPG_IMPORTER (importer); - GSimpleAsyncResult *res; + GTask *task; const gchar *argv[] = { "--import", NULL }; - g_free (self->pv->first_error); - self->pv->first_error = NULL; + g_clear_pointer (&self->pv->first_error, g_free); - res = g_simple_async_result_new (G_OBJECT (importer), callback, user_data, - _gcr_gnupg_importer_import_async); + task = g_task_new (importer, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_gnupg_importer_import_async); _gcr_gnupg_process_run_async (self->pv->process, argv, NULL, GCR_GNUPG_PROCESS_WITH_STATUS, cancellable, on_process_run_complete, - g_object_ref (res)); + g_steal_pointer (&task)); - g_object_unref (res); + g_clear_object (&task); } static gboolean @@ -343,13 +342,9 @@ GAsyncResult *result, GError **error) { - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (importer), - _gcr_gnupg_importer_import_async), FALSE); + g_return_val_if_fail (g_task_is_valid (result, importer), FALSE); - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } static void diff -Nru gcr-3.38.1/gcr/gcr-key-mechanisms.c gcr-3.40.0/gcr/gcr-key-mechanisms.c --- gcr-3.38.1/gcr/gcr-key-mechanisms.c 2021-01-12 22:55:54.663056400 +0000 +++ gcr-3.40.0/gcr/gcr-key-mechanisms.c 2021-03-27 08:40:56.328531300 +0000 @@ -118,7 +118,6 @@ gulong *mechanisms; gsize n_mechanisms; gulong action_attr_type; - GckAttributes *attrs; } CheckClosure; static void @@ -126,7 +125,6 @@ { CheckClosure *closure = data; g_free (closure->mechanisms); - gck_attributes_unref (closure->attrs); g_free (closure); } @@ -135,16 +133,17 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - CheckClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GckAttributes *attrs; GError *error = NULL; - closure->attrs = gck_object_cache_lookup_finish (GCK_OBJECT (source), result, &error); + attrs = gck_object_cache_lookup_finish (GCK_OBJECT (source), result, &error); if (error != NULL) - g_simple_async_result_take_error (res, error); + g_task_return_error (task, g_steal_pointer (&error)); + else + g_task_return_pointer (task, attrs, gck_attributes_unref); - g_simple_async_result_complete (res); - g_object_unref (res); + g_clear_object (&task); } void @@ -158,25 +157,24 @@ { gulong attr_types[] = { action_attr_type }; CheckClosure *closure; - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail (GCK_IS_OBJECT (key)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - res = g_simple_async_result_new (G_OBJECT (key), callback, user_data, - _gcr_key_mechanisms_check_async); + task = g_task_new (key, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_key_mechanisms_check_async); closure = g_new0 (CheckClosure, 1); closure->mechanisms = g_memdup (mechanisms, n_mechanisms * sizeof (gulong)); closure->n_mechanisms = n_mechanisms; closure->action_attr_type = action_attr_type; - g_simple_async_result_set_op_res_gpointer (res, closure, check_closure_free); + g_task_set_task_data (task, closure, check_closure_free); gck_object_cache_lookup_async (key, attr_types, G_N_ELEMENTS (attr_types), - cancellable, on_check_get_attributes, g_object_ref (res)); - - g_object_unref (res); - + cancellable, on_check_get_attributes, + g_steal_pointer (&task)); + g_clear_object (&task); } gulong @@ -185,21 +183,26 @@ GError **error) { CheckClosure *closure; - GSimpleAsyncResult *res; + GckAttributes *attrs; + gulong ret = GCK_INVALID; g_return_val_if_fail (GCK_IS_OBJECT (key), GCK_INVALID); g_return_val_if_fail (error == NULL || *error == NULL, GCK_INVALID); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (key), - _gcr_key_mechanisms_check_async), FALSE); + g_return_val_if_fail (g_task_is_valid (result, key), GCK_INVALID); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == + _gcr_key_mechanisms_check_async, GCK_INVALID); + + closure = g_task_get_task_data (G_TASK (result)); + + attrs = g_task_propagate_pointer (G_TASK (result), error); + if (!attrs) + return GCK_INVALID; + + ret = find_first_usable_mechanism (GCK_OBJECT (key), attrs, + closure->mechanisms, closure->n_mechanisms, + closure->action_attr_type); - res = G_SIMPLE_ASYNC_RESULT (result); - if (g_simple_async_result_propagate_error (res, error)) - return FALSE; - - closure = g_simple_async_result_get_op_res_gpointer (res); - - return find_first_usable_mechanism (GCK_OBJECT (key), closure->attrs, - closure->mechanisms, closure->n_mechanisms, - closure->action_attr_type); + gck_attributes_unref (attrs); + return ret; } diff -Nru gcr-3.38.1/gcr/gcr-library.c gcr-3.40.0/gcr/gcr-library.c --- gcr-3.38.1/gcr/gcr-library.c 2021-01-12 22:55:54.663056400 +0000 +++ gcr-3.40.0/gcr/gcr-library.c 2021-03-27 08:40:56.328531300 +0000 @@ -239,38 +239,36 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GTask *task = G_TASK (user_data); GError *error = NULL; GList *results; results = gck_modules_initialize_registered_finish (result, &error); if (error != NULL) { g_debug ("failed %s", error->message); - g_simple_async_result_take_error (res, error); - - } else { - - G_LOCK (modules); - - if (!initialized_modules) { - all_modules = g_list_concat(all_modules, results); - results = NULL; - initialized_modules = TRUE; - } + g_task_return_error (task, g_steal_pointer (&error)); + g_clear_object (&task); + return; + } - G_UNLOCK (modules); + G_LOCK (modules); + if (!initialized_modules) { + all_modules = g_list_concat (all_modules, results); + results = NULL; + initialized_modules = TRUE; } + G_UNLOCK (modules); gck_list_unref_free (results); g_debug ("completed initialize of registered modules"); - g_simple_async_result_complete (res); - g_object_unref (res); + g_task_return_boolean (task, TRUE); + g_clear_object (&task); } /** * gcr_pkcs11_initialize_async: - * @cancellable: optional cancellable used to cancel the operation + * @cancellable: (nullable): optional cancellable used to cancel the operation * @callback: callback which will be called when the operation completes * @user_data: data passed to the callback * @@ -281,22 +279,24 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; + + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - res = g_simple_async_result_new (NULL, callback, user_data, - gcr_pkcs11_initialize_async); + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_pkcs11_initialize_async); if (initialized_modules) { g_debug ("already initialized, no need to async"); - g_simple_async_result_complete_in_idle (res); + g_task_return_boolean (task, TRUE); } else { gck_modules_initialize_registered_async (cancellable, on_initialize_registered, - g_object_ref (res)); + g_steal_pointer (&task)); g_debug ("starting initialize of registered modules"); } - g_object_unref (res); + g_clear_object (&task); } /** @@ -313,13 +313,9 @@ gcr_pkcs11_initialize_finish (GAsyncResult *result, GError **error) { - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, - gcr_pkcs11_initialize_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } /** diff -Nru gcr-3.38.1/gcr/gcr-memory-icon.c gcr-3.40.0/gcr/gcr-memory-icon.c --- gcr-3.38.1/gcr/gcr-memory-icon.c 2021-01-12 22:55:54.663056400 +0000 +++ gcr-3.40.0/gcr/gcr-memory-icon.c 2021-03-27 08:40:56.328531300 +0000 @@ -138,21 +138,22 @@ _gcr_memory_icon_load_async (GLoadableIcon *icon, int size, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; - res = g_simple_async_result_new (G_OBJECT (icon), callback, user_data, - _gcr_memory_icon_load_async); + task = g_task_new (icon, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_memory_icon_load_async); - g_simple_async_result_complete_in_idle (res); - g_object_unref (res); + /* We don't do anything with the task value, so just return a bogus value */ + g_task_return_pointer (task, NULL, NULL); + g_object_unref (task); } static GInputStream* _gcr_memory_icon_finish (GLoadableIcon *icon, GAsyncResult *res, char **type, GError **error) { - g_return_val_if_fail (g_simple_async_result_is_valid (res, G_OBJECT (icon), - _gcr_memory_icon_load_async), NULL); + g_return_val_if_fail (g_task_is_valid (res, icon), NULL); + return _gcr_memory_icon_load (icon, 0, type, NULL, error); } diff -Nru gcr-3.38.1/gcr/gcr-mock-prompter.c gcr-3.40.0/gcr/gcr-mock-prompter.c --- gcr-3.38.1/gcr/gcr-mock-prompter.c 2021-01-12 22:55:54.664056300 +0000 +++ gcr-3.40.0/gcr/gcr-mock-prompter.c 2021-03-27 08:40:56.328531300 +0000 @@ -67,6 +67,11 @@ PROP_CANCEL_LABEL, }; +typedef struct _MockProperty { + const char *name; + GValue value; +} MockProperty; + struct _GcrMockPrompt { GObject parent; GHashTable *properties; @@ -107,7 +112,7 @@ static void mock_property_free (gpointer data) { - GParameter *param = data; + MockProperty *param = data; g_value_unset (¶m->value); g_free (param); } @@ -129,9 +134,9 @@ blank_string_property (GHashTable *properties, const gchar *property) { - GParameter *param; + MockProperty *param; - param = g_new0 (GParameter, 1); + param = g_new0 (MockProperty, 1); param->name = property; g_value_init (¶m->value, G_TYPE_STRING); g_value_set_string (¶m->value, ""); @@ -143,9 +148,9 @@ blank_boolean_property (GHashTable *properties, const gchar *property) { - GParameter *param; + MockProperty *param; - param = g_new0 (GParameter, 1); + param = g_new0 (MockProperty, 1); param->name = property; g_value_init (¶m->value, G_TYPE_BOOLEAN); g_value_set_boolean (¶m->value, FALSE); @@ -156,9 +161,9 @@ blank_int_property (GHashTable *properties, const gchar *property) { - GParameter *param; + MockProperty *param; - param = g_new0 (GParameter, 1); + param = g_new0 (MockProperty, 1); param->name = property; g_value_init (¶m->value, G_TYPE_INT); g_value_set_int (¶m->value, 0); @@ -195,7 +200,7 @@ GParamSpec *pspec) { GcrMockPrompt *self = GCR_MOCK_PROMPT (obj); - GParameter *param; + MockProperty *param; switch (prop_id) { case PROP_TITLE: @@ -208,7 +213,7 @@ case PROP_CALLER_WINDOW: case PROP_CONTINUE_LABEL: case PROP_CANCEL_LABEL: - param = g_new0 (GParameter, 1); + param = g_new0 (MockProperty, 1); param->name = pspec->name; g_value_init (¶m->value, pspec->value_type); g_value_copy (value, ¶m->value); @@ -228,7 +233,7 @@ GParamSpec *pspec) { GcrMockPrompt *self = GCR_MOCK_PROMPT (obj); - GParameter *param; + MockProperty *param; switch (prop_id) { case PROP_TITLE: @@ -322,7 +327,7 @@ { GValue value = G_VALUE_INIT; GObjectClass *object_class; - GParameter *param; + MockProperty *param; GParamSpec *spec; GList *l; @@ -471,11 +476,11 @@ ensure_password_strength (GcrMockPrompt *self, const gchar *password) { - GParameter *param; + MockProperty *param; gint strength; strength = strlen (password) > 0 ? 1 : 0; - param = g_new0 (GParameter, 1); + param = g_new0 (MockProperty, 1); param->name = "password-strength"; g_value_init (¶m->value, G_TYPE_INT); g_value_set_int (¶m->value, strength); @@ -574,7 +579,7 @@ name = first_property; while (name) { GValue value = G_VALUE_INIT; - GParameter *parameter; + MockProperty *parameter; GParamSpec *spec; gchar *error = NULL; @@ -597,7 +602,7 @@ break; } - parameter = g_new0 (GParameter, 1); + parameter = g_new0 (MockProperty, 1); parameter->name = g_intern_string (name); memcpy (¶meter->value, &value, sizeof (value)); result = g_list_prepend (result, parameter); diff -Nru gcr-3.38.1/gcr/gcr-parser.c gcr-3.40.0/gcr/gcr-parser.c --- gcr-3.38.1/gcr/gcr-parser.c 2021-01-12 22:55:54.666056400 +0000 +++ gcr-3.40.0/gcr/gcr-parser.c 2021-03-27 08:40:56.329531200 +0000 @@ -2505,7 +2505,7 @@ */ signals[PARSED] = g_signal_new ("parsed", GCR_TYPE_PARSER, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GcrParserClass, parsed), - NULL, NULL, g_cclosure_marshal_VOID__VOID, + NULL, NULL, NULL, G_TYPE_NONE, 0); init_quarks (); diff -Nru gcr-3.38.1/gcr/gcr-pkcs11-certificate.c gcr-3.40.0/gcr/gcr-pkcs11-certificate.c --- gcr-3.38.1/gcr/gcr-pkcs11-certificate.c 2021-01-12 22:55:54.666056400 +0000 +++ gcr-3.40.0/gcr/gcr-pkcs11-certificate.c 2021-03-27 08:40:56.329531200 +0000 @@ -74,20 +74,6 @@ G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_certificate_iface); ); -typedef struct { - GckAttributes *search; - GcrCertificate *result; -} lookup_issuer_closure; - -static void -lookup_issuer_free (gpointer data) -{ - lookup_issuer_closure *closure = data; - gck_attributes_unref (closure->search); - g_clear_object (&closure->result); - g_free (closure); -} - static GckAttributes * prepare_lookup_certificate_issuer (GcrCertificate *cert) { @@ -168,17 +154,19 @@ } static void -thread_lookup_certificate (GSimpleAsyncResult *res, GObject *object, GCancellable *cancel) +thread_lookup_certificate (GTask *task, gpointer src_object, gpointer task_data, + GCancellable *cancellable) { - lookup_issuer_closure *closure; + GckAttributes *search = (GckAttributes *) task_data; + GcrCertificate *result; GError *error = NULL; - closure = g_simple_async_result_get_op_res_gpointer (res); - closure->result = perform_lookup_certificate (closure->search, cancel, &error); - + result = perform_lookup_certificate (search, cancellable, &error); if (error != NULL) { - g_simple_async_result_set_from_error (res, error); + g_task_return_error (task, g_steal_pointer (&error)); g_clear_error (&error); + } else{ + g_task_return_pointer (task, result, g_object_unref); } } @@ -394,22 +382,21 @@ gcr_pkcs11_certificate_lookup_issuer_async (GcrCertificate *certificate, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *async; - lookup_issuer_closure *closure; + GTask *task; + GckAttributes *search; g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); - async = g_simple_async_result_new (G_OBJECT (certificate), callback, user_data, - gcr_pkcs11_certificate_lookup_issuer_async); - closure = g_new0 (lookup_issuer_closure, 1); - closure->search = prepare_lookup_certificate_issuer (certificate); - g_return_if_fail (closure->search); - g_simple_async_result_set_op_res_gpointer (async, closure, lookup_issuer_free); + task = g_task_new (certificate, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_pkcs11_certificate_lookup_issuer_async); - g_simple_async_result_run_in_thread (async, thread_lookup_certificate, - G_PRIORITY_DEFAULT, cancellable); + search = prepare_lookup_certificate_issuer (certificate); + g_return_if_fail (search); + g_task_set_task_data (task, search, gck_attributes_unref); - g_object_unref (async); + g_task_run_in_thread (task, thread_lookup_certificate); + + g_object_unref (task); } /** @@ -428,21 +415,12 @@ GcrCertificate * gcr_pkcs11_certificate_lookup_issuer_finish (GAsyncResult *result, GError **error) { - lookup_issuer_closure *closure; GObject *source; - g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); - - source = g_async_result_get_source_object (result); - g_return_val_if_fail (g_simple_async_result_is_valid (result, source, - gcr_pkcs11_certificate_lookup_issuer_async), NULL); - g_object_unref (source); + g_return_val_if_fail (G_IS_TASK (result), NULL); - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return NULL; + source = g_task_get_source_object (G_TASK (result)); + g_return_val_if_fail (g_task_is_valid (result, source), NULL); - closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); - if (closure->result != NULL) - g_object_ref (closure->result); - return closure->result; + return g_task_propagate_pointer (G_TASK (result), error); } diff -Nru gcr-3.38.1/gcr/gcr-pkcs11-importer.c gcr-3.40.0/gcr/gcr-pkcs11-importer.c --- gcr-3.38.1/gcr/gcr-pkcs11-importer.c 2021-01-12 22:55:54.666056400 +0000 +++ gcr-3.40.0/gcr/gcr-pkcs11-importer.c 2021-03-27 08:40:56.329531200 +0000 @@ -62,28 +62,16 @@ typedef struct { GcrPkcs11Importer *importer; - GCancellable *cancellable; gboolean prompted; gboolean async; GckBuilder *supplement; } GcrImporterData; -/* State forward declarations */ -static void state_cancelled (GSimpleAsyncResult *res, +/* frward declarations */ +static void state_cancelled (GTask *task, gboolean async); - -static void state_complete (GSimpleAsyncResult *res, - gboolean async); - -static void state_create_object (GSimpleAsyncResult *res, - gboolean async); - -static void state_supplement (GSimpleAsyncResult *res, - gboolean async); - -static void state_open_session (GSimpleAsyncResult *res, +static void state_create_object (GTask *task, gboolean async); - static void _gcr_pkcs11_importer_init_iface (GcrImporterIface *iface); G_DEFINE_TYPE_WITH_CODE (GcrPkcs11Importer, _gcr_pkcs11_importer, G_TYPE_OBJECT, @@ -97,24 +85,23 @@ { GcrImporterData *state = data; - g_clear_object (&state->cancellable); g_clear_object (&state->importer); gck_builder_unref (state->supplement); g_free (state); } static void -next_state (GSimpleAsyncResult *res, - void (*state) (GSimpleAsyncResult *, gboolean)) +next_state (GTask *task, + void (*state) (GTask *, gboolean)) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); g_assert (state); - if (g_cancellable_is_cancelled (data->cancellable)) + if (g_cancellable_is_cancelled (g_task_get_cancellable (task))) state = state_cancelled; - (state) (res, data->async); + (state) (task, data->async); } /* --------------------------------------------------------------------------------- @@ -122,25 +109,17 @@ */ static void -state_complete (GSimpleAsyncResult *res, - gboolean async) -{ - g_simple_async_result_complete (res); -} - -static void -state_cancelled (GSimpleAsyncResult *res, +state_cancelled (GTask *task, gboolean async) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GCancellable *cancellable = g_task_get_cancellable (task); GError *error = NULL; - if (data->cancellable && !g_cancellable_is_cancelled (data->cancellable)) - g_cancellable_cancel (data->cancellable); + if (cancellable && !g_cancellable_is_cancelled (cancellable)) + g_cancellable_cancel (cancellable); - g_cancellable_set_error_if_cancelled (data->cancellable, &error); - g_simple_async_result_take_error (res, error); - next_state (res, state_complete); + g_cancellable_set_error_if_cancelled (cancellable, &error); + g_task_return_error (task, g_steal_pointer (&error)); } /* --------------------------------------------------------------------------------- @@ -148,20 +127,19 @@ */ static void -complete_create_object (GSimpleAsyncResult *res, +complete_create_object (GTask *task, GckObject *object, GError *error) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); GcrPkcs11Importer *self = data->importer; if (object == NULL) { - g_simple_async_result_take_error (res, error); - next_state (res, state_complete); + g_task_return_error (task, g_steal_pointer (&error)); } else { self->objects = g_list_append (self->objects, object); - next_state (res, state_create_object); + next_state (task, state_create_object); } } @@ -170,20 +148,21 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GTask *task = G_TASK (user_data); GError *error = NULL; GckObject *object; object = gck_session_create_object_finish (GCK_SESSION (source), result, &error); - complete_create_object (res, object, error); - g_object_unref (res); + complete_create_object (task, object, error); + g_clear_object (&task); } static void -state_create_object (GSimpleAsyncResult *res, +state_create_object (GTask *task, gboolean async) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); GcrPkcs11Importer *self = data->importer; GckAttributes *attrs; GckObject *object; @@ -191,7 +170,7 @@ /* No more objects */ if (g_queue_is_empty (self->queue)) { - next_state (res, state_complete); + g_task_return_boolean (task, TRUE); } else { @@ -201,12 +180,12 @@ if (async) { gck_session_create_object_async (self->session, attrs, - data->cancellable, on_create_object, - g_object_ref (res)); + cancellable, on_create_object, + g_object_ref (task)); } else { object = gck_session_create_object (self->session, attrs, - data->cancellable, &error); - complete_create_object (res, object, error); + cancellable, &error); + complete_create_object (task, object, error); } gck_attributes_unref (attrs); @@ -406,10 +385,10 @@ } static void -complete_supplement (GSimpleAsyncResult *res, +complete_supplement (GTask *task, GError *error) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); GckAttributes *attributes; if (error == NULL) { @@ -417,10 +396,9 @@ supplement_attributes (data->importer, attributes); gck_attributes_unref (attributes); - next_state (res, state_create_object); + next_state (task, state_create_object); } else { - g_simple_async_result_take_error (res, error); - next_state (res, state_complete); + g_task_return_error (task, g_steal_pointer (&error)); } } @@ -429,44 +407,46 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GcrImporterData *data = g_task_get_task_data (task); GcrPkcs11Importer *self = data->importer; GError *error = NULL; gcr_import_interaction_supplement_finish (GCR_IMPORT_INTERACTION (self->interaction), result, &error); - complete_supplement (res, error); - g_object_unref (res); + complete_supplement (task, error); + g_clear_object (&task); } static void -state_supplement (GSimpleAsyncResult *res, +state_supplement (GTask *task, gboolean async) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); GcrPkcs11Importer *self = data->importer; GError *error = NULL; if (self->interaction == NULL || !GCR_IS_IMPORT_INTERACTION (self->interaction)) { - complete_supplement (res, NULL); + complete_supplement (task, NULL); } else if (async) { gcr_import_interaction_supplement_async (GCR_IMPORT_INTERACTION (self->interaction), - data->supplement, data->cancellable, - on_supplement_done, g_object_ref (res)); + data->supplement, cancellable, + on_supplement_done, + g_object_ref (task)); } else { gcr_import_interaction_supplement (GCR_IMPORT_INTERACTION (self->interaction), - data->supplement, data->cancellable, &error); - complete_supplement (res, error); + data->supplement, cancellable, &error); + complete_supplement (task, error); } } static void -supplement_prep (GSimpleAsyncResult *res) +supplement_prep (GTask *task) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); GcrPkcs11Importer *self = data->importer; const GckAttribute *the_label = NULL; const GckAttribute *attr; @@ -503,21 +483,20 @@ */ static void -complete_open_session (GSimpleAsyncResult *res, +complete_open_session (GTask *task, GckSession *session, GError *error) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); GcrPkcs11Importer *self = data->importer; if (!session) { - g_simple_async_result_take_error (res, error); - next_state (res, state_complete); + g_task_return_error (task, g_steal_pointer (&error)); } else { g_clear_object (&self->session); self->session = session; - next_state (res, state_supplement); + next_state (task, state_supplement); } } @@ -526,20 +505,21 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GTask *task = G_TASK (user_data); GError *error = NULL; GckSession *session; session = gck_session_open_finish (result, &error); - complete_open_session (res, session, error); - g_object_unref (res); + complete_open_session (task, session, error); + g_clear_object (&task); } static void -state_open_session (GSimpleAsyncResult *res, +state_open_session (GTask *task, gboolean async) { - GcrImporterData *data = g_simple_async_result_get_op_res_gpointer (res); + GcrImporterData *data = g_task_get_task_data (task); + GCancellable *cancellable = g_task_get_cancellable (task); GcrPkcs11Importer *self = data->importer; guint options = GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER; GckSession *session; @@ -547,11 +527,11 @@ if (async) { gck_session_open_async (self->slot, options, self->interaction, - data->cancellable, on_open_session, g_object_ref (res)); + cancellable, on_open_session, g_object_ref (task)); } else { session = gck_session_open (self->slot, options, self->interaction, - data->cancellable, &error); - complete_open_session (res, session, error); + cancellable, &error); + complete_open_session (task, session, error); } } @@ -843,21 +823,21 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; GcrImporterData *data; - res = g_simple_async_result_new (G_OBJECT (importer), callback, user_data, - _gcr_pkcs11_importer_import_async); + task = g_task_new (importer, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_pkcs11_importer_import_async); + data = g_new0 (GcrImporterData, 1); data->async = TRUE; data->importer = GCR_PKCS11_IMPORTER (g_object_ref (importer)); - data->cancellable = cancellable ? g_object_ref (cancellable) : NULL; - g_simple_async_result_set_op_res_gpointer (res, data, gcr_importer_data_free); + g_task_set_task_data (task, data, gcr_importer_data_free); - supplement_prep (res); + supplement_prep (task); - next_state (res, state_open_session); - g_object_unref (res); + next_state (task, state_open_session); + g_clear_object (&task); } static gboolean @@ -865,13 +845,9 @@ GAsyncResult *result, GError **error) { - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (importer), - _gcr_pkcs11_importer_import_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; + g_return_val_if_fail (g_task_is_valid (result, importer), FALSE); - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } static void diff -Nru gcr-3.38.1/gcr/gcr-prompt.c gcr-3.40.0/gcr/gcr-prompt.c --- gcr-3.38.1/gcr/gcr-prompt.c 2021-01-12 22:55:54.667056300 +0000 +++ gcr-3.40.0/gcr/gcr-prompt.c 2021-03-27 08:40:56.329531200 +0000 @@ -210,6 +210,10 @@ * The caller window indicates to the prompt which window is prompting the * user. The prompt may choose to ignore this information or use it in whatever * way it sees fit. + * + * In X11, this will be a stringified version of the XWindow handle; in + * Wayland this is the result of an export using the XDG foreign + * protocol. */ g_object_interface_install_property (iface, g_param_spec_string ("caller-window", "Caller window", "Window ID of application window requesting prompt", @@ -244,7 +248,7 @@ */ signals[PROMPT_CLOSE] = g_signal_new ("prompt-close", GCR_TYPE_PROMPT, G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GcrPromptIface, prompt_close), - NULL, NULL, g_cclosure_marshal_generic, + NULL, NULL, NULL, G_TYPE_NONE, 0); g_once_init_leave (&initialized, 1); diff -Nru gcr-3.38.1/gcr/gcr-subject-public-key.c gcr-3.40.0/gcr/gcr-subject-public-key.c --- gcr-3.38.1/gcr/gcr-subject-public-key.c 2021-01-12 22:55:54.670056300 +0000 +++ gcr-3.40.0/gcr/gcr-subject-public-key.c 2021-03-27 08:40:56.331531000 +0000 @@ -510,15 +510,16 @@ } static void -thread_key_attributes (GSimpleAsyncResult *res, - GObject *object, +thread_key_attributes (GTask *task, gpointer src_object, gpointer task_data, GCancellable *cancellable) { - LoadClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + LoadClosure *closure = task_data; GError *error = NULL; - if (!load_attributes (closure->object, &closure->builder, cancellable, &error)) - g_simple_async_result_take_error (res, error); + if (load_attributes (closure->object, &closure->builder, cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&error)); } void @@ -527,29 +528,28 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; LoadClosure *closure; g_return_if_fail (GCK_IS_OBJECT (key)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - res = g_simple_async_result_new (NULL, callback, user_data, - _gcr_subject_public_key_load_async); + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_subject_public_key_load_async); closure = g_slice_new0 (LoadClosure); closure->object = g_object_ref (key); lookup_attributes (key, &closure->builder); - g_simple_async_result_set_op_res_gpointer (res, closure, load_closure_free); + g_task_set_task_data (task, closure, load_closure_free); if (check_attributes (&closure->builder)) { - g_simple_async_result_complete_in_idle (res); - g_object_unref (res); + g_task_return_boolean (task, TRUE); + g_clear_object (&task); return; } - g_simple_async_result_run_in_thread (res, thread_key_attributes, - G_PRIORITY_DEFAULT, cancellable); - g_object_unref (res); + g_task_run_in_thread (task, thread_key_attributes); + g_clear_object (&task); } GNode * @@ -557,19 +557,16 @@ GError **error) { GckAttributes *attributes; - GSimpleAsyncResult *res; LoadClosure *closure; GNode *asn; g_return_val_if_fail (error == NULL || *error == NULL, NULL); - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, - _gcr_subject_public_key_load_async), NULL); + g_return_val_if_fail (g_task_is_valid (result, NULL), NULL); - res = G_SIMPLE_ASYNC_RESULT (result); - if (g_simple_async_result_propagate_error (res, error)) + if (!g_task_propagate_boolean (G_TASK (result), error)) return NULL; - closure = g_simple_async_result_get_op_res_gpointer (res); + closure = g_task_get_task_data (G_TASK (result)); attributes = gck_attributes_ref_sink (gck_builder_end (&closure->builder)); asn = _gcr_subject_public_key_for_attributes (attributes); if (asn == NULL) { diff -Nru gcr-3.38.1/gcr/gcr-trust.c gcr-3.40.0/gcr/gcr-trust.c --- gcr-3.38.1/gcr/gcr-trust.c 2021-01-12 22:55:54.671056300 +0000 +++ gcr-3.40.0/gcr/gcr-trust.c 2021-03-27 08:40:56.331531000 +0000 @@ -97,19 +97,6 @@ * HELPERS */ -typedef struct { - GckAttributes *attrs; - gboolean found; -} trust_closure; - -static void -trust_closure_free (gpointer data) -{ - trust_closure *closure = data; - gck_attributes_unref (closure->attrs); - g_free (closure); -} - static void prepare_trust_attrs (GcrCertificate *certificate, CK_X_ASSERTION_TYPE type, @@ -211,18 +198,18 @@ } static void -thread_is_certificate_pinned (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +thread_is_certificate_pinned (GTask *task, gpointer object, + gpointer task_data, GCancellable *cancellable) { + GckAttributes *attrs = task_data; GError *error = NULL; - trust_closure *closure; - - closure = g_simple_async_result_get_op_res_gpointer (result); - closure->found = perform_is_certificate_pinned (closure->attrs, cancel, &error); + gboolean found; - if (error != NULL) { - g_simple_async_result_set_from_error (result, error); - g_clear_error (&error); - } + found = perform_is_certificate_pinned (attrs, cancellable, &error); + if (error == NULL) + g_task_return_boolean (task, found); + else + g_task_return_error (task, g_steal_pointer (&error)); } /** @@ -246,24 +233,23 @@ const gchar *peer, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *async; - trust_closure *closure; + GTask *task; + GckAttributes *attrs; - g_return_if_fail (GCR_CERTIFICATE (certificate)); + g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); g_return_if_fail (purpose); g_return_if_fail (peer); - async = g_simple_async_result_new (NULL, callback, user_data, - gcr_trust_is_certificate_pinned_async); - closure = g_new0 (trust_closure, 1); - closure->attrs = prepare_is_certificate_pinned (certificate, purpose, peer); - g_return_if_fail (closure->attrs); - g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_trust_is_certificate_pinned_async); + + attrs = prepare_is_certificate_pinned (certificate, purpose, peer); + g_return_if_fail (attrs); + g_task_set_task_data (task, attrs, gck_attributes_unref); - g_simple_async_result_run_in_thread (async, thread_is_certificate_pinned, - G_PRIORITY_DEFAULT, cancellable); + g_task_run_in_thread (task, thread_is_certificate_pinned); - g_object_unref (async); + g_clear_object (&task); } /** @@ -282,19 +268,10 @@ gboolean gcr_trust_is_certificate_pinned_finish (GAsyncResult *result, GError **error) { - trust_closure *closure; - - g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, - gcr_trust_is_certificate_pinned_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; - - closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); - return closure->found; + return g_task_propagate_boolean (G_TASK (result), error); } /* ---------------------------------------------------------------------------------- @@ -428,18 +405,17 @@ } static void -thread_add_pinned_certificate (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +thread_add_pinned_certificate (GTask *task, gpointer object, + gpointer task_data, GCancellable *cancellable) { + GckAttributes *attrs = task_data; GError *error = NULL; - trust_closure *closure; - - closure = g_simple_async_result_get_op_res_gpointer (result); - perform_add_pinned_certificate (closure->attrs, cancel, &error); - if (error != NULL) { - g_simple_async_result_set_from_error (result, error); - g_clear_error (&error); - } + perform_add_pinned_certificate (attrs, cancellable, &error); + if (error == NULL) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&error)); } /** @@ -467,24 +443,23 @@ const gchar *peer, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *async; - trust_closure *closure; + GTask *task; + GckAttributes *attrs; g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); g_return_if_fail (purpose); g_return_if_fail (peer); - async = g_simple_async_result_new (NULL, callback, user_data, - gcr_trust_add_pinned_certificate_async); - closure = g_new0 (trust_closure, 1); - closure->attrs = prepare_add_pinned_certificate (certificate, purpose, peer); - g_return_if_fail (closure->attrs); - g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_trust_add_pinned_certificate_async); + + attrs = prepare_add_pinned_certificate (certificate, purpose, peer); + g_return_if_fail (attrs); + g_task_set_task_data (task, attrs, gck_attributes_unref); - g_simple_async_result_run_in_thread (async, thread_add_pinned_certificate, - G_PRIORITY_DEFAULT, cancellable); + g_task_run_in_thread (task, thread_add_pinned_certificate); - g_object_unref (async); + g_clear_object (&task); } /** @@ -500,16 +475,10 @@ gboolean gcr_trust_add_pinned_certificate_finish (GAsyncResult *result, GError **error) { - g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, - gcr_trust_add_pinned_certificate_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } /* ----------------------------------------------------------------------- @@ -613,18 +582,18 @@ } static void -thread_remove_pinned_certificate (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +thread_remove_pinned_certificate (GTask *task, gpointer object, + gpointer task_data, GCancellable *cancellable) { + GckAttributes *attrs = task_data; GError *error = NULL; - trust_closure *closure; - closure = g_simple_async_result_get_op_res_gpointer (result); - perform_remove_pinned_certificate (closure->attrs, cancel, &error); + perform_remove_pinned_certificate (attrs, cancellable, &error); - if (error != NULL) { - g_simple_async_result_set_from_error (result, error); - g_clear_error (&error); - } + if (error == NULL) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, g_steal_pointer (&error)); } /** @@ -646,28 +615,30 @@ * operation. */ void -gcr_trust_remove_pinned_certificate_async (GcrCertificate *certificate, const gchar *purpose, - const gchar *peer, GCancellable *cancellable, - GAsyncReadyCallback callback, gpointer user_data) +gcr_trust_remove_pinned_certificate_async (GcrCertificate *certificate, + const gchar *purpose, + const gchar *peer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { - GSimpleAsyncResult *async; - trust_closure *closure; + GTask *task; + GckAttributes *attrs; g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); g_return_if_fail (purpose); g_return_if_fail (peer); - async = g_simple_async_result_new (NULL, callback, user_data, - gcr_trust_remove_pinned_certificate_async); - closure = g_new0 (trust_closure, 1); - closure->attrs = prepare_remove_pinned_certificate (certificate, purpose, peer); - g_return_if_fail (closure->attrs); - g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_trust_remove_pinned_certificate_async); + + attrs = prepare_remove_pinned_certificate (certificate, purpose, peer); + g_return_if_fail (attrs); + g_task_set_task_data (task, attrs, gck_attributes_unref); - g_simple_async_result_run_in_thread (async, thread_remove_pinned_certificate, - G_PRIORITY_DEFAULT, cancellable); + g_task_run_in_thread (task, thread_remove_pinned_certificate); - g_object_unref (async); + g_clear_object (&task); } /** @@ -683,16 +654,10 @@ gboolean gcr_trust_remove_pinned_certificate_finish (GAsyncResult *result, GError **error) { - g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, - gcr_trust_remove_pinned_certificate_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; - - return TRUE; + return g_task_propagate_boolean (G_TASK (result), error); } /* ---------------------------------------------------------------------------------- @@ -777,18 +742,18 @@ } static void -thread_is_certificate_anchored (GSimpleAsyncResult *result, GObject *object, GCancellable *cancel) +thread_is_certificate_anchored (GTask *task, gpointer object, + gpointer task_data, GCancellable *cancellable) { + GckAttributes *attrs = task_data; GError *error = NULL; - trust_closure *closure; - - closure = g_simple_async_result_get_op_res_gpointer (result); - closure->found = perform_is_certificate_anchored (closure->attrs, cancel, &error); + gboolean found; - if (error != NULL) { - g_simple_async_result_set_from_error (result, error); - g_clear_error (&error); - } + found = perform_is_certificate_anchored (attrs, cancellable, &error); + if (error == NULL) + g_task_return_boolean (task, found); + else + g_task_return_error (task, g_steal_pointer (&error)); } /** @@ -811,23 +776,22 @@ GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *async; - trust_closure *closure; + GTask *task; + GckAttributes *attrs; g_return_if_fail (GCR_IS_CERTIFICATE (certificate)); g_return_if_fail (purpose); - async = g_simple_async_result_new (NULL, callback, user_data, - gcr_trust_is_certificate_anchored_async); - closure = g_new0 (trust_closure, 1); - closure->attrs = prepare_is_certificate_anchored (certificate, purpose); - g_return_if_fail (closure->attrs); - g_simple_async_result_set_op_res_gpointer (async, closure, trust_closure_free); + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, gcr_trust_is_certificate_anchored_async); - g_simple_async_result_run_in_thread (async, thread_is_certificate_anchored, - G_PRIORITY_DEFAULT, cancellable); + attrs = prepare_is_certificate_anchored (certificate, purpose); + g_return_if_fail (attrs); + g_task_set_task_data (task, attrs, gck_attributes_unref); - g_object_unref (async); + g_task_run_in_thread (task, thread_is_certificate_anchored); + + g_clear_object (&task); } /** @@ -846,17 +810,8 @@ gboolean gcr_trust_is_certificate_anchored_finish (GAsyncResult *result, GError **error) { - trust_closure *closure; - - g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); g_return_val_if_fail (!error || !*error, FALSE); + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); - g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, - gcr_trust_is_certificate_anchored_async), FALSE); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return FALSE; - - closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); - return closure->found; + return g_task_propagate_boolean (G_TASK (result), error); } diff -Nru gcr-3.38.1/gcr/Makefile.am gcr-3.40.0/gcr/Makefile.am --- gcr-3.38.1/gcr/Makefile.am 2021-01-12 22:55:54.653056100 +0000 +++ gcr-3.40.0/gcr/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,423 +0,0 @@ -# included in top-level Makefile.am - -gcr_incdir = $(includedir)/gcr-@GCR_MAJOR@/gcr - -gcr_HEADER_FILES = \ - gcr/gcr-base.h \ - gcr/gcr-certificate.h \ - gcr/gcr-certificate-chain.h \ - gcr/gcr-certificate-request.h \ - gcr/gcr-collection.h \ - gcr/gcr-column.h \ - gcr/gcr-comparable.h \ - gcr/gcr-deprecated-base.h \ - gcr/gcr-fingerprint.h \ - gcr/gcr-filter-collection.h \ - gcr/gcr-icons.h \ - gcr/gcr-importer.h \ - gcr/gcr-import-interaction.h \ - gcr/gcr-library.h \ - gcr/gcr-mock-prompter.h \ - gcr/gcr-parser.h \ - gcr/gcr-pkcs11-certificate.h \ - gcr/gcr-prompt.h \ - gcr/gcr-secret-exchange.h \ - gcr/gcr-secure-memory.h \ - gcr/gcr-simple-certificate.h \ - gcr/gcr-simple-collection.h \ - gcr/gcr-ssh-askpass.h \ - gcr/gcr-system-prompt.h \ - gcr/gcr-system-prompter.h \ - gcr/gcr-trust.h \ - gcr/gcr-types.h \ - gcr/gcr-union-collection.h \ - gcr/gcr-unlock-options.h \ - gcr/gcr-version.h - -gcr_inc_HEADERS = \ - $(gcr_HEADER_FILES) \ - gcr/gcr-enum-types-base.h - -if WITH_GTK -gcr_inc_HEADERS += gcr/gcr.h -endif - -lib_LTLIBRARIES += \ - libgcr-base-@GCR_MAJOR@.la - -gcr_BUILT_SOURCES = \ - gcr/gcr-marshal.c gcr/gcr-marshal.h \ - gcr/gcr-enum-types-base.c gcr/gcr-enum-types-base.h \ - gcr/gcr-oids.c gcr/gcr-oids.h \ - gcr/gcr-dbus-generated.c gcr/gcr-dbus-generated.h - -BUILT_SOURCES += $(gcr_BUILT_SOURCES) - -gcr_PUBLIC_FILES = \ - gcr/gcr-base.h \ - gcr/gcr-certificate.c gcr/gcr-certificate.h \ - gcr/gcr-certificate-chain.c gcr/gcr-certificate-chain.h \ - gcr/gcr-certificate-request.c gcr/gcr-certificate-request.h \ - gcr/gcr-collection.c gcr/gcr-collection.h \ - gcr/gcr-column.h \ - gcr/gcr-comparable.c gcr/gcr-comparable.h \ - gcr/gcr-filter-collection.c gcr/gcr-filter-collection.h \ - gcr/gcr-fingerprint.c gcr/gcr-fingerprint.h \ - gcr/gcr-icons.c gcr/gcr-icons.h \ - gcr/gcr-importer.c gcr/gcr-importer.h \ - gcr/gcr-import-interaction.c gcr/gcr-import-interaction.h \ - gcr/gcr-library.c gcr/gcr-library.h \ - gcr/gcr-mock-prompter.c gcr/gcr-mock-prompter.h \ - gcr/gcr-parser.c gcr/gcr-parser.h \ - gcr/gcr-pkcs11-certificate.c gcr/gcr-pkcs11-certificate.h \ - gcr/gcr-prompt.c gcr/gcr-prompt.h \ - gcr/gcr-secret-exchange.c gcr/gcr-secret-exchange.h \ - gcr/gcr-secure-memory.c gcr/gcr-secure-memory.h \ - gcr/gcr-simple-certificate.c gcr/gcr-simple-certificate.h \ - gcr/gcr-simple-collection.c gcr/gcr-simple-collection.h \ - gcr/gcr-ssh-askpass.c gcr/gcr-ssh-askpass.h \ - gcr/gcr-system-prompt.c gcr/gcr-system-prompt.h \ - gcr/gcr-system-prompter.c gcr/gcr-system-prompter.h \ - gcr/gcr-trust.c gcr/gcr-trust.h \ - gcr/gcr-types.h \ - gcr/gcr-union-collection.c gcr/gcr-union-collection.h \ - gcr/gcr-unlock-options.h \ - gcr/gcr-version.h \ - $(NULL) - -gcr_PRIVATE_FILES = \ - gcr/gcr-callback-output-stream.c gcr/gcr-callback-output-stream.h \ - gcr/gcr-certificate-extensions.c gcr/gcr-certificate-extensions.h \ - gcr/gcr-column.c \ - gcr/gcr-dbus-constants.h \ - gcr/gcr-deprecated-base.h \ - gcr/gcr-gnupg-collection.c gcr/gcr-gnupg-collection.h \ - gcr/gcr-gnupg-importer.c gcr/gcr-gnupg-importer.h \ - gcr/gcr-gnupg-key.c gcr/gcr-gnupg-key.h \ - gcr/gcr-gnupg-process.c gcr/gcr-gnupg-process.h \ - gcr/gcr-gnupg-records.c gcr/gcr-gnupg-records.h \ - gcr/gcr-gnupg-util.c gcr/gcr-gnupg-util.h \ - gcr/gcr-internal.h \ - gcr/gcr-key-mechanisms.h gcr/gcr-key-mechanisms.c \ - gcr/gcr-memory-icon.c gcr/gcr-memory-icon.h \ - gcr/gcr-openpgp.c gcr/gcr-openpgp.h \ - gcr/gcr-openssh.c gcr/gcr-openssh.h \ - gcr/gcr-pkcs11-importer.c gcr/gcr-pkcs11-importer.h \ - gcr/gcr-record.c gcr/gcr-record.h \ - gcr/gcr-single-collection.c gcr/gcr-single-collection.h \ - gcr/gcr-subject-public-key.c gcr/gcr-subject-public-key.h \ - gcr/gcr-util.c gcr/gcr-util.h \ - $(NULL) - -libgcr_base_@GCR_MAJOR@_la_SOURCES = \ - $(gcr_PUBLIC_FILES) \ - $(gcr_PRIVATE_FILES) \ - $(NULL) - -nodist_libgcr_base_@GCR_MAJOR@_la_SOURCES = \ - $(gcr_BUILT_SOURCES) - -libgcr_base_@GCR_MAJOR@_la_CFLAGS = \ - $(LIBGCRYPT_CFLAGS) \ - $(P11_KIT_CFLAGS) \ - -DGCK_API_SUBJECT_TO_CHANGE \ - -DP11_KIT_API_SUBJECT_TO_CHANGE \ - -DGCR_COMPILATION \ - -DG_LOG_DOMAIN=\"Gcr\" - -libgcr_base_@GCR_MAJOR@_la_LDFLAGS = \ - -version-info $(GCR_LT_RELEASE) \ - -no-undefined \ - -export-symbols-regex '^_gcr_.*|^gcr_.*|^SECMEM_.*' - -libgcr_base_@GCR_MAJOR@_la_LIBADD = \ - libegg.la \ - libgck-@GCK_MAJOR@.la \ - $(GLIB_LIBS) \ - $(LIBGCRYPT_LIBS) \ - $(P11_KIT_LIBS) - -gcr/gcr-marshal.h: gcr/gcr-marshal.list $(GLIB_GENMARSHAL) - $(AM_V_GEN) $(GLIB_GENMARSHAL) $< --header --prefix=_gcr_marshal > $@ - -gcr/gcr-marshal.c: gcr/gcr-marshal.list $(GLIB_GENMARSHAL) - $(AM_V_GEN) ( echo "#include \"gcr/gcr-marshal.h\"" > $@ && \ - $(GLIB_GENMARSHAL) $< --body --prefix=_gcr_marshal >> $@ ) - -gcr/gcr-enum-types-base.h: $(ENUM_TEMPLATE_H) $(gcr_HEADER_FILES) - $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ -gcr/gcr-enum-types-base.c: $(ENUM_TEMPLATE_C) $(gcr_HEADER_FILES) - $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ - -gcr/gcr-oids.c: gcr/gcr-oids.list gcr/gcr-mkoids - $(AM_V_GEN) sh $(srcdir)/gcr/gcr-mkoids -p GCR -c gcr/gcr-oids.c -h gcr/gcr-oids.h $(srcdir)/gcr/gcr-oids.list - -gcr/gcr-oids.h: gcr/gcr-oids.c - -DBUS_XML_DEFINITIONS = \ - gcr/org.gnome.keyring.Prompter.xml - -gcr/gcr-dbus-generated.c: $(DBUS_XML_DEFINITIONS) - $(AM_V_GEN) $(GDBUS_CODEGEN) --interface-prefix org.gnome.keyring.internal. \ - --generate-c-code gcr/gcr-dbus-generated --c-namespace GcrDBus $^ - $(AM_V_GEN) sed -e 's/gcr_dbus/_gcr_dbus/g' \ - gcr/gcr-dbus-generated.c > gcr/gcr-dbus-generated.c.tmp && \ - mv gcr/gcr-dbus-generated.c.tmp gcr/gcr-dbus-generated.c - $(AM_V_GEN) sed -e 's/gcr_dbus/_gcr_dbus/g' \ - gcr/gcr-dbus-generated.h > gcr/gcr-dbus-generated.h.tmp && \ - mv gcr/gcr-dbus-generated.h.tmp gcr/gcr-dbus-generated.h - -gcr/gcr-dbus-generated.h: gcr/gcr-dbus-generated.c - -libexec_PROGRAMS += gcr-ssh-askpass - -gcr_ssh_askpass_SOURCES = gcr/gcr-ssh-askpass.c - -gcr_ssh_askpass_CFLAGS = \ - -DGCR_SSH_ASKPASS_TOOL \ - -DGCR_COMPILATION \ - $(GLIB_CFLAGS) - -gcr_ssh_askpass_LDADD = \ - libegg.la \ - $(GLIB_LIBS) - -pkgconfig_DATA += \ - gcr-base-$(GCR_MAJOR).pc - -gcr-base-$(GCR_MAJOR).pc: gcr/gcr-base.pc - $(AM_V_GEN) cp gcr/gcr-base.pc gcr-base-$(GCR_MAJOR).pc - -service_in_files = \ - gcr/org.gnome.keyring.SystemPrompter.service.in \ - gcr/org.gnome.keyring.PrivatePrompter.service.in -servicedir = $(DBUS_SERVICES_DIR) -service_DATA = $(service_in_files:.service.in=.service) - -EXTRA_DIST += \ - gcr/gcr-base.pc.in \ - gcr/gcr-marshal.list \ - gcr/gcr-oids.list \ - gcr/gcr-mkoids \ - $(DBUS_XML_DEFINITIONS) \ - gcr/gcr-base.symbols \ - $(service_in_files) \ - gcr/gcr-version.h.in - -CLEANFILES += \ - $(service_DATA) \ - gcr-base-actual.abi \ - gcr-base-expected.abi \ - Gcr-3.broken.gir - -if HAVE_INTROSPECTION - -INTROSPECTION_GIRS += Gcr-@GCR_MAJOR@.broken.gir - -Gcr-@GCR_MAJOR@.gir: Gcr-@GCR_MAJOR@.broken.gir $(FIX_GIR) - -Gcr-@GCR_MAJOR@.broken.gir: libgcr-base-@GCR_MAJOR@.la Gck-@GCK_MAJOR@.gir - -Gcr_@GCR_MAJOR@_broken_gir_PACKAGES = p11-kit-1 -Gcr_@GCR_MAJOR@_broken_gir_EXPORT_PACKAGES = gcr-base-@GCR_MAJOR@ -Gcr_@GCR_MAJOR@_broken_gir_INCLUDES = GLib-2.0 GObject-2.0 -Gcr_@GCR_MAJOR@_broken_gir_LIBS = libgcr-base-@GCR_MAJOR@.la -Gcr_@GCR_MAJOR@_broken_gir_CFLAGS = -I$(top_srcdir) -I$(top_builddir) \ - -DGCR_COMPILATION -DGCR_API_SUBJECT_TO_CHANGE -Gcr_@GCR_MAJOR@_broken_gir_FILES = $(gcr_PUBLIC_FILES) -Gcr_@GCR_MAJOR@_broken_gir_SCANNERFLAGS = \ - --add-include-path=$(top_builddir)/gck \ - --include-uninstalled=$(builddir)/Gck-@GCK_MAJOR@.gir \ - --c-include "gcr/gcr-base.h" \ - --identifier-prefix Gcr \ - --nsversion @GCR_MAJOR@ - -gir_DATA += Gcr-@GCR_MAJOR@.gir - -if ENABLE_VAPIGEN - -gcr-@GCR_MAJOR@.vapi: Gcr-@GCR_MAJOR@.gir gcr/Gcr-@GCR_MAJOR@.metadata gcr-@GCR_MAJOR@.deps gck-@GCK_MAJOR@.vapi - -VAPIGEN_VAPIS += gcr-@GCR_MAJOR@.vapi - -gcr_@GCR_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 gck-@GCK_MAJOR@ -gcr_@GCR_MAJOR@_vapi_METADATADIRS = $(srcdir)/gcr -gcr_@GCR_MAJOR@_vapi_VAPIDIRS = $(builddir) -gcr_@GCR_MAJOR@_vapi_GIRDIRS = $(builddir) -gcr_@GCR_MAJOR@_vapi_FILES = Gcr-@GCR_MAJOR@.gir - -gcr-$(GCR_MAJOR).deps: Makefile.am - $(AM_V_GEN) echo $(gcr_@GCR_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ - -EXTRA_DIST += \ - gcr/Gcr-@GCR_MAJOR@.metadata - -endif # ENABLE_VAPIGEN - -endif # HAVE_INTROSPECTON - -# ---------------------------------------------------------------- - -gcr-base-expected.abi: gcr/gcr-base.symbols - $(AM_V_GEN) cpp -P $< | sort > $@ - -gcr-base-actual.abi: $(builddir)/.libs/libgcr-base-@GCR_MAJOR@.so - $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ - cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end|_gcr_)' | sort > $@ - -check-gcr-symbols: gcr-base-expected.abi gcr-base-actual.abi - $(AM_V_GEN) diff -U0 --ignore-blank-lines gcr-base-expected.abi gcr-base-actual.abi || \ - (echo "check-symbols: Symbols have CHANGED. Fix gcr-base.symbols"; exit 1) - -gcr_CFLAGS = \ - -I$(top_builddir) \ - -I$(top_srcdir) \ - -DSRCDIR="\"@abs_srcdir@\"" \ - -DGCR_API_SUBJECT_TO_CHANGE \ - -DGCK_API_SUBJECT_TO_CHANGE \ - -DGCR_COMPILATION \ - $(GLIB_CFLAGS) \ - $(LIBGCRYPT_CFLAGS) \ - $(P11_KIT_CFLAGS) - -gcr_LIBS = \ - libgcr-base-@GCR_MAJOR@.la \ - libegg.la \ - libgck-testable.la \ - $(GLIB_LIBS) \ - $(LIBGCRYPT_LIBS) \ - $(P11_KIT_LIBS) - -gcr_TESTS = \ - test-util \ - test-filter-collection \ - test-secret-exchange \ - test-simple-certificate \ - test-certificate \ - test-certificate-chain \ - test-subject-public-key \ - test-fingerprint \ - test-pkcs11-certificate \ - test-openpgp \ - test-openssh \ - test-secure-memory \ - test-trust \ - test-parser \ - test-record \ - test-memory-icon \ - test-gnupg-key \ - test-gnupg-collection \ - test-gnupg-process \ - test-system-prompt \ - test-ssh-askpass - -test_certificate_SOURCES = gcr/test-certificate.c -test_certificate_CFLAGS = $(gcr_CFLAGS) -test_certificate_LDADD = $(gcr_LIBS) - -test_certificate_chain_SOURCES = gcr/test-certificate-chain.c -test_certificate_chain_CFLAGS = $(gcr_CFLAGS) -test_certificate_chain_LDADD = $(gcr_LIBS) - -test_filter_collection_SOURCES = gcr/test-filter-collection.c -test_filter_collection_CFLAGS = $(gcr_CFLAGS) -test_filter_collection_LDADD = $(gcr_LIBS) - -test_fingerprint_SOURCES = gcr/test-fingerprint.c -test_fingerprint_CFLAGS = $(gcr_CFLAGS) -test_fingerprint_LDADD = $(gcr_LIBS) - -test_gnupg_collection_SOURCES = gcr/test-gnupg-collection.c -test_gnupg_collection_CFLAGS = $(gcr_CFLAGS) -test_gnupg_collection_LDADD = $(gcr_LIBS) - -test_gnupg_key_SOURCES = gcr/test-gnupg-key.c -test_gnupg_key_CFLAGS = $(gcr_CFLAGS) -test_gnupg_key_LDADD = $(gcr_LIBS) - -test_gnupg_process_SOURCES = gcr/test-gnupg-process.c -test_gnupg_process_CFLAGS = $(gcr_CFLAGS) -test_gnupg_process_LDADD = $(gcr_LIBS) - -test_memory_icon_SOURCES = gcr/test-memory-icon.c -test_memory_icon_CFLAGS = $(gcr_CFLAGS) -test_memory_icon_LDADD = $(gcr_LIBS) - -test_openpgp_SOURCES = gcr/test-openpgp.c -test_openpgp_CFLAGS = $(gcr_CFLAGS) -test_openpgp_LDADD = $(gcr_LIBS) - -test_openssh_SOURCES = gcr/test-openssh.c -test_openssh_CFLAGS = $(gcr_CFLAGS) -test_openssh_LDADD = $(gcr_LIBS) - -test_parser_SOURCES = gcr/test-parser.c -test_parser_CFLAGS = $(gcr_CFLAGS) -test_parser_LDADD = $(gcr_LIBS) - -test_pkcs11_certificate_SOURCES = gcr/test-pkcs11-certificate.c -test_pkcs11_certificate_CFLAGS = $(gcr_CFLAGS) -test_pkcs11_certificate_LDADD = $(gcr_LIBS) - -test_record_SOURCES = gcr/test-record.c -test_record_CFLAGS = $(gcr_CFLAGS) -test_record_LDADD = $(gcr_LIBS) - -test_secret_exchange_SOURCES = gcr/test-secret-exchange.c -test_secret_exchange_CFLAGS = $(gcr_CFLAGS) -test_secret_exchange_LDADD = $(gcr_LIBS) - -test_secure_memory_SOURCES = gcr/test-secure-memory.c -test_secure_memory_CFLAGS = $(gcr_CFLAGS) -test_secure_memory_LDADD = $(gcr_LIBS) - -test_simple_certificate_SOURCES = gcr/test-simple-certificate.c -test_simple_certificate_CFLAGS = $(gcr_CFLAGS) -test_simple_certificate_LDADD = $(gcr_LIBS) - -test_ssh_askpass_SOURCES = gcr/test-ssh-askpass.c -test_ssh_askpass_CFLAGS = $(gcr_CFLAGS) -test_ssh_askpass_LDADD = libegg-test.la $(gcr_LIBS) - -test_subject_public_key_SOURCES = gcr/test-subject-public-key.c -test_subject_public_key_CFLAGS = $(gcr_CFLAGS) -test_subject_public_key_LDADD = $(gcr_LIBS) - -test_system_prompt_SOURCES = gcr/test-system-prompt.c -test_system_prompt_CFLAGS = $(gcr_CFLAGS) -test_system_prompt_LDADD = $(gcr_LIBS) - -test_trust_SOURCES = gcr/test-trust.c -test_trust_CFLAGS = $(gcr_CFLAGS) -test_trust_LDADD = $(gcr_LIBS) - -test_util_SOURCES = gcr/test-util.c -test_util_CFLAGS = $(gcr_CFLAGS) -test_util_LDADD = $(gcr_LIBS) - -check_PROGRAMS += $(gcr_TESTS) -TESTS += $(gcr_TESTS) - -EXTRA_DIST += \ - gcr/fixtures - -# ------------------------------------------------------------------ - -noinst_PROGRAMS += \ - frob-openpgp \ - frob-certificate-request \ - frob-parser - -frob_certificate_request_SOURCES = \ - gcr/frob-certificate-request.c \ - gcr/console-interaction.c gcr/console-interaction.h -frob_certificate_request_CFLAGS = $(gcr_CFLAGS) -frob_certificate_request_LDADD = $(gcr_LIBS) - -frob_openpgp_SOURCES = gcr/frob-openpgp.c -frob_openpgp_CFLAGS = $(gcr_CFLAGS) -frob_openpgp_LDADD = $(gcr_LIBS) - -frob_parser_SOURCES = gcr/frob-parser.c -frob_parser_CFLAGS = $(gcr_CFLAGS) -frob_parser_LDADD = $(gcr_LIBS) diff -Nru gcr-3.38.1/gcr/test-gnupg-collection.c gcr-3.40.0/gcr/test-gnupg-collection.c --- gcr-3.38.1/gcr/test-gnupg-collection.c 2021-01-12 22:55:54.672056400 +0000 +++ gcr-3.40.0/gcr/test-gnupg-collection.c 2021-03-27 08:40:56.332531200 +0000 @@ -210,7 +210,7 @@ GcrGnupgKey *key; _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); - egg_test_wait_until (2500); + egg_test_wait_until (500000); g_assert (test->result); _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); g_assert_no_error (error); diff -Nru gcr-3.38.1/gcr/test-gnupg-key.c gcr-3.40.0/gcr/test-gnupg-key.c --- gcr-3.38.1/gcr/test-gnupg-key.c 2021-01-12 22:55:54.673056400 +0000 +++ gcr-3.40.0/gcr/test-gnupg-key.c 2021-03-27 08:40:56.332531200 +0000 @@ -78,6 +78,7 @@ teardown (Test *test, gconstpointer unused) { g_object_unref (test->key); + egg_test_wait_for_gtask_thread (test->key); g_assert (test->key == NULL); g_ptr_array_unref (test->records); diff -Nru gcr-3.38.1/gcr/test-subject-public-key.c gcr-3.40.0/gcr/test-subject-public-key.c --- gcr-3.38.1/gcr/test-subject-public-key.c 2021-01-12 22:55:54.674056300 +0000 +++ gcr-3.40.0/gcr/test-subject-public-key.c 2021-03-27 08:40:56.333531100 +0000 @@ -255,9 +255,11 @@ CK_RV rv; g_object_unref (test->session); - g_assert (test->session == NULL); - g_object_unref (test->module); + + egg_test_wait_for_gtask_thread (test->session || test->module); + + g_assert (test->session == NULL); g_assert (test->module == NULL); rv = (test->funcs.C_Finalize) (NULL); @@ -307,12 +309,13 @@ gconstpointer fixture) { g_object_unref (test->crt_object); - g_assert (test->crt_object == NULL); - g_object_unref (test->prv_object); - g_assert (test->prv_object == NULL); - g_object_unref (test->pub_object); + + egg_test_wait_for_gtask_thread (test->crt_object || test->prv_object || test->pub_object); + + g_assert (test->crt_object == NULL); + g_assert (test->prv_object == NULL); g_assert (test->pub_object == NULL); teardown_module (&test->mo, NULL); diff -Nru gcr-3.38.1/gcr.doap gcr-3.40.0/gcr.doap --- gcr-3.38.1/gcr.doap 2021-01-12 22:55:54.652056200 +0000 +++ gcr-3.40.0/gcr.doap 2021-03-27 08:40:56.319531200 +0000 @@ -23,7 +23,7 @@ Stef Walter - + stefw diff -Nru gcr-3.38.1/HACKING gcr-3.40.0/HACKING --- gcr-3.38.1/HACKING 2021-01-12 22:55:54.635056000 +0000 +++ gcr-3.40.0/HACKING 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ - -HACKING GCR and GCK libraries - -BUILD OPTIONS ---------------- - -Build options for developers: - - --enable-strict: Build with -Werror, disable deprecations, and fatal warnings - - --enable-debug: Turn off compiler optimization - --disable-debug: Turn off all debug options and output. - - --enable-coverage: Build coverage, use 'make coverage' for summary. - - -PATCHES ----------- - -Patches should be submitted to bugzilla: - -http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&component=gcr - -The gnome-keyring mailing list is: -gnome-keyring-list@gnome.org - -egg - Various bits of code shared with other modules - -gck - A public library for accessing PKCS#11 modules. - -gcr - A public library for bits of crypto UI and parsing etc... - -schema - Desktop settings schemas for crypto stuff - -testing - Testing CA, gnupg and other mock setups - ----------------------------------------------------------------------------------- - CODING STYLE ----------------------------------------------------------------------------------- - -Our coding style is very similar to the linux coding style: - - http://lxr.linux.no/linux/Documentation/CodingStyle - -Summary below. Differences from Linux coding style are marked with a plus -instead of an asterisk: - - + Space between function name and parentheses. - - my_function_call (arg1, arg2); - - * Braces on the same line as conditional with spaces around braces: - - if (test) { - do_y (); - do_z (); - } - - switch (value) { - case CONSTANT: - do_z (); - break; - default: - break; - } - - * Braces around functions on a separate line from function name, - return value on a separate line, arguments on separate lines. - - static void - my_special_function (int arg1, - int arg2) - { - /* body of function */ - } - - * Don't use braces unnecessarily: - - if (test) - do_this_thing (); - - * But use braces here, when one section has more than a line: - - if (test) { - do_this_thing (); - } else { - do_other_thing (); - smile_nicely (); - } - - * Use of tabs for 8 char indent. - - ------->if (test) { - ------->------->Value; - ------->------->Value; - ------->} - - * No trailing whitespace on lines. Git will warn you about this. - Please enforce it like so (in gnome-keyring checkout): - - $ cp -ipv .git/hooks/pre-commit.sample .git/hooks/pre-commit - - * The '*' in a pointer declaraction belongs with the variable name: - - char *name; - - + Extra long wrapped lines should wrap to function opening brace - using spaces past indentation point. - - ------>my_function_call ("this is a very long argument here", - ------> "wrapped argument is indented with spaces"); - - * Function names are in lower case with _ separators. - - this_is_a_long_function_name (); - - * Constants are all in upper case with _ separators. - - THIS_IS_A_CONSTANT - - + Structures should be typedefed to avoid saying 'struct' and names - are CamelCase: - - ThisIsAStruct - - * One line comments should look like: - - /* This is a one line comment */ - - * Multi line comments should look like: - - /* - * This is a multiline comment. - * And it has a useless second line. - */ - -When in doubt adapt to the style of the code around your patch. diff -Nru gcr-3.38.1/MAINTAINERS gcr-3.40.0/MAINTAINERS --- gcr-3.38.1/MAINTAINERS 2021-01-12 22:55:54.635056000 +0000 +++ gcr-3.40.0/MAINTAINERS 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -Stef Walter -E-mail: stefw@collabora.co.uk -Userid: stefw diff -Nru gcr-3.38.1/Makefile.am gcr-3.40.0/Makefile.am --- gcr-3.38.1/Makefile.am 2021-01-12 22:55:54.635056000 +0000 +++ gcr-3.40.0/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,210 +0,0 @@ -NULL = - -SUBDIRS = \ - . \ - po \ - docs/reference/gck \ - docs/reference/gcr - -ACLOCAL_AMFLAGS = -I build/m4 ${ACLOCAL_FLAGS} - -DISTCHECK_CONFIGURE_FLAGS = \ - --enable-gtk-doc \ - --disable-coverage \ - --disable-update-mime \ - --disable-update-icon-cache \ - --with-gtk \ - --with-pkcs11-modules=$(abs_srcdir)/$(top_distdir)/_inst/lib/ - -DISTCLEANFILES = \ - $(NULL) - -dist-hook: - @if test -d "$(srcdir)/.git"; \ - then \ - echo Creating ChangeLog && \ - ( cd "$(top_srcdir)" && \ - echo '# Generate automatically. Do not edit.'; echo; \ - $(top_srcdir)/missing --run git log --stat --date=short ) > ChangeLog.tmp \ - && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \ - || ( rm -f ChangeLog.tmp ; \ - echo Failed to generate ChangeLog >&2 ); \ - else \ - echo A git clone is required to generate a ChangeLog >&2; \ - fi - -check-local: check-gck-symbols check-gcr-symbols check-ui-symbols - -upload-release: $(DIST_ARCHIVES) - scp $(DIST_ARCHIVES) master.gnome.org: - ssh master.gnome.org ftpadmin install $(DIST_ARCHIVES) - -# Default executable tests -LOG_DRIVER = $(srcdir)/build/tap-driver -LOG_DRIVER_FLAGS = --format=tap -LOG_COMPILER = $(srcdir)/build/tap-gtester - -VALGRIND_ARGS = --trace-children=no --quiet --error-exitcode=33 \ - --suppressions=valgrind-suppressions --gen-suppressions=all \ - --num-callers=16 -VALGRIND_SUPPRESSIONS = \ - build/gcr.supp \ - build/gcrypt.supp \ - build/glib.supp \ - build/glibc.supp \ - build/p11-kit.supp \ - build/pixman.supp \ - build/pthread.supp \ - build/unknown.supp - -valgrind-suppressions: $(VALGRIND_SUPPRESSIONS) - $(AM_V_GEN) cat $^ > $@ - -check-memory: valgrind-suppressions - $(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \ - $(AM_MAKEFLAGS) check -recheck-memory: valgrind-suppressions - $(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \ - $(AM_MAKEFLAGS) recheck - -coverage: - mkdir -p $(top_builddir)/build/coverage - $(LCOV) --directory . --capture --output-file $(top_builddir)/build/coverage.info - $(GENHTML) --output-directory $(top_builddir)/build/coverage $(top_builddir)/build/coverage.info - $(LCOV) --directory . --zerocounters - @echo "file://$(abs_top_builddir)/build/coverage/index.html" - -clear-coverage: - $(LCOV) --directory . --zerocounters - -AM_CPPFLAGS = \ - -I$(srcdir) \ - -I$(builddir) \ - -I$(srcdir)/build \ - -DSRCDIR="\"@abs_srcdir@\"" \ - -DBUILDDIR="\"@abs_builddir@\"" \ - -DLOCALEDIR=\""$(datadir)/locale"\" \ - -DLIBEXECDIR="\"$(libexecdir)\"" \ - $(GLIB_CFLAGS) - -LDADD = \ - $(GLIB_LIBS) - -BUILT_SOURCES = -TESTS = - -check_PROGRAMS = -check_LTLIBRARIES = -lib_LTLIBRARIES = -libexec_PROGRAMS = -noinst_LTLIBRARIES = -noinst_PROGRAMS = $(check_PROGRAMS) - -pkgconfig_DATA = -pkgconfigdir = $(libdir)/pkgconfig - -CLEANFILES = \ - $(pkgconfig_DATA) - -EXTRA_DIST = \ - HACKING \ - build/valgrind \ - $(VALGRIND_SUPPRESSIONS) \ - build/enum-template.c \ - build/enum-template.h \ - build/g-ir-unbreak.xsl \ - build/tap-driver \ - build/tap-gtester \ - build/gdbus-unbreak-codegen \ - $(NULL) - -TEST_SUPPRESSIONS = $(top_builddir)/build/valgrind-suppressions - -GDBUS_CODEGEN = $(top_srcdir)/build/gdbus-unbreak-codegen - -V_SED = $(V_SED_$(V)) -V_SED_ = $(V_SED_$(AM_DEFAULT_VERBOSITY)) -V_SED_0 = @echo " SED " $@; - -SED_SUBST = sed \ - -e 's,[@]datadir[@],$(datadir),g' \ - -e 's,[@]libexecdir[@],$(libexecdir),g' \ - -e 's,[@]libdir[@],$(libdir),g' \ - -e 's,[@]includedir[@],$(includedir),g' \ - -e 's,[@]datarootdir[@],$(datarootdir),g' \ - -e 's,[@]sysconfdir[@],$(sysconfdir),g' \ - -e 's,[@]bindir[@],$(bindir),g' \ - -e 's,[@]exec_prefix[@],$(exec_prefix),g' \ - -e 's,[@]prefix[@],$(prefix),g' \ - -e 's,[@]PACKAGE[@],$(PACKAGE),g' \ - -e 's,[@]VERSION[@],$(VERSION),g' \ - $(NULL) - -.desktop.in.in.desktop.in: - $(V_SED) $(SED_SUBST) $< > $@ - -.service.in.service: - $(V_SED) $(SED_SUBST) $< > $@ - -ENUM_TEMPLATE_C = $(top_srcdir)/build/enum-template.c -ENUM_TEMPLATE_H = $(top_srcdir)/build/enum-template.h - -V_XSLTPROC = $(V_XSLTPROC_$(V)) -V_XSLTPROC_ = $(V_XSLTPROC_$(AM_DEFAULT_VERBOSITY)) -V_XSLTPROC_0 = @echo " XSLTPROC" $@; - -FIX_GIR = $(top_srcdir)/build/g-ir-unbreak.xsl - -.broken.gir.gir: - $(V_XSLTPROC) xsltproc -o $@ $(FIX_GIR) $< -.broken.typelib.typelib: - $(AM_V_GEN) cp $< $@ - -SUFFIXES = .desktop.in .desktop.in.in .service .service.in .broken.typelib .broken.gir .gir - -if HAVE_INTROSPECTION - -include $(INTROSPECTION_MAKEFILE) - -INTROSPECTION_GIRS = -INTROSPECTION_SCANNER_ARGS = $(INTROSPECTION_FLAGS) --warn-all --add-include-path=. -INTROSPECTION_COMPILER_ARGS = --includedir=. - -girdir = $(datadir)/gir-1.0 -gir_DATA = - -typelibsdir = $(libdir)/girepository-1.0 -typelibs_DATA = $(gir_DATA:.gir=.typelib) - -CLEANFILES += \ - $(gir_DATA) \ - $(typelibs_DATA) \ - $(BUILT_SOURCES) - -if ENABLE_VAPIGEN - -include $(VAPIGEN_MAKEFILE) - -VAPIGEN_VAPIS = -VAPI_DEPS = $(VAPIGEN_VAPIS:.vapi=.deps) - -vapidir = $(datadir)/vala/vapi -vapi_DATA = $(VAPIGEN_VAPIS) $(VAPI_DEPS) - -CLEANFILES += \ - $(VAPIGEN_VAPIS) \ - $(VAPI_DEPS) - -endif - -endif - -include egg/Makefile.am -include gck/Makefile.am -include gcr/Makefile.am -include schema/Makefile.am - -if WITH_GTK -include ui/Makefile.am -include ui/icons/Makefile.am -endif diff -Nru gcr-3.38.1/meson.build gcr-3.40.0/meson.build --- gcr-3.38.1/meson.build 2021-01-12 22:55:54.674056300 +0000 +++ gcr-3.40.0/meson.build 2021-03-27 08:40:56.334531000 +0000 @@ -1,5 +1,5 @@ project('gcr', 'c', - version: '3.38.1', + version: '3.40.0', meson_version: '>= 0.49', license: 'GPL2+', ) @@ -41,7 +41,10 @@ gio_dep = dependency('gio-2.0', version: '>=' + min_glib_version) gio_unix_dep = dependency('gio-unix-2.0',version: '>=' + min_glib_version) glib_deps = [ glib_dep, gmodule_dep, gthread_dep, gobject_dep, gio_dep, gio_unix_dep, ] -gpg_bin = find_program('gpg2', 'gpg') +gpg_path = get_option('gpg_path') +if gpg_path == '' + gpg_path = find_program('gpg2', 'gpg').path() +endif libgcrypt_dep = dependency('libgcrypt', version: '>= 1') p11kit_dep = dependency('p11-kit-1', version: '>= 0.19.0') p11_system_config_modules = p11kit_dep.get_pkgconfig_variable('p11_system_config_modules') @@ -50,9 +53,8 @@ endif if get_option('gtk') - gtk_min_version = '3.12' + gtk_min_version = '3.22' gtk_dep = dependency('gtk+-3.0', version: '>=' + gtk_min_version) - gtk_x11_dep = dependency('gtk+-x11-3.0', version: '>=' + gtk_min_version) endif # configuration @@ -65,7 +67,7 @@ conf.set('HAVE_LOCALE_H', cc.has_header('locale.h')) conf.set('HAVE_TIMEGM', cc.has_function('timegm')) conf.set('HAVE_MLOCK', cc.has_function('mlock')) -conf.set_quoted('GPG_EXECUTABLE', gpg_bin.path()) +conf.set_quoted('GPG_EXECUTABLE', gpg_path) conf.set_quoted('LIBGCRYPT_VERSION', libgcrypt_dep.version()) config_file = configure_file( output: 'config.h', diff -Nru gcr-3.38.1/meson_options.txt gcr-3.40.0/meson_options.txt --- gcr-3.38.1/meson_options.txt 2021-01-12 22:55:54.674056300 +0000 +++ gcr-3.40.0/meson_options.txt 2021-03-27 08:40:56.334531000 +0000 @@ -13,3 +13,8 @@ value: true, description: 'Build the reference documentation (requires gtk-doc)', ) +option('gpg_path', + type: 'string', + value: '', + description: 'Path to gpg, autodetected if not set', +) diff -Nru gcr-3.38.1/NEWS gcr-3.40.0/NEWS --- gcr-3.38.1/NEWS 2021-01-12 22:55:54.635056000 +0000 +++ gcr-3.40.0/NEWS 2021-03-27 08:40:56.289531500 +0000 @@ -1,6 +1,16 @@ -gcr 3.38.1: +gcr 3.40.0: +- FEATURE: add hkps://keys.openpgp.org to keyserver defaults [GNOME/gcr!62] +- gcr/key-mechanism: Port to GTask [GNOME/gcr!66] +- GckCall: Simplify the code by using GTask based implementation [GNOME/gcr!61] +- Remove Autotools [GNOME/gcr!58] +- gck: Don't use g_assert() in tests [GNOME/gcr!64] +- Create a workaround for tests and GTask [GNOME/gcr!65] - ui: Set "use-underline" for GcrImportButton [GNOME/gcr!63] -- Updated Chinese (Taiwan) translation +- Get rid of most GSimpleAsyncResult usages [GNOME/gcr!29] +- Gck flags check fixes [GNOME/gcr!60] +- Increase test-gnupg-collection timeout [GNOME/gcr#29, GNOME/gcr!23] +- ci: Fix ASAN jobs [GNOME/gcr!59] +- Updated translations gcr 3.38.0: - No changes from 3.37.91 diff -Nru gcr-3.38.1/po/ca.po gcr-3.40.0/po/ca.po --- gcr-3.38.1/po/ca.po 2021-01-12 22:55:54.681056500 +0000 +++ gcr-3.40.0/po/ca.po 2021-03-27 08:40:56.337531000 +0000 @@ -341,7 +341,7 @@ #: gcr/gcr-certificate-request.c:493 gcr/gcr-certificate-request.c:578 msgid "The key cannot be used to sign the request" -msgstr "No es pot utilitzar la clau per signar la sol·licitud" +msgstr "No es pot utilitzar la clau per a signar la sol·licitud" #: gcr/gcr-gnupg-importer.c:95 msgid "GnuPG Keyring" @@ -1006,7 +1006,7 @@ #: ui/gcr-pkcs11-import-dialog.ui:31 msgid "In order to import, please enter the password." -msgstr "Introduïu la contrasenya per poder importar." +msgstr "Introduïu la contrasenya per a poder importar." #. The password label #: ui/gcr-pkcs11-import-dialog.ui:66 ui/gcr-prompt-dialog.c:617 @@ -1119,7 +1119,7 @@ "The contents of “%s” are locked. In order to view the contents, enter the " "correct password." msgstr "" -"El contingut de «%s» està bloquejat. Per poder visualitzar el contingut, " +"El contingut de «%s» està bloquejat. Per a poder visualitzar el contingut, " "introduïu la contrasenya correcta." #: ui/gcr-unlock-renderer.c:277 @@ -1127,7 +1127,7 @@ "The contents are locked. In order to view the contents, enter the correct " "password." msgstr "" -"El contingut està bloquejat. Per poder visualitzar el contingut, introduïu " +"El contingut està bloquejat. Per a poder visualitzar el contingut, introduïu " "la contrasenya correcta." #: ui/gcr-viewer.desktop.in.in:3 diff -Nru gcr-3.38.1/po/en_GB.po gcr-3.40.0/po/en_GB.po --- gcr-3.38.1/po/en_GB.po 2021-01-12 22:55:54.683056400 +0000 +++ gcr-3.40.0/po/en_GB.po 2021-03-27 08:40:56.339531200 +0000 @@ -3,15 +3,15 @@ # This file is distributed under the same license as the gnome-keyring package. # Gareth Owen , 2004. # Philip Withnall , 2009, 2010. -# Zander Brown , 2019. -# Bruce Cowan , 2010-2020. +# Zander Brown , 2019-2020. +# Bruce Cowan , 2010-2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keyring\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gcr/issues\n" -"POT-Creation-Date: 2020-02-06 09:50+0000\n" -"PO-Revision-Date: 2020-02-23 12:37+0000\n" +"POT-Creation-Date: 2021-01-16 10:12+0000\n" +"PO-Revision-Date: 2021-03-23 21:56+0000\n" "Last-Translator: Bruce Cowan \n" "Language-Team: English - United Kingdom \n" "Language: en_GB\n" @@ -19,7 +19,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 3.34.0\n" +"X-Generator: Gtranslator 3.38.0\n" "X-Project-Style: gnome\n" #: egg/egg-oid.c:40 @@ -62,7 +62,7 @@ msgid "Surname" msgstr "Surname" -#: egg/egg-oid.c:68 ui/gcr-certificate-renderer.c:562 +#: egg/egg-oid.c:68 ui/gcr-certificate-renderer.c:565 msgid "Serial Number" msgstr "Serial Number" @@ -231,12 +231,12 @@ msgid "Time Stamping" msgstr "Time Stamping" -#: gck/gck-module.c:343 +#: gck/gck-module.c:332 #, c-format msgid "Error loading PKCS#11 module: %s" msgstr "Error loading PKCS#11 module: %s" -#: gck/gck-module.c:357 +#: gck/gck-module.c:346 #, c-format msgid "Couldn’t initialize PKCS#11 module: %s" msgstr "Couldn’t initialise PKCS#11 module: %s" @@ -247,6 +247,7 @@ msgstr "Couldn’t initialise registered PKCS#11 modules: %s" #: gck/gck-uri.c:224 +#, c-format msgid "The URI has invalid encoding." msgstr "The URI has invalid encoding." @@ -263,6 +264,7 @@ msgstr "The URI has a bad version number." #: gcr/gcr-callback-output-stream.c:56 gcr/gcr-callback-output-stream.c:73 +#, c-format msgid "The stream was closed" msgstr "The stream was closed" @@ -289,56 +291,58 @@ msgid "Certificate" msgstr "Certificate" -#: gcr/gcr-certificate-extensions.c:177 +#: gcr/gcr-certificate-extensions.c:190 msgid "Other Name" msgstr "Other Name" -#: gcr/gcr-certificate-extensions.c:187 +#: gcr/gcr-certificate-extensions.c:200 msgid "XMPP Addr" msgstr "XMPP Addr" -#: gcr/gcr-certificate-extensions.c:191 +#: gcr/gcr-certificate-extensions.c:204 msgid "DNS SRV" msgstr "DNS SRV" -#: gcr/gcr-certificate-extensions.c:203 ui/gcr-gnupg-renderer.c:423 +#: gcr/gcr-certificate-extensions.c:216 ui/gcr-gnupg-renderer.c:423 #: ui/gcr-gnupg-renderer.c:705 msgid "Email" msgstr "E-mail" -#: gcr/gcr-certificate-extensions.c:211 +#: gcr/gcr-certificate-extensions.c:224 msgid "DNS" msgstr "DNS" -#: gcr/gcr-certificate-extensions.c:219 +#: gcr/gcr-certificate-extensions.c:232 msgid "X400 Address" msgstr "X400 Address" -#: gcr/gcr-certificate-extensions.c:226 +#: gcr/gcr-certificate-extensions.c:239 msgid "Directory Name" msgstr "Directory Name" -#: gcr/gcr-certificate-extensions.c:234 +#: gcr/gcr-certificate-extensions.c:247 msgid "EDI Party Name" msgstr "EDI Party Name" -#: gcr/gcr-certificate-extensions.c:241 +#: gcr/gcr-certificate-extensions.c:254 msgid "URI" msgstr "URI" -#: gcr/gcr-certificate-extensions.c:249 +#: gcr/gcr-certificate-extensions.c:262 msgid "IP Address" msgstr "IP Address" -#: gcr/gcr-certificate-extensions.c:257 +#: gcr/gcr-certificate-extensions.c:270 msgid "Registered ID" msgstr "Registered ID" #: gcr/gcr-certificate-request.c:406 +#, c-format msgid "Unsupported key type for certificate request" msgstr "Unsupported key type for certificate request" -#: gcr/gcr-certificate-request.c:493 gcr/gcr-certificate-request.c:578 +#: gcr/gcr-certificate-request.c:493 gcr/gcr-certificate-request.c:577 +#, c-format msgid "The key cannot be used to sign the request" msgstr "The key cannot be used to sign the request" @@ -370,7 +374,7 @@ msgid "Gnupg process was terminated with signal: %d" msgstr "Gnupg process was terminated with signal: %d" -#: gcr/gcr-gnupg-process.c:928 gcr/gcr-parser.c:2598 gcr/gcr-parser.c:3204 +#: gcr/gcr-gnupg-process.c:928 gcr/gcr-parser.c:2598 gcr/gcr-parser.c:3192 #: gcr/gcr-system-prompt.c:932 msgid "The operation was cancelled" msgstr "The operation was cancelled" @@ -379,7 +383,7 @@ msgid "Private Key" msgstr "Private Key" -#: gcr/gcr-parser.c:349 ui/gcr-certificate-renderer.c:884 +#: gcr/gcr-parser.c:349 ui/gcr-certificate-renderer.c:887 #: ui/gcr-gnupg-renderer.c:738 ui/gcr-key-renderer.c:370 msgid "Public Key" msgstr "Public Key" @@ -400,11 +404,11 @@ msgid "The data is locked" msgstr "The data is locked" -#: gcr/gcr-prompt.c:225 +#: gcr/gcr-prompt.c:229 msgid "Continue" msgstr "Continue" -#: gcr/gcr-prompt.c:234 +#: gcr/gcr-prompt.c:238 msgid "Cancel" msgstr "Cancel" @@ -416,7 +420,7 @@ msgid "Unrecognized or unavailable attributes for key" msgstr "Unrecognised or unavailable attributes for key" -#: gcr/gcr-subject-public-key.c:491 gcr/gcr-subject-public-key.c:577 +#: gcr/gcr-subject-public-key.c:491 gcr/gcr-subject-public-key.c:574 msgid "Couldn’t build public key" msgstr "Couldn’t build public key" @@ -427,7 +431,8 @@ #. Translators: A pinned certificate is an exception which #. trusts a given certificate explicitly for a purpose and #. communication with a certain peer. -#: gcr/gcr-trust.c:364 +#: gcr/gcr-trust.c:341 +#, c-format msgid "Couldn’t find a place to store the pinned certificate" msgstr "Couldn’t find a place to store the pinned certificate" @@ -439,11 +444,11 @@ msgid "Certificate Authority" msgstr "Certificate Authority" -#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:955 +#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:958 msgid "Yes" msgstr "Yes" -#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:955 +#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:958 msgid "No" msgstr "No" @@ -476,140 +481,152 @@ msgstr "Digital signature" #: ui/gcr-certificate-renderer.c:188 +msgid "Non repudiation" +msgstr "Non repudiation" + +#: ui/gcr-certificate-renderer.c:189 msgid "Key encipherment" msgstr "Key encypherment" -#: ui/gcr-certificate-renderer.c:189 +#: ui/gcr-certificate-renderer.c:190 msgid "Data encipherment" msgstr "Data encypherment" -#: ui/gcr-certificate-renderer.c:190 +#: ui/gcr-certificate-renderer.c:191 msgid "Key agreement" msgstr "Key agreement" -#: ui/gcr-certificate-renderer.c:191 +#: ui/gcr-certificate-renderer.c:192 msgid "Certificate signature" msgstr "Certificate signature" -#: ui/gcr-certificate-renderer.c:192 +#: ui/gcr-certificate-renderer.c:193 msgid "Revocation list signature" msgstr "Revocation list signature" -#: ui/gcr-certificate-renderer.c:217 +#: ui/gcr-certificate-renderer.c:194 +msgid "Encipher only" +msgstr "Encypher only" + +#: ui/gcr-certificate-renderer.c:195 +msgid "Decipher only" +msgstr "Decypher only" + +#: ui/gcr-certificate-renderer.c:220 msgid "Key Usage" msgstr "Key Usage" -#: ui/gcr-certificate-renderer.c:218 +#: ui/gcr-certificate-renderer.c:221 msgid "Usages" msgstr "Usages" -#: ui/gcr-certificate-renderer.c:238 +#: ui/gcr-certificate-renderer.c:241 msgid "Subject Alternative Names" msgstr "Subject Alternative Names" -#: ui/gcr-certificate-renderer.c:265 +#: ui/gcr-certificate-renderer.c:268 msgid "Extension" msgstr "Extension" -#: ui/gcr-certificate-renderer.c:269 +#: ui/gcr-certificate-renderer.c:272 msgid "Identifier" msgstr "Identifier" -#: ui/gcr-certificate-renderer.c:270 ui/gcr-certificate-request-renderer.c:268 +#: ui/gcr-certificate-renderer.c:273 ui/gcr-certificate-request-renderer.c:268 #: ui/gcr-gnupg-renderer.c:414 ui/gcr-gnupg-renderer.c:431 msgid "Value" msgstr "Value" -#: ui/gcr-certificate-renderer.c:288 +#: ui/gcr-certificate-renderer.c:291 msgid "Couldn’t export the certificate." msgstr "Couldn’t export the certificate." -#: ui/gcr-certificate-renderer.c:524 ui/gcr-certificate-request-renderer.c:309 +#: ui/gcr-certificate-renderer.c:527 ui/gcr-certificate-request-renderer.c:309 msgid "Identity" msgstr "Identity" -#: ui/gcr-certificate-renderer.c:528 +#: ui/gcr-certificate-renderer.c:531 msgid "Verified by" msgstr "Verified by" -#: ui/gcr-certificate-renderer.c:535 ui/gcr-gnupg-renderer.c:719 +#: ui/gcr-certificate-renderer.c:538 ui/gcr-gnupg-renderer.c:719 msgid "Expires" msgstr "Expires" #. The subject -#: ui/gcr-certificate-renderer.c:542 ui/gcr-certificate-request-renderer.c:315 +#: ui/gcr-certificate-renderer.c:545 ui/gcr-certificate-request-renderer.c:315 msgid "Subject Name" msgstr "Subject Name" #. The Issuer -#: ui/gcr-certificate-renderer.c:547 +#: ui/gcr-certificate-renderer.c:550 msgid "Issuer Name" msgstr "Issuer Name" #. The Issued Parameters -#: ui/gcr-certificate-renderer.c:552 +#: ui/gcr-certificate-renderer.c:555 msgid "Issued Certificate" msgstr "Issued Certificate" -#: ui/gcr-certificate-renderer.c:557 ui/gcr-certificate-request-renderer.c:326 +#: ui/gcr-certificate-renderer.c:560 ui/gcr-certificate-request-renderer.c:326 msgid "Version" msgstr "Version" -#: ui/gcr-certificate-renderer.c:571 +#: ui/gcr-certificate-renderer.c:574 msgid "Not Valid Before" msgstr "Not Valid Before" -#: ui/gcr-certificate-renderer.c:576 +#: ui/gcr-certificate-renderer.c:579 msgid "Not Valid After" msgstr "Not Valid After" #. Fingerprints -#: ui/gcr-certificate-renderer.c:581 +#: ui/gcr-certificate-renderer.c:584 msgid "Certificate Fingerprints" msgstr "Certificate Fingerprints" #. Public Key Info -#: ui/gcr-certificate-renderer.c:587 ui/gcr-certificate-request-renderer.c:329 +#: ui/gcr-certificate-renderer.c:590 ui/gcr-certificate-request-renderer.c:329 #: ui/gcr-certificate-request-renderer.c:375 msgid "Public Key Info" msgstr "Public Key Info" #. Signature -#: ui/gcr-certificate-renderer.c:602 ui/gcr-certificate-renderer.c:912 +#: ui/gcr-certificate-renderer.c:605 ui/gcr-certificate-renderer.c:915 #: ui/gcr-certificate-request-renderer.c:345 #: ui/gcr-certificate-request-renderer.c:382 ui/gcr-gnupg-renderer.c:560 msgid "Signature" msgstr "Signature" -#: ui/gcr-certificate-renderer.c:619 +#: ui/gcr-certificate-renderer.c:622 msgid "Export Certificate…" msgstr "Export Certificate…" -#: ui/gcr-certificate-renderer.c:858 +#: ui/gcr-certificate-renderer.c:861 msgid "Key Algorithm" msgstr "Key Algorithm" -#: ui/gcr-certificate-renderer.c:863 +#: ui/gcr-certificate-renderer.c:866 msgid "Key Parameters" msgstr "Key Parameters" -#: ui/gcr-certificate-renderer.c:871 ui/gcr-gnupg-renderer.c:353 +#: ui/gcr-certificate-renderer.c:874 ui/gcr-gnupg-renderer.c:353 msgid "Key Size" msgstr "Key Size" -#: ui/gcr-certificate-renderer.c:879 +#: ui/gcr-certificate-renderer.c:882 msgid "Key SHA1 Fingerprint" msgstr "Key SHA1 Fingerprint" -#: ui/gcr-certificate-renderer.c:901 +#: ui/gcr-certificate-renderer.c:904 msgid "Signature Algorithm" msgstr "Signature Algorithm" -#: ui/gcr-certificate-renderer.c:905 +#: ui/gcr-certificate-renderer.c:908 msgid "Signature Parameters" msgstr "Signature Parameters" -#: ui/gcr-certificate-renderer.c:954 +#: ui/gcr-certificate-renderer.c:957 msgid "Critical" msgstr "Critical" @@ -655,6 +672,7 @@ msgstr "Reason" #: ui/gcr-failure-renderer.c:216 +#, c-format msgid "Cannot display a file of this type." msgstr "Cannot display a file of this type." @@ -897,29 +915,29 @@ msgid "Secret Subkey" msgstr "Secret Subkey" -#: ui/gcr-import-button.c:116 +#: ui/gcr-import-button.c:118 msgid "Initializing…" msgstr "Initialising…" -#: ui/gcr-import-button.c:124 +#: ui/gcr-import-button.c:126 msgid "Import is in progress…" msgstr "Import is in progress…" -#: ui/gcr-import-button.c:131 +#: ui/gcr-import-button.c:133 #, c-format msgid "Imported to: %s" msgstr "Imported to: %s" -#: ui/gcr-import-button.c:151 +#: ui/gcr-import-button.c:153 #, c-format msgid "Import to: %s" msgstr "Import to: %s" -#: ui/gcr-import-button.c:164 +#: ui/gcr-import-button.c:166 msgid "Cannot import because there are no compatible importers" msgstr "Cannot import because there are no compatible importers" -#: ui/gcr-import-button.c:173 +#: ui/gcr-import-button.c:175 msgid "No data to import" msgstr "No data to import" @@ -972,12 +990,12 @@ msgstr "SHA256" #. Add our various buttons -#: ui/gcr-pkcs11-import-dialog.c:104 ui/gcr-prompt-dialog.c:556 +#: ui/gcr-pkcs11-import-dialog.c:104 ui/gcr-prompt-dialog.c:605 #: ui/gcr-certificate-exporter.c:229 ui/gcr-certificate-exporter.c:306 msgid "_Cancel" msgstr "_Cancel" -#: ui/gcr-pkcs11-import-dialog.c:106 ui/gcr-prompt-dialog.c:559 +#: ui/gcr-pkcs11-import-dialog.c:106 ui/gcr-prompt-dialog.c:608 msgid "_OK" msgstr "_OK" @@ -986,7 +1004,8 @@ msgstr "Automatically chosen" #: ui/gcr-pkcs11-import-dialog.c:263 ui/gcr-pkcs11-import-interaction.c:142 -#: ui/gcr-pkcs11-import-interaction.c:160 +#: ui/gcr-pkcs11-import-interaction.c:161 +#, c-format msgid "The user cancelled the operation" msgstr "The user cancelled the operation" @@ -995,7 +1014,7 @@ msgstr "In order to import, please enter the password." #. The password label -#: ui/gcr-pkcs11-import-dialog.ui:66 ui/gcr-prompt-dialog.c:617 +#: ui/gcr-pkcs11-import-dialog.ui:66 ui/gcr-prompt-dialog.c:666 msgid "Password:" msgstr "Password:" @@ -1017,15 +1036,15 @@ msgstr "Import settings" #. The confirm label -#: ui/gcr-prompt-dialog.c:634 +#: ui/gcr-prompt-dialog.c:683 msgid "Confirm:" msgstr "Confirm:" -#: ui/gcr-prompt-dialog.c:702 +#: ui/gcr-prompt-dialog.c:751 msgid "Passwords do not match." msgstr "Passwords do not match." -#: ui/gcr-prompt-dialog.c:709 +#: ui/gcr-prompt-dialog.c:758 msgid "Password cannot be blank" msgstr "Password cannot be blank" @@ -1050,6 +1069,7 @@ msgstr "_Replace" #: ui/gcr-certificate-exporter.c:260 +#, c-format msgid "The operation was cancelled." msgstr "The operation was cancelled." diff -Nru gcr-3.38.1/po/fi.po gcr-3.40.0/po/fi.po --- gcr-3.38.1/po/fi.po 2021-01-12 22:55:54.684056500 +0000 +++ gcr-3.40.0/po/fi.po 2021-03-27 08:40:56.340531000 +0000 @@ -12,10 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: gnome-keyring\n" -"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" -"keyring&keywords=I18N+L10N&component=gcr\n" -"POT-Creation-Date: 2018-05-03 14:54+0000\n" -"PO-Revision-Date: 2018-05-03 19:11+0300\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gcr/issues\n" +"POT-Creation-Date: 2020-06-18 07:02+0000\n" +"PO-Revision-Date: 2021-02-26 13:54+0200\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: suomi \n" "Language: fi\n" @@ -24,1068 +23,1106 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Launchpad-Export-Date: 2011-09-08 09:16+0000\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.4.2\n" -#: ../egg/egg-oid.c:40 +#: egg/egg-oid.c:40 msgid "Domain Component" msgstr "Aluenimen osa" -#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 -#: ../ui/gcr-gnupg-renderer.c:577 +#: egg/egg-oid.c:42 ui/gcr-gnupg-renderer.c:410 ui/gcr-gnupg-renderer.c:579 msgid "User ID" msgstr "Käyttäjätunniste" -#: ../egg/egg-oid.c:45 +#: egg/egg-oid.c:45 msgid "Email Address" msgstr "Sähköpostiosoite" -#: ../egg/egg-oid.c:53 +#: egg/egg-oid.c:53 msgid "Date of Birth" msgstr "Syntymäpäivä" -#: ../egg/egg-oid.c:55 +#: egg/egg-oid.c:55 msgid "Place of Birth" msgstr "Synnyinpaikka" -#: ../egg/egg-oid.c:57 +#: egg/egg-oid.c:57 msgid "Gender" msgstr "Sukupuoli" -#: ../egg/egg-oid.c:59 +#: egg/egg-oid.c:59 msgid "Country of Citizenship" msgstr "Kotimaa" -#: ../egg/egg-oid.c:61 +#: egg/egg-oid.c:61 msgid "Country of Residence" msgstr "Asuinmaa" -#: ../egg/egg-oid.c:64 +#: egg/egg-oid.c:64 msgid "Common Name" msgstr "Yleinen nimi" -#: ../egg/egg-oid.c:66 +#: egg/egg-oid.c:66 msgid "Surname" msgstr "Sukunimi" -#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +#: egg/egg-oid.c:68 ui/gcr-certificate-renderer.c:565 msgid "Serial Number" msgstr "Sarjanumero" -#: ../egg/egg-oid.c:70 +#: egg/egg-oid.c:70 msgid "Country" msgstr "Lääni" -#: ../egg/egg-oid.c:72 +#: egg/egg-oid.c:72 msgid "Locality" msgstr "Paikkakunta" -#: ../egg/egg-oid.c:74 +#: egg/egg-oid.c:74 msgid "State" msgstr "Valtio" -#: ../egg/egg-oid.c:76 +#: egg/egg-oid.c:76 msgid "Street" msgstr "Katu" -#: ../egg/egg-oid.c:78 +#: egg/egg-oid.c:78 msgid "Organization" msgstr "Organisaatio" -#: ../egg/egg-oid.c:80 +#: egg/egg-oid.c:80 msgid "Organizational Unit" msgstr "Organisaatioyksikkö" -#: ../egg/egg-oid.c:82 +#: egg/egg-oid.c:82 msgid "Title" msgstr "Titteli" -#: ../egg/egg-oid.c:84 +#: egg/egg-oid.c:84 msgid "Telephone Number" msgstr "Puhelinnumero" -#: ../egg/egg-oid.c:86 +#: egg/egg-oid.c:86 msgid "Given Name" msgstr "Etunimi" -#: ../egg/egg-oid.c:88 +#: egg/egg-oid.c:88 msgid "Initials" msgstr "Nimikirjaimet" -#: ../egg/egg-oid.c:90 +#: egg/egg-oid.c:90 msgid "Generation Qualifier" msgstr "Luontimääre" -#: ../egg/egg-oid.c:92 +#: egg/egg-oid.c:92 msgid "DN Qualifier" msgstr "DN-määre" -#: ../egg/egg-oid.c:94 +#: egg/egg-oid.c:94 msgid "Pseudonym" msgstr "Pseudonyymi" -#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 -#: ../ui/gcr-key-renderer.c:385 +#. Translators: Russian: Main state registration number +#: egg/egg-oid.c:98 +msgid "OGRN" +msgstr "OGRN" + +#. Translators: Russian: Individual insurance account number +#: egg/egg-oid.c:101 +msgid "SNILS" +msgstr "SNILS" + +#. Translators: Russian: Main state registration number for individual enterpreneurs +#: egg/egg-oid.c:104 +msgid "OGRNIP" +msgstr "OGRNIP" + +#. Translators: Russian: Individual taxpayer number +#: egg/egg-oid.c:107 +msgid "INN" +msgstr "INN" + +#: egg/egg-oid.c:110 ui/gcr-gnupg-renderer.c:201 ui/gcr-key-renderer.c:385 msgid "RSA" msgstr "RSA" -#: ../egg/egg-oid.c:98 +#: egg/egg-oid.c:111 msgid "MD2 with RSA" msgstr "MD2 ja RSA" -#: ../egg/egg-oid.c:99 +#: egg/egg-oid.c:112 msgid "MD5 with RSA" msgstr "MD5 ja RSA" -#: ../egg/egg-oid.c:100 +#: egg/egg-oid.c:113 msgid "SHA1 with RSA" msgstr "SHA1 ja RSA" -#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 -#: ../ui/gcr-key-renderer.c:387 +#: egg/egg-oid.c:115 ui/gcr-gnupg-renderer.c:205 ui/gcr-key-renderer.c:387 msgid "DSA" msgstr "DSA" -#: ../egg/egg-oid.c:103 +#: egg/egg-oid.c:116 msgid "SHA1 with DSA" msgstr "SHA1 ja DSA" -#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +#: egg/egg-oid.c:118 ui/gcr-key-renderer.c:389 msgid "Elliptic Curve" -msgstr "" +msgstr "Elliptinen käyrä" -#: ../egg/egg-oid.c:106 +#: egg/egg-oid.c:119 msgid "SHA1 with ECDSA" msgstr "SHA1 ja ECDSA" -#: ../egg/egg-oid.c:107 +#: egg/egg-oid.c:120 msgid "SHA224 with ECDSA" msgstr "SHA224 ja ECDSA" -#: ../egg/egg-oid.c:108 +#: egg/egg-oid.c:121 msgid "SHA256 with ECDSA" msgstr "SHA256 ja ECDSA" -#: ../egg/egg-oid.c:109 +#: egg/egg-oid.c:122 msgid "SHA384 with ECDSA" msgstr "SHA384 ja ECDSA" -#: ../egg/egg-oid.c:110 +#: egg/egg-oid.c:123 msgid "SHA512 with ECDSA" msgstr "SHA512 ja ECDSA" +#: egg/egg-oid.c:125 +msgid "GOST R 34.11-94 with GOST R 34.10-2001" +msgstr "" + +#: egg/egg-oid.c:126 +msgid "GOST R 34.10-2001" +msgstr "GOST R 34.10-2001" + +#: egg/egg-oid.c:127 +msgid "GOST R 34.10-2012 256-bit curve" +msgstr "GOST R 34.10-2012 256-bit käyrä" + +#: egg/egg-oid.c:128 +msgid "GOST R 34.10-2012 512-bit curve" +msgstr "GOST R 34.10-2012 512-bit käyrä" + +#: egg/egg-oid.c:129 +msgid "GOST R 34.11-2012/256 with GOST R 34.10-2012 256-bit curve" +msgstr "" + +#: egg/egg-oid.c:130 +msgid "GOST R 34.11-2012/512 with GOST R 34.10-2012 512-bit curve" +msgstr "" + #. Extended Key Usages -#: ../egg/egg-oid.c:113 +#: egg/egg-oid.c:133 msgid "Server Authentication" msgstr "Palvelimen todentaminen" -#: ../egg/egg-oid.c:114 +#: egg/egg-oid.c:134 msgid "Client Authentication" msgstr "Asiakkaan todentaminen" -#: ../egg/egg-oid.c:115 +#: egg/egg-oid.c:135 msgid "Code Signing" msgstr "Koodin allekirjoitus" -#: ../egg/egg-oid.c:116 +#: egg/egg-oid.c:136 msgid "Email Protection" msgstr "Sähköpostin suojaus" -#: ../egg/egg-oid.c:117 +#: egg/egg-oid.c:137 msgid "Time Stamping" msgstr "Aikaleimaus" -#: ../gck/gck-module.c:344 +#: gck/gck-module.c:332 #, c-format msgid "Error loading PKCS#11 module: %s" msgstr "Virhe PKCS#11-moduulia ladatessa: %s" -#: ../gck/gck-module.c:358 +#: gck/gck-module.c:346 #, fuzzy, c-format #| msgid "Couldn't initialize PKCS#11 module: %s" msgid "Couldn’t initialize PKCS#11 module: %s" msgstr "PKCS#11-moduulin alustaminen epäonnistui: %s" -#: ../gck/gck-modules.c:62 +#: gck/gck-modules.c:62 #, fuzzy, c-format #| msgid "Couldn't initialize PKCS#11 module: %s" msgid "Couldn’t initialize registered PKCS#11 modules: %s" msgstr "PKCS#11-moduulin alustaminen epäonnistui: %s" -#: ../gck/gck-uri.c:224 -#, c-format +#: gck/gck-uri.c:224 msgid "The URI has invalid encoding." msgstr "" -#: ../gck/gck-uri.c:228 +#: gck/gck-uri.c:228 msgid "The URI does not have the “pkcs11” scheme." msgstr "" -#: ../gck/gck-uri.c:232 +#: gck/gck-uri.c:232 msgid "The URI has bad syntax." msgstr "" -#: ../gck/gck-uri.c:236 +#: gck/gck-uri.c:236 msgid "The URI has a bad version number." msgstr "" -#: ../gcr/gcr-callback-output-stream.c:60 -#: ../gcr/gcr-callback-output-stream.c:77 -#, fuzzy, c-format +#: gcr/gcr-callback-output-stream.c:56 gcr/gcr-callback-output-stream.c:73 +#, fuzzy msgid "The stream was closed" msgstr "Istunto on suljettu" #. later #. later -#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +#: gcr/gcr-certificate.c:350 gcr/gcr-gnupg-key.c:429 msgctxt "column" msgid "Name" msgstr "Nimi" -#: ../gcr/gcr-certificate.c:352 +#: gcr/gcr-certificate.c:352 msgctxt "column" msgid "Issued By" msgstr "Myöntänyt" #. later -#: ../gcr/gcr-certificate.c:354 +#: gcr/gcr-certificate.c:354 msgctxt "column" msgid "Expires" msgstr "Vanhenee" -#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:344 -#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +#: gcr/gcr-certificate.c:1186 gcr/gcr-parser.c:346 +#: ui/gcr-certificate-renderer.c:103 ui/gcr-certificate-exporter.c:464 msgid "Certificate" msgstr "Varmenne" -#: ../gcr/gcr-certificate-extensions.c:177 +#: gcr/gcr-certificate-extensions.c:190 msgid "Other Name" msgstr "Muu nimi" -#: ../gcr/gcr-certificate-extensions.c:187 +#: gcr/gcr-certificate-extensions.c:200 msgid "XMPP Addr" msgstr "" -#: ../gcr/gcr-certificate-extensions.c:191 +#: gcr/gcr-certificate-extensions.c:204 msgid "DNS SRV" -msgstr "" +msgstr "DNS SRV" -#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 -#: ../ui/gcr-gnupg-renderer.c:703 +#: gcr/gcr-certificate-extensions.c:216 ui/gcr-gnupg-renderer.c:423 +#: ui/gcr-gnupg-renderer.c:705 msgid "Email" msgstr "Sähköpostiosoite" -#: ../gcr/gcr-certificate-extensions.c:211 +#: gcr/gcr-certificate-extensions.c:224 msgid "DNS" msgstr "DNS" -#: ../gcr/gcr-certificate-extensions.c:219 +#: gcr/gcr-certificate-extensions.c:232 msgid "X400 Address" msgstr "X400-osoite" -#: ../gcr/gcr-certificate-extensions.c:226 +#: gcr/gcr-certificate-extensions.c:239 msgid "Directory Name" msgstr "Hakemiston nimi" -#: ../gcr/gcr-certificate-extensions.c:234 +#: gcr/gcr-certificate-extensions.c:247 msgid "EDI Party Name" msgstr "EDI-osapuolen nimi" -#: ../gcr/gcr-certificate-extensions.c:241 +#: gcr/gcr-certificate-extensions.c:254 msgid "URI" msgstr "URI" -#: ../gcr/gcr-certificate-extensions.c:249 +#: gcr/gcr-certificate-extensions.c:262 msgid "IP Address" msgstr "IP-osoite" -#: ../gcr/gcr-certificate-extensions.c:257 +#: gcr/gcr-certificate-extensions.c:270 msgid "Registered ID" msgstr "" -#: ../gcr/gcr-certificate-request.c:415 -#, c-format +#: gcr/gcr-certificate-request.c:406 msgid "Unsupported key type for certificate request" msgstr "" -#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 -#, c-format +#: gcr/gcr-certificate-request.c:493 gcr/gcr-certificate-request.c:578 msgid "The key cannot be used to sign the request" -msgstr "" +msgstr "Avainta ei voi käyttää pyynnön allekirjoittamiseen" -#: ../gcr/gcr-gnupg-importer.c:94 +#: gcr/gcr-gnupg-importer.c:95 msgid "GnuPG Keyring" msgstr "GnuPG -avainnippu" -#: ../gcr/gcr-gnupg-importer.c:96 +#: gcr/gcr-gnupg-importer.c:97 #, c-format msgid "GnuPG Keyring: %s" msgstr "GnuPG-avainnippu: %s" -#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:350 -#: ../ui/gcr-gnupg-renderer.c:87 +#: gcr/gcr-gnupg-key.c:143 gcr/gcr-parser.c:352 ui/gcr-gnupg-renderer.c:88 msgid "PGP Key" msgstr "PGP-avain" -#: ../gcr/gcr-gnupg-key.c:432 +#: gcr/gcr-gnupg-key.c:431 msgctxt "column" msgid "Key ID" msgstr "Avaimen tunniste" -#: ../gcr/gcr-gnupg-process.c:864 +#: gcr/gcr-gnupg-process.c:867 #, c-format msgid "Gnupg process exited with code: %d" msgstr "Gnupg-prosessi poistui koodilla: %d" -#: ../gcr/gcr-gnupg-process.c:871 +#: gcr/gcr-gnupg-process.c:874 #, c-format msgid "Gnupg process was terminated with signal: %d" msgstr "Gnupg-prosessi lopetettiin signalilla: %d" -#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2592 -#: ../gcr/gcr-parser.c:3198 ../gcr/gcr-system-prompt.c:931 +#: gcr/gcr-gnupg-process.c:928 gcr/gcr-parser.c:2598 gcr/gcr-parser.c:3192 +#: gcr/gcr-system-prompt.c:932 msgid "The operation was cancelled" msgstr "Toiminto peruttiin" -#: ../gcr/gcr-parser.c:341 ../ui/gcr-key-renderer.c:361 +#: gcr/gcr-parser.c:343 ui/gcr-key-renderer.c:361 msgid "Private Key" msgstr "Salainen avain" -#: ../gcr/gcr-parser.c:347 ../ui/gcr-certificate-renderer.c:881 -#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +#: gcr/gcr-parser.c:349 ui/gcr-certificate-renderer.c:887 +#: ui/gcr-gnupg-renderer.c:738 ui/gcr-key-renderer.c:370 msgid "Public Key" msgstr "Julkinen avain" -#: ../gcr/gcr-parser.c:353 +#: gcr/gcr-parser.c:355 msgid "Certificate Request" msgstr "Varmennepyyntö" -#: ../gcr/gcr-parser.c:2595 +#: gcr/gcr-parser.c:2601 msgid "Unrecognized or unsupported data." msgstr "Tuntematon tai ei tuettu tieto." -#: ../gcr/gcr-parser.c:2598 +#: gcr/gcr-parser.c:2604 msgid "Could not parse invalid or corrupted data." msgstr "Virheellistä tai viallista tietoa ei voitu tulkita." -#: ../gcr/gcr-parser.c:2601 +#: gcr/gcr-parser.c:2607 msgid "The data is locked" msgstr "tiedot on lukittu" -#: ../gcr/gcr-prompt.c:225 +#: gcr/gcr-prompt.c:225 msgid "Continue" msgstr "Jatka" -#: ../gcr/gcr-prompt.c:234 +#: gcr/gcr-prompt.c:234 msgid "Cancel" msgstr "Peru" -#: ../gcr/gcr-ssh-askpass.c:198 +#: gcr/gcr-ssh-askpass.c:194 msgid "Enter your OpenSSH passphrase" msgstr "Anna OpenSSH-tunnuslauseesi" -#: ../gcr/gcr-subject-public-key.c:405 +#: gcr/gcr-subject-public-key.c:405 msgid "Unrecognized or unavailable attributes for key" msgstr "" -#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +#: gcr/gcr-subject-public-key.c:491 gcr/gcr-subject-public-key.c:577 msgid "Couldn’t build public key" msgstr "Julkista avainta ei voitu rakentaa" -#: ../gcr/gcr-system-prompt.c:911 +#: gcr/gcr-system-prompt.c:912 msgid "Another prompt is already in progress" msgstr "" #. Translators: A pinned certificate is an exception which #. trusts a given certificate explicitly for a purpose and #. communication with a certain peer. -#: ../gcr/gcr-trust.c:364 -#, fuzzy, c-format +#: gcr/gcr-trust.c:364 +#, fuzzy #| msgid "Couldn't export the certificate." msgid "Couldn’t find a place to store the pinned certificate" msgstr "Varmenteen vienti epäonnistui." -#: ../ui/gcr-certificate-renderer.c:117 +#: ui/gcr-certificate-renderer.c:118 msgid "Basic Constraints" msgstr "Perusrajoitukset" -#: ../ui/gcr-certificate-renderer.c:119 +#: ui/gcr-certificate-renderer.c:120 msgid "Certificate Authority" msgstr "Varmentajataho (CA)" -#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:958 msgid "Yes" msgstr "Kyllä" -#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:958 msgid "No" msgstr "Ei" -#: ../ui/gcr-certificate-renderer.c:123 +#: ui/gcr-certificate-renderer.c:124 msgid "Max Path Length" msgstr "Polun enimmäispituus" -#: ../ui/gcr-certificate-renderer.c:124 +#: ui/gcr-certificate-renderer.c:125 msgid "Unlimited" msgstr "Rajoittamaton" -#: ../ui/gcr-certificate-renderer.c:143 +#: ui/gcr-certificate-renderer.c:144 msgid "Extended Key Usage" msgstr "Laajennettu avaimen käyttö" -#: ../ui/gcr-certificate-renderer.c:154 +#: ui/gcr-certificate-renderer.c:155 msgid "Allowed Purposes" msgstr "Sallitut tarkoitukset" -#: ../ui/gcr-certificate-renderer.c:174 +#: ui/gcr-certificate-renderer.c:175 msgid "Subject Key Identifier" msgstr "" -#: ../ui/gcr-certificate-renderer.c:175 +#: ui/gcr-certificate-renderer.c:176 msgid "Key Identifier" msgstr "Avaimen tunniste" -#: ../ui/gcr-certificate-renderer.c:186 +#: ui/gcr-certificate-renderer.c:187 msgid "Digital signature" msgstr "Digitaalinen allekirjoitus" -#: ../ui/gcr-certificate-renderer.c:187 +#: ui/gcr-certificate-renderer.c:188 +msgid "Non repudiation" +msgstr "" + +#: ui/gcr-certificate-renderer.c:189 msgid "Key encipherment" msgstr "" -#: ../ui/gcr-certificate-renderer.c:188 +#: ui/gcr-certificate-renderer.c:190 msgid "Data encipherment" msgstr "" -#: ../ui/gcr-certificate-renderer.c:189 +#: ui/gcr-certificate-renderer.c:191 msgid "Key agreement" msgstr "" -#: ../ui/gcr-certificate-renderer.c:190 +#: ui/gcr-certificate-renderer.c:192 msgid "Certificate signature" msgstr "" -#: ../ui/gcr-certificate-renderer.c:191 +#: ui/gcr-certificate-renderer.c:193 msgid "Revocation list signature" msgstr "" -#: ../ui/gcr-certificate-renderer.c:216 +#: ui/gcr-certificate-renderer.c:194 +msgid "Encipher only" +msgstr "Vain salakirjoitus" + +#: ui/gcr-certificate-renderer.c:195 +msgid "Decipher only" +msgstr "Vain salakirjoituksen avaaminen" + +#: ui/gcr-certificate-renderer.c:220 msgid "Key Usage" msgstr "Avaimen käyttö" -#: ../ui/gcr-certificate-renderer.c:217 +#: ui/gcr-certificate-renderer.c:221 msgid "Usages" msgstr "Käyttötavat" -#: ../ui/gcr-certificate-renderer.c:237 +#: ui/gcr-certificate-renderer.c:241 msgid "Subject Alternative Names" msgstr "Kohteen vaihtoehtoiset nimet (SAN)" -#: ../ui/gcr-certificate-renderer.c:264 +#: ui/gcr-certificate-renderer.c:268 msgid "Extension" msgstr "Pääte" -#: ../ui/gcr-certificate-renderer.c:268 +#: ui/gcr-certificate-renderer.c:272 msgid "Identifier" msgstr "Tunniste" -#: ../ui/gcr-certificate-renderer.c:269 -#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 -#: ../ui/gcr-gnupg-renderer.c:429 +#: ui/gcr-certificate-renderer.c:273 ui/gcr-certificate-request-renderer.c:268 +#: ui/gcr-gnupg-renderer.c:414 ui/gcr-gnupg-renderer.c:431 msgid "Value" msgstr "Arvo" -#: ../ui/gcr-certificate-renderer.c:287 +#: ui/gcr-certificate-renderer.c:291 msgid "Couldn’t export the certificate." msgstr "Varmenteen vienti epäonnistui." -#: ../ui/gcr-certificate-renderer.c:521 -#: ../ui/gcr-certificate-request-renderer.c:310 +#: ui/gcr-certificate-renderer.c:527 ui/gcr-certificate-request-renderer.c:309 msgid "Identity" msgstr "Identiteetti" -#: ../ui/gcr-certificate-renderer.c:525 +#: ui/gcr-certificate-renderer.c:531 msgid "Verified by" msgstr "Vahvistanut" -#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +#: ui/gcr-certificate-renderer.c:538 ui/gcr-gnupg-renderer.c:719 msgid "Expires" msgstr "Vanhenee" #. The subject -#: ../ui/gcr-certificate-renderer.c:539 -#: ../ui/gcr-certificate-request-renderer.c:316 +#: ui/gcr-certificate-renderer.c:545 ui/gcr-certificate-request-renderer.c:315 msgid "Subject Name" msgstr "Kohteen nimi" #. The Issuer -#: ../ui/gcr-certificate-renderer.c:544 +#: ui/gcr-certificate-renderer.c:550 msgid "Issuer Name" msgstr "Myöntäjän nimi" #. The Issued Parameters -#: ../ui/gcr-certificate-renderer.c:549 +#: ui/gcr-certificate-renderer.c:555 msgid "Issued Certificate" msgstr "Myöntäjän varmenne" -#: ../ui/gcr-certificate-renderer.c:554 -#: ../ui/gcr-certificate-request-renderer.c:327 +#: ui/gcr-certificate-renderer.c:560 ui/gcr-certificate-request-renderer.c:326 msgid "Version" msgstr "Versio" -#: ../ui/gcr-certificate-renderer.c:568 +#: ui/gcr-certificate-renderer.c:574 msgid "Not Valid Before" msgstr "Ei voimassa ennen" -#: ../ui/gcr-certificate-renderer.c:573 +#: ui/gcr-certificate-renderer.c:579 msgid "Not Valid After" msgstr "Ei voimassa jälkeen" #. Fingerprints -#: ../ui/gcr-certificate-renderer.c:578 +#: ui/gcr-certificate-renderer.c:584 msgid "Certificate Fingerprints" msgstr "Varmenteen tunnistetiedot" #. Public Key Info -#: ../ui/gcr-certificate-renderer.c:584 -#: ../ui/gcr-certificate-request-renderer.c:330 -#: ../ui/gcr-certificate-request-renderer.c:376 +#: ui/gcr-certificate-renderer.c:590 ui/gcr-certificate-request-renderer.c:329 +#: ui/gcr-certificate-request-renderer.c:375 msgid "Public Key Info" msgstr "Tietoja julkisesta avaimesta" #. Signature -#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 -#: ../ui/gcr-certificate-request-renderer.c:346 -#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +#: ui/gcr-certificate-renderer.c:605 ui/gcr-certificate-renderer.c:915 +#: ui/gcr-certificate-request-renderer.c:345 +#: ui/gcr-certificate-request-renderer.c:382 ui/gcr-gnupg-renderer.c:560 msgid "Signature" msgstr "Allekirjoitus" -#: ../ui/gcr-certificate-renderer.c:616 +#: ui/gcr-certificate-renderer.c:622 msgid "Export Certificate…" msgstr "Vie varmenne…" -#: ../ui/gcr-certificate-renderer.c:855 +#: ui/gcr-certificate-renderer.c:861 msgid "Key Algorithm" msgstr "Avaimen algoritmi" -#: ../ui/gcr-certificate-renderer.c:860 +#: ui/gcr-certificate-renderer.c:866 msgid "Key Parameters" msgstr "Avaimen parametrit" -#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +#: ui/gcr-certificate-renderer.c:874 ui/gcr-gnupg-renderer.c:353 msgid "Key Size" msgstr "Avaimen koko" -#: ../ui/gcr-certificate-renderer.c:876 +#: ui/gcr-certificate-renderer.c:882 msgid "Key SHA1 Fingerprint" msgstr "Avaimen SHA1-tunnistetieto" -#: ../ui/gcr-certificate-renderer.c:898 +#: ui/gcr-certificate-renderer.c:904 msgid "Signature Algorithm" msgstr "Allekirjoituksen algoritmi" -#: ../ui/gcr-certificate-renderer.c:902 +#: ui/gcr-certificate-renderer.c:908 msgid "Signature Parameters" msgstr "Allekirjoituksen parametrit" -#: ../ui/gcr-certificate-renderer.c:951 +#: ui/gcr-certificate-renderer.c:957 msgid "Critical" msgstr "Kriittinen" #. The certificate request type -#: ../ui/gcr-certificate-request-renderer.c:94 -#: ../ui/gcr-certificate-request-renderer.c:305 -#: ../ui/gcr-certificate-request-renderer.c:320 -#: ../ui/gcr-certificate-request-renderer.c:363 -#: ../ui/gcr-certificate-request-renderer.c:368 +#: ui/gcr-certificate-request-renderer.c:95 +#: ui/gcr-certificate-request-renderer.c:304 +#: ui/gcr-certificate-request-renderer.c:319 +#: ui/gcr-certificate-request-renderer.c:362 +#: ui/gcr-certificate-request-renderer.c:367 msgid "Certificate request" msgstr "Varmennepyyntö" -#: ../ui/gcr-certificate-request-renderer.c:258 +#: ui/gcr-certificate-request-renderer.c:257 msgid "Attribute" -msgstr "" +msgstr "Attribuutti" -#: ../ui/gcr-certificate-request-renderer.c:262 -#: ../ui/gcr-certificate-request-renderer.c:321 -#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 -#: ../ui/gcr-gnupg-renderer.c:591 +#: ui/gcr-certificate-request-renderer.c:261 +#: ui/gcr-certificate-request-renderer.c:320 +#: ui/gcr-certificate-request-renderer.c:368 ui/gcr-gnupg-renderer.c:591 +#: ui/gcr-gnupg-renderer.c:593 msgid "Type" msgstr "Tyyppi" -#: ../ui/gcr-certificate-request-renderer.c:373 +#: ui/gcr-certificate-request-renderer.c:372 msgid "Challenge" -msgstr "" +msgstr "Haaste" -#: ../ui/gcr-display-view.c:319 +#: ui/gcr-display-view.c:298 msgid "_Details" msgstr "_Tiedot" -#: ../ui/gcr-failure-renderer.c:159 +#: ui/gcr-failure-renderer.c:159 #, c-format msgid "Could not display “%s”" msgstr "Ei voitu näyttää “%s”" -#: ../ui/gcr-failure-renderer.c:161 +#: ui/gcr-failure-renderer.c:161 msgid "Could not display file" msgstr "Ei voitu näyttää tiedostoa" -#: ../ui/gcr-failure-renderer.c:166 +#: ui/gcr-failure-renderer.c:166 msgid "Reason" msgstr "Syy" -#: ../ui/gcr-failure-renderer.c:216 -#, c-format +#: ui/gcr-failure-renderer.c:216 msgid "Cannot display a file of this type." msgstr "Tämän tyyppistä tiedostoa ei voi näyttää." -#: ../ui/gcr-gnupg-renderer.c:201 +#: ui/gcr-gnupg-renderer.c:203 msgid "Elgamal" -msgstr "" +msgstr "ElGamal" -#: ../ui/gcr-gnupg-renderer.c:214 +#: ui/gcr-gnupg-renderer.c:216 msgid "Encrypt" msgstr "Salaa" -#: ../ui/gcr-gnupg-renderer.c:216 +#: ui/gcr-gnupg-renderer.c:218 msgid "Sign" msgstr "Allekirjoita" -#: ../ui/gcr-gnupg-renderer.c:218 +#: ui/gcr-gnupg-renderer.c:220 msgid "Certify" msgstr "Varmenna" -#: ../ui/gcr-gnupg-renderer.c:220 +#: ui/gcr-gnupg-renderer.c:222 msgid "Authenticate" msgstr "Todenna" -#: ../ui/gcr-gnupg-renderer.c:222 +#: ui/gcr-gnupg-renderer.c:224 msgctxt "capability" msgid "Disabled" -msgstr "" +msgstr "Ei käytössä" -#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 -#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +#: ui/gcr-gnupg-renderer.c:255 ui/gcr-gnupg-renderer.c:414 +#: ui/gcr-key-renderer.c:391 ui/gcr-key-renderer.c:395 msgid "Unknown" msgstr "Tuntematon" -#: ../ui/gcr-gnupg-renderer.c:255 +#: ui/gcr-gnupg-renderer.c:257 msgid "Invalid" msgstr "Virheellinen" -#: ../ui/gcr-gnupg-renderer.c:257 +#: ui/gcr-gnupg-renderer.c:259 msgctxt "ownertrust" msgid "Disabled" -msgstr "" +msgstr "Ei käytössä" -#: ../ui/gcr-gnupg-renderer.c:259 +#: ui/gcr-gnupg-renderer.c:261 msgid "Revoked" msgstr "Kumottu" -#: ../ui/gcr-gnupg-renderer.c:261 +#: ui/gcr-gnupg-renderer.c:263 msgid "Expired" msgstr "Vanhentunut" -#: ../ui/gcr-gnupg-renderer.c:263 +#: ui/gcr-gnupg-renderer.c:265 msgid "Undefined trust" msgstr "Määrittämätön luotto" -#: ../ui/gcr-gnupg-renderer.c:265 +#: ui/gcr-gnupg-renderer.c:267 msgid "Distrusted" msgstr "Ei luotettu" -#: ../ui/gcr-gnupg-renderer.c:267 +#: ui/gcr-gnupg-renderer.c:269 msgid "Marginally trusted" msgstr "Hieman luotettu" -#: ../ui/gcr-gnupg-renderer.c:269 +#: ui/gcr-gnupg-renderer.c:271 msgid "Fully trusted" msgstr "Täysin luotettu" -#: ../ui/gcr-gnupg-renderer.c:271 +#: ui/gcr-gnupg-renderer.c:273 msgid "Ultimately trusted" msgstr "Erittäin luotettu" -#: ../ui/gcr-gnupg-renderer.c:285 +#: ui/gcr-gnupg-renderer.c:287 msgid "The information in this key has not yet been verified" msgstr "Tämän avaimen tietoja ei ole vielä vahvistettu" -#: ../ui/gcr-gnupg-renderer.c:288 +#: ui/gcr-gnupg-renderer.c:290 msgid "This key is invalid" msgstr "Avain on virheellinen" -#: ../ui/gcr-gnupg-renderer.c:291 +#: ui/gcr-gnupg-renderer.c:293 msgid "This key has been disabled" msgstr "Tämä avain on poistettu käytöstä" -#: ../ui/gcr-gnupg-renderer.c:294 +#: ui/gcr-gnupg-renderer.c:296 msgid "This key has been revoked" msgstr "Avain on kumottu" -#: ../ui/gcr-gnupg-renderer.c:297 +#: ui/gcr-gnupg-renderer.c:299 msgid "This key has expired" msgstr "Avain on vanhentunut" -#: ../ui/gcr-gnupg-renderer.c:302 +#: ui/gcr-gnupg-renderer.c:304 msgid "This key is distrusted" msgstr "Avain ei ole luotettu" -#: ../ui/gcr-gnupg-renderer.c:305 +#: ui/gcr-gnupg-renderer.c:307 msgid "This key is marginally trusted" msgstr "Avain on hieman luotettu" -#: ../ui/gcr-gnupg-renderer.c:308 +#: ui/gcr-gnupg-renderer.c:310 msgid "This key is fully trusted" msgstr "Avain on täysin luotettu" -#: ../ui/gcr-gnupg-renderer.c:311 +#: ui/gcr-gnupg-renderer.c:313 msgid "This key is ultimately trusted" msgstr "Avain on erittäin luotettu" -#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +#: ui/gcr-gnupg-renderer.c:338 ui/gcr-gnupg-renderer.c:564 msgid "Key ID" msgstr "Avaimen tunniste" -#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 -#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +#: ui/gcr-gnupg-renderer.c:346 ui/gcr-gnupg-renderer.c:572 +#: ui/gcr-gnupg-renderer.c:619 ui/gcr-key-renderer.c:392 msgid "Algorithm" msgstr "Algoritmi" -#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 -#: ../ui/gcr-gnupg-renderer.c:479 +#: ui/gcr-gnupg-renderer.c:361 ui/gcr-gnupg-renderer.c:438 +#: ui/gcr-gnupg-renderer.c:481 msgid "Created" msgstr "Luotu" -#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 -#: ../ui/gcr-gnupg-renderer.c:488 +#: ui/gcr-gnupg-renderer.c:370 ui/gcr-gnupg-renderer.c:447 +#: ui/gcr-gnupg-renderer.c:490 msgid "Expiry" msgstr "Erääntyminen" -#: ../ui/gcr-gnupg-renderer.c:377 +#: ui/gcr-gnupg-renderer.c:379 msgid "Capabilities" msgstr "Kyvyt" -#: ../ui/gcr-gnupg-renderer.c:390 +#: ui/gcr-gnupg-renderer.c:392 msgid "Owner trust" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:418 +#: ui/gcr-gnupg-renderer.c:420 msgid "Name" msgstr "Nimi" -#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +#: ui/gcr-gnupg-renderer.c:426 ui/gcr-gnupg-renderer.c:708 msgid "Comment" msgstr "Kommentti" -#: ../ui/gcr-gnupg-renderer.c:464 +#: ui/gcr-gnupg-renderer.c:466 msgid "User Attribute" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +#: ui/gcr-gnupg-renderer.c:473 ui/gcr-key-renderer.c:398 msgid "Size" msgstr "Koko" -#: ../ui/gcr-gnupg-renderer.c:506 +#: ui/gcr-gnupg-renderer.c:508 msgid "Signature of a binary document" msgstr "Binääridokumentin allekirjoitus" -#: ../ui/gcr-gnupg-renderer.c:508 +#: ui/gcr-gnupg-renderer.c:510 msgid "Signature of a canonical text document" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:510 +#: ui/gcr-gnupg-renderer.c:512 #, fuzzy msgid "Standalone signature" msgstr "Allekirjoitus" -#: ../ui/gcr-gnupg-renderer.c:512 +#: ui/gcr-gnupg-renderer.c:514 #, fuzzy msgid "Generic certification of key" msgstr "Avaa varmenne" -#: ../ui/gcr-gnupg-renderer.c:514 +#: ui/gcr-gnupg-renderer.c:516 msgid "Persona certification of key" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:516 +#: ui/gcr-gnupg-renderer.c:518 msgid "Casual certification of key" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:518 +#: ui/gcr-gnupg-renderer.c:520 msgid "Positive certification of key" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:520 +#: ui/gcr-gnupg-renderer.c:522 msgid "Subkey binding signature" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:522 +#: ui/gcr-gnupg-renderer.c:524 msgid "Primary key binding signature" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:524 +#: ui/gcr-gnupg-renderer.c:526 #, fuzzy msgid "Signature directly on key" msgstr "Allekirjoituksen parametrit" -#: ../ui/gcr-gnupg-renderer.c:526 +#: ui/gcr-gnupg-renderer.c:528 msgid "Key revocation signature" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:528 +#: ui/gcr-gnupg-renderer.c:530 msgid "Subkey revocation signature" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:530 +#: ui/gcr-gnupg-renderer.c:532 msgid "Certification revocation signature" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:532 +#: ui/gcr-gnupg-renderer.c:534 msgid "Timestamp signature" msgstr "Aikaleiman allekirjoitus" -#: ../ui/gcr-gnupg-renderer.c:534 +#: ui/gcr-gnupg-renderer.c:536 msgid "Third-party confirmation signature" msgstr "" -#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +#: ui/gcr-gnupg-renderer.c:589 ui/gcr-gnupg-renderer.c:597 msgid "Class" msgstr "Luokka" -#: ../ui/gcr-gnupg-renderer.c:589 +#: ui/gcr-gnupg-renderer.c:591 msgid "Local only" msgstr "Vain paikallinen" -#: ../ui/gcr-gnupg-renderer.c:591 +#: ui/gcr-gnupg-renderer.c:593 msgid "Exportable" msgstr "Vietävissä" -#: ../ui/gcr-gnupg-renderer.c:609 +#: ui/gcr-gnupg-renderer.c:611 msgid "Revocation Key" msgstr "Kumoamisavain" -#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 -#: ../ui/gcr-gnupg-renderer.c:649 +#: ui/gcr-gnupg-renderer.c:625 ui/gcr-gnupg-renderer.c:649 +#: ui/gcr-gnupg-renderer.c:651 msgid "Fingerprint" msgstr "Tunnistetieto" -#: ../ui/gcr-gnupg-renderer.c:738 +#: ui/gcr-gnupg-renderer.c:740 msgid "Public Subkey" msgstr "Julkinen aliavain" -#: ../ui/gcr-gnupg-renderer.c:740 +#: ui/gcr-gnupg-renderer.c:742 msgid "Secret Key" msgstr "Salainen avain" -#: ../ui/gcr-gnupg-renderer.c:742 +#: ui/gcr-gnupg-renderer.c:744 msgid "Secret Subkey" msgstr "Salainen aliavain" -#: ../ui/gcr-import-button.c:116 +#: ui/gcr-import-button.c:116 msgid "Initializing…" msgstr "Alustetaan…" -#: ../ui/gcr-import-button.c:124 +#: ui/gcr-import-button.c:124 msgid "Import is in progress…" msgstr "Tuonti on meneillään…" -#: ../ui/gcr-import-button.c:131 +#: ui/gcr-import-button.c:131 #, c-format msgid "Imported to: %s" msgstr "Tuotu kohteeseen: %s" -#: ../ui/gcr-import-button.c:151 +#: ui/gcr-import-button.c:151 #, c-format msgid "Import to: %s" msgstr "Tuo kohteeseen: %s" -#: ../ui/gcr-import-button.c:164 -#, fuzzy +#: ui/gcr-import-button.c:164 msgid "Cannot import because there are no compatible importers" -msgstr "Tuonti epäonnistui, koska avain oli väärän tyyppinen" +msgstr "Tuonti ei onnistu, koska yhteensopivia tuontityökaluja ei ole" -#: ../ui/gcr-import-button.c:173 +#: ui/gcr-import-button.c:173 msgid "No data to import" msgstr "Ei tietoja tuotavaksi" -#: ../ui/gcr-key-renderer.c:88 +#: ui/gcr-key-renderer.c:89 msgid "Key" msgstr "Avain" -#: ../ui/gcr-key-renderer.c:355 +#: ui/gcr-key-renderer.c:355 msgid "Private RSA Key" msgstr "Yksityinen RSA-avain" -#: ../ui/gcr-key-renderer.c:357 +#: ui/gcr-key-renderer.c:357 msgid "Private DSA Key" msgstr "Yksityinen DSA-avain" -#: ../ui/gcr-key-renderer.c:359 +#: ui/gcr-key-renderer.c:359 msgid "Private Elliptic Curve Key" msgstr "" -#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +#: ui/gcr-key-renderer.c:364 ui/gcr-key-renderer.c:366 msgid "Public DSA Key" msgstr "Julkinen DSA-avain" -#: ../ui/gcr-key-renderer.c:368 +#: ui/gcr-key-renderer.c:368 msgid "Public Elliptic Curve Key" msgstr "" -#: ../ui/gcr-key-renderer.c:377 +#: ui/gcr-key-renderer.c:377 #, c-format msgid "%u bit" msgid_plural "%u bits" msgstr[0] "%u bitti" msgstr[1] "%u bittiä" -#: ../ui/gcr-key-renderer.c:378 +#: ui/gcr-key-renderer.c:378 msgid "Strength" msgstr "Vahvuus" #. Fingerprints -#: ../ui/gcr-key-renderer.c:402 +#: ui/gcr-key-renderer.c:402 msgid "Fingerprints" msgstr "Tunnistetiedot" -#: ../ui/gcr-key-renderer.c:406 +#: ui/gcr-key-renderer.c:406 msgid "SHA1" msgstr "SHA1" -#: ../ui/gcr-key-renderer.c:411 +#: ui/gcr-key-renderer.c:411 msgid "SHA256" msgstr "SHA256" #. Add our various buttons -#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 -#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +#: ui/gcr-pkcs11-import-dialog.c:104 ui/gcr-prompt-dialog.c:556 +#: ui/gcr-certificate-exporter.c:229 ui/gcr-certificate-exporter.c:306 msgid "_Cancel" msgstr "_Peru" -#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +#: ui/gcr-pkcs11-import-dialog.c:106 ui/gcr-prompt-dialog.c:559 msgid "_OK" msgstr "_OK" -#: ../ui/gcr-pkcs11-import-dialog.c:189 +#: ui/gcr-pkcs11-import-dialog.c:179 msgid "Automatically chosen" msgstr "Automaattisesti valittu" -#: ../ui/gcr-pkcs11-import-dialog.c:273 -#: ../ui/gcr-pkcs11-import-interaction.c:152 -#: ../ui/gcr-pkcs11-import-interaction.c:170 -#, c-format +#: ui/gcr-pkcs11-import-dialog.c:263 ui/gcr-pkcs11-import-interaction.c:142 +#: ui/gcr-pkcs11-import-interaction.c:160 msgid "The user cancelled the operation" msgstr "Käyttäjä perui toiminnon" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +#: ui/gcr-pkcs11-import-dialog.ui:31 msgid "In order to import, please enter the password." msgstr "Anna salasana suorittaaksesi tuonnin." #. The password label -#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +#: ui/gcr-pkcs11-import-dialog.ui:66 ui/gcr-prompt-dialog.c:617 msgid "Password:" msgstr "Salasana:" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +#: ui/gcr-pkcs11-import-dialog.ui:80 msgid "Token:" -msgstr "" +msgstr "Poletti:" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 -#: ../ui/gcr-unlock-renderer.c:124 +#: ui/gcr-pkcs11-import-dialog.ui:143 ui/gcr-unlock-renderer.c:70 +#: ui/gcr-unlock-renderer.c:124 msgid "Unlock" msgstr "Avaa lukitus" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +#: ui/gcr-pkcs11-import-dialog.ui:178 msgid "Label:" msgstr "Nimike:" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +#: ui/gcr-pkcs11-import-dialog.ui:233 msgid "Import settings" msgstr "Tuontiasetukset" #. The confirm label -#: ../ui/gcr-prompt-dialog.c:578 +#: ui/gcr-prompt-dialog.c:634 msgid "Confirm:" msgstr "Vahvista:" -#: ../ui/gcr-prompt-dialog.c:646 +#: ui/gcr-prompt-dialog.c:702 msgid "Passwords do not match." msgstr "Salasanat eivät täsmää." -#: ../ui/gcr-prompt-dialog.c:653 +#: ui/gcr-prompt-dialog.c:709 msgid "Password cannot be blank" msgstr "Salasana ei voi olla tyhjä" -#: ../ui/gcr-prompter.desktop.in.in.h:1 +#: ui/gcr-prompter.desktop.in.in:3 msgid "Access Prompt" msgstr "" -#: ../ui/gcr-prompter.desktop.in.in.h:2 +#: ui/gcr-prompter.desktop.in.in:4 msgid "Unlock access to passwords and other secrets" msgstr "Avaa lukitus salasanoihin ja muihin salaisuuksiin" -#: ../ui/gcr-certificate-exporter.c:225 +#: ui/gcr-certificate-exporter.c:226 msgid "A file already exists with this name." msgstr "Samalla nimellä on jo tiedosto olemassa." -#: ../ui/gcr-certificate-exporter.c:226 +#: ui/gcr-certificate-exporter.c:227 msgid "Do you want to replace it with a new file?" msgstr "Haluatko korvata sen uudella tiedostolla?" -#: ../ui/gcr-certificate-exporter.c:229 +#: ui/gcr-certificate-exporter.c:230 msgid "_Replace" msgstr "_Korvaa" -#: ../ui/gcr-certificate-exporter.c:259 -#, c-format +#: ui/gcr-certificate-exporter.c:260 msgid "The operation was cancelled." msgstr "Toiminto peruttiin." -#: ../ui/gcr-certificate-exporter.c:303 +#: ui/gcr-certificate-exporter.c:304 msgid "Export certificate" msgstr "Vie varmenne" -#: ../ui/gcr-certificate-exporter.c:306 +#: ui/gcr-certificate-exporter.c:307 msgid "_Save" msgstr "_Tallenna" -#: ../ui/gcr-certificate-exporter.c:315 +#: ui/gcr-certificate-exporter.c:316 msgid "Certificate files" msgstr "Varmennetiedostot" -#: ../ui/gcr-certificate-exporter.c:326 +#: ui/gcr-certificate-exporter.c:327 msgid "PEM files" msgstr "PEM-tiedostot" -#: ../ui/gcr-unlock-options-widget.ui.h:1 +#: ui/gcr-unlock-options-widget.ui:16 msgid "Automatically unlock this keyring whenever I’m logged in" msgstr "Avaa tämä avainnippu automaattisesti kun olen sisäänkirjautunut" -#: ../ui/gcr-unlock-options-widget.ui.h:2 +#: ui/gcr-unlock-options-widget.ui:31 msgid "Lock this keyring when I log out" msgstr "Lukitse tämä avainnippu kun kirjaudun ulos" -#: ../ui/gcr-unlock-options-widget.ui.h:3 +#: ui/gcr-unlock-options-widget.ui:53 msgid "Lock this keyring after" msgstr "Lukitse tämä avainnippu" -#: ../ui/gcr-unlock-options-widget.ui.h:4 +#: ui/gcr-unlock-options-widget.ui:67 msgid "Lock this keyring if idle for" msgstr "Lukitse tämä avainnippu jouten oltaessa" -#. Translators: The -#: ../ui/gcr-unlock-options-widget.ui.h:6 +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ui/gcr-unlock-options-widget.ui:103 msgid "minutes" msgstr "minuutin kuluttua" -#: ../ui/gcr-unlock-renderer.c:67 +#: ui/gcr-unlock-renderer.c:68 #, c-format msgid "Unlock: %s" msgstr "Avaa lukitus: %s" -#: ../ui/gcr-unlock-renderer.c:122 +#: ui/gcr-unlock-renderer.c:122 msgid "Password" msgstr "Salasana" -#: ../ui/gcr-unlock-renderer.c:274 +#: ui/gcr-unlock-renderer.c:274 #, c-format msgid "" "The contents of “%s” are locked. In order to view the contents, enter the " @@ -1094,49 +1131,53 @@ "Kohteen “%s” sisältö on lukittu. Jotta voit nähdä sen sisällön, anna oikea " "salasana." -#: ../ui/gcr-unlock-renderer.c:277 +#: ui/gcr-unlock-renderer.c:277 msgid "" "The contents are locked. In order to view the contents, enter the correct " "password." msgstr "Sisältö on lukittu. Jotta voit nähdä sisällön, anna oikea salasana." -#: ../ui/gcr-viewer-tool.c:40 +#: ui/gcr-viewer.desktop.in.in:3 +msgid "View file" +msgstr "Näytä tiedosto" + +#: ui/gcr-viewer-tool.c:40 msgid "GCR Certificate and Key Viewer" msgstr "GCR - varmenteiden ja avainten katselin" -#: ../ui/gcr-viewer-tool.c:47 +#: ui/gcr-viewer-tool.c:47 msgid "Show the application's version" msgstr "Näytä sovelluksen versio" -#: ../ui/gcr-viewer-tool.c:49 +#: ui/gcr-viewer-tool.c:49 msgid "[file...]" msgstr "[tiedosto...]" -#: ../ui/gcr-viewer-tool.c:100 +#: ui/gcr-viewer-tool.c:100 msgid "- View certificate and key files" msgstr "- Katsele varmenne- ja avaintiedostoja" -#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +#: ui/gcr-viewer-tool.c:114 ui/gcr-viewer-widget.c:669 msgid "Certificate Viewer" msgstr "Varmennekatselin" -#: ../ui/gcr-viewer-widget.c:202 +#: ui/gcr-viewer-widget.c:189 msgid "The password was incorrect" msgstr "Salasana oli väärä" -#: ../ui/gcr-viewer-window.c:75 +#: ui/gcr-viewer-window.c:74 msgid "Imported" msgstr "Tuotu" -#: ../ui/gcr-viewer-window.c:79 +#: ui/gcr-viewer-window.c:78 msgid "Import failed" msgstr "Tuonti epäonnistui" -#: ../ui/gcr-viewer-window.c:106 +#: ui/gcr-viewer-window.c:105 msgid "Import" msgstr "Tuo" -#: ../ui/gcr-viewer-window.c:115 +#: ui/gcr-viewer-window.c:114 msgid "_Close" msgstr "_Sulje" diff -Nru gcr-3.38.1/po/gl.po gcr-3.40.0/po/gl.po --- gcr-3.38.1/po/gl.po 2021-01-12 22:55:54.685056400 +0000 +++ gcr-3.40.0/po/gl.po 2021-03-27 08:40:56.340531000 +0000 @@ -3,28 +3,28 @@ # Copyright (C) 2010 Fran Diéguez. # Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas # colaborar connosco, podes atopar máis información en http://www.trasno.net +# # Ignacio Casal Quinteiro , 2005, 2006. # Ignacio Casal Quinteiro , 2007, 2008. # Mancomún - Centro de Referencia e Servizos de Software Libre , 2009. # Antón Méixome , 2009. # Fran Diéguez , 2009, 2010, 2011, 2012. # Leandro Regueiro , 2012. -# Fran Dieguez , 2013-2020. -# +# Fran Dieguez , 2013-2020, 2021. msgid "" msgstr "" "Project-Id-Version: gnome-keyring.master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gcr/issues\n" -"POT-Creation-Date: 2020-06-18 07:02+0000\n" -"PO-Revision-Date: 2020-08-13 00:43+0200\n" +"POT-Creation-Date: 2020-08-22 15:40+0000\n" +"PO-Revision-Date: 2021-02-23 23:43+0100\n" "Last-Translator: Fran Dieguez \n" -"Language-Team: Galician \n" +"Language-Team: Proxecto Trasno \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"X-Generator: Gtranslator 3.36.0\n" +"X-Generator: Gtranslator 3.38.0\n" "X-Project-Style: gnome\n" #: egg/egg-oid.c:40 @@ -434,7 +434,7 @@ #. communication with a certain peer. #: gcr/gcr-trust.c:364 msgid "Couldn’t find a place to store the pinned certificate" -msgstr "Non foi posíbel atopar un lugar para almacenar o certificado anclado" +msgstr "Non foi posíbel atopar un lugar para almacenar o certificado ancorado" #: ui/gcr-certificate-renderer.c:118 msgid "Basic Constraints" @@ -509,7 +509,6 @@ msgstr "Só cifrador" #: ui/gcr-certificate-renderer.c:195 -#| msgid "Data encipherment" msgid "Decipher only" msgstr "Só descifrador" @@ -777,7 +776,7 @@ #: ui/gcr-gnupg-renderer.c:313 msgid "This key is ultimately trusted" -msgstr "Esta chave está confiada últimamente" +msgstr "Esta chave está confiada ultimamente" #: ui/gcr-gnupg-renderer.c:338 ui/gcr-gnupg-renderer.c:564 msgid "Key ID" @@ -832,7 +831,7 @@ #: ui/gcr-gnupg-renderer.c:512 msgid "Standalone signature" -msgstr "Sinatura indpendente" +msgstr "Sinatura independente" #: ui/gcr-gnupg-renderer.c:514 msgid "Generic certification of key" @@ -1168,7 +1167,7 @@ #: ui/gcr-viewer-window.c:78 msgid "Import failed" -msgstr "Fallou a importación" +msgstr "Fallou a importación" #: ui/gcr-viewer-window.c:105 msgid "Import" diff -Nru gcr-3.38.1/po/Makevars gcr-3.40.0/po/Makevars --- gcr-3.38.1/po/Makevars 2021-01-12 22:55:54.675056500 +0000 +++ gcr-3.40.0/po/Makevars 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -# Makefile variables for PO directory in any package using GNU gettext. - -# Usually the message domain is the same as the package name. -DOMAIN = $(PACKAGE) - -# These two variables depend on the location of this directory. -subdir = po -top_builddir = .. - -# These options get passed to xgettext. -XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 --keyword=g_dngettext:2,3 --add-comments - -# This is the copyright holder that gets inserted into the header of the -# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding -# package. (Note that the msgstr strings, extracted from the package's -# sources, belong to the copyright holder of the package.) Translators are -# expected to transfer the copyright for their translations to this person -# or entity, or to disclaim their copyright. The empty string stands for -# the public domain; in this case the translators are expected to disclaim -# their copyright. -COPYRIGHT_HOLDER = $(PACKAGE_STRING) authors - -# This tells whether or not to prepend "GNU " prefix to the package -# name that gets inserted into the header of the $(DOMAIN).pot file. -# Possible values are "yes", "no", or empty. If it is empty, try to -# detect it automatically by scanning the files in $(top_srcdir) for -# "GNU packagename" string. -PACKAGE_GNU = no - -# This is the email address or URL to which the translators shall report -# bugs in the untranslated strings: -# - Strings which are not entire sentences, see the maintainer guidelines -# in the GNU gettext documentation, section 'Preparing Strings'. -# - Strings which use unclear terms or require additional context to be -# understood. -# - Strings which make invalid assumptions about notation of date, time or -# money. -# - Pluralisation problems. -# - Incorrect English spelling. -# - Incorrect formatting. -# It can be your email address, or a mailing list address where translators -# can write to without being subscribed, or the URL of a web page through -# which the translators can contact you. -MSGID_BUGS_ADDRESS = $(PACKAGE_BUGREPORT) - -# This is the list of locale categories, beyond LC_MESSAGES, for which the -# message catalogs shall be used. It is usually empty. -EXTRA_LOCALE_CATEGORIES = - -# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' -# context. Possible values are "yes" and "no". Set this to yes if the -# package uses functions taking also a message context, like pgettext(), or -# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. -USE_MSGCTXT = yes - -# These options get passed to msgmerge. -# Useful options are in particular: -# --previous to keep previous msgids of translated messages, -# --quiet to reduce the verbosity. -MSGMERGE_OPTIONS = - -# These options get passed to msginit. -# If you want to disable line wrapping when writing PO files, add -# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and -# MSGINIT_OPTIONS. -MSGINIT_OPTIONS = - -# This tells whether or not to regenerate a PO file when $(DOMAIN).pot -# has changed. Possible values are "yes" and "no". Set this to no if -# the POT file is checked in the repository and the version control -# program ignores timestamps. -PO_DEPENDS_ON_POT = no - -# This tells whether or not to forcibly update $(DOMAIN).pot and -# regenerate PO files on "make dist". Possible values are "yes" and -# "no". Set this to no if the POT file and PO files are maintained -# externally. -DIST_DEPENDS_ON_UPDATE_PO = no diff -Nru gcr-3.38.1/po/nb.po gcr-3.40.0/po/nb.po --- gcr-3.38.1/po/nb.po 2021-01-12 22:55:54.688056500 +0000 +++ gcr-3.40.0/po/nb.po 2021-03-27 08:40:56.343531100 +0000 @@ -2,14 +2,14 @@ # Copyright (C) 2003 Red Hat Inc. # This file is distributed under the same license as the gnome-keyring package. # -# Kjartan Maraas , 2003-2017. +# Kjartan Maraas , 2003-2020. # Torstein Adolf Winterseth , 2010. msgid "" msgstr "" -"Project-Id-Version: gcr 3.23.x\n" -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-keyring&keywords=I18N+L10N&component=gcr\n" -"POT-Creation-Date: 2016-10-18 09:40+0000\n" -"PO-Revision-Date: 2017-02-18 11:54+0100\n" +"Project-Id-Version: gcr 3.38.x\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gcr/issues\n" +"POT-Creation-Date: 2020-09-28 06:00+0000\n" +"PO-Revision-Date: 2021-01-25 14:42+0100\n" "Last-Translator: Kjartan Maraas \n" "Language-Team: Norwegian bokmål \n" "Language: nb\n" @@ -18,1055 +18,1096 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../egg/egg-oid.c:40 +#: egg/egg-oid.c:40 msgid "Domain Component" msgstr "Domenekomponent" -#: ../egg/egg-oid.c:42 ../ui/gcr-gnupg-renderer.c:408 -#: ../ui/gcr-gnupg-renderer.c:577 +#: egg/egg-oid.c:42 ui/gcr-gnupg-renderer.c:410 ui/gcr-gnupg-renderer.c:579 msgid "User ID" msgstr "Bruker-ID" -#: ../egg/egg-oid.c:45 +#: egg/egg-oid.c:45 msgid "Email Address" msgstr "E-postadresse" -#: ../egg/egg-oid.c:53 +#: egg/egg-oid.c:53 msgid "Date of Birth" msgstr "Fødselsdato" -#: ../egg/egg-oid.c:55 +#: egg/egg-oid.c:55 msgid "Place of Birth" msgstr "Fødested" -#: ../egg/egg-oid.c:57 +#: egg/egg-oid.c:57 msgid "Gender" msgstr "Kjønn" -#: ../egg/egg-oid.c:59 +#: egg/egg-oid.c:59 msgid "Country of Citizenship" msgstr "Land med statsborgerskap" -#: ../egg/egg-oid.c:61 +#: egg/egg-oid.c:61 msgid "Country of Residence" msgstr "Bostedsland" -#: ../egg/egg-oid.c:64 +#: egg/egg-oid.c:64 msgid "Common Name" msgstr "Vanlig navn" -#: ../egg/egg-oid.c:66 +#: egg/egg-oid.c:66 msgid "Surname" msgstr "Etternavn" -#: ../egg/egg-oid.c:68 ../ui/gcr-certificate-renderer.c:559 +#: egg/egg-oid.c:68 ui/gcr-certificate-renderer.c:565 msgid "Serial Number" msgstr "Serienummer" -#: ../egg/egg-oid.c:70 +#: egg/egg-oid.c:70 msgid "Country" msgstr "Land" -#: ../egg/egg-oid.c:72 +#: egg/egg-oid.c:72 msgid "Locality" msgstr "Lokalitet" -#: ../egg/egg-oid.c:74 +#: egg/egg-oid.c:74 msgid "State" msgstr "Stat" -#: ../egg/egg-oid.c:76 +#: egg/egg-oid.c:76 msgid "Street" msgstr "Gate" -#: ../egg/egg-oid.c:78 +#: egg/egg-oid.c:78 msgid "Organization" msgstr "Organisasjon" -#: ../egg/egg-oid.c:80 +#: egg/egg-oid.c:80 msgid "Organizational Unit" msgstr "Organisasjonsenhet" -#: ../egg/egg-oid.c:82 +#: egg/egg-oid.c:82 msgid "Title" msgstr "Tittel" -#: ../egg/egg-oid.c:84 +#: egg/egg-oid.c:84 msgid "Telephone Number" msgstr "Telefonnummer" -#: ../egg/egg-oid.c:86 +#: egg/egg-oid.c:86 msgid "Given Name" msgstr "Gitt navn" -#: ../egg/egg-oid.c:88 +#: egg/egg-oid.c:88 msgid "Initials" msgstr "Initialer" -#: ../egg/egg-oid.c:90 +#: egg/egg-oid.c:90 msgid "Generation Qualifier" msgstr "Kvalifikator for generering" -#: ../egg/egg-oid.c:92 +#: egg/egg-oid.c:92 msgid "DN Qualifier" msgstr "DN-kvalifikator" -#: ../egg/egg-oid.c:94 +#: egg/egg-oid.c:94 msgid "Pseudonym" msgstr "Pseudonym" -#: ../egg/egg-oid.c:97 ../ui/gcr-gnupg-renderer.c:199 -#: ../ui/gcr-key-renderer.c:385 +#. Translators: Russian: Main state registration number +#: egg/egg-oid.c:98 +msgid "OGRN" +msgstr "OGRN" + +#. Translators: Russian: Individual insurance account number +#: egg/egg-oid.c:101 +msgid "SNILS" +msgstr "SNILS" + +#. Translators: Russian: Main state registration number for individual enterpreneurs +#: egg/egg-oid.c:104 +msgid "OGRNIP" +msgstr "OGRNIP" + +#. Translators: Russian: Individual taxpayer number +#: egg/egg-oid.c:107 +msgid "INN" +msgstr "INN" + +#: egg/egg-oid.c:110 ui/gcr-gnupg-renderer.c:201 ui/gcr-key-renderer.c:385 msgid "RSA" msgstr "RSA" -#: ../egg/egg-oid.c:98 +#: egg/egg-oid.c:111 msgid "MD2 with RSA" msgstr "MD2 med RSA" -#: ../egg/egg-oid.c:99 +#: egg/egg-oid.c:112 msgid "MD5 with RSA" msgstr "MD5 med RSA" -#: ../egg/egg-oid.c:100 +#: egg/egg-oid.c:113 msgid "SHA1 with RSA" msgstr "SHA1 med DSA" -#: ../egg/egg-oid.c:102 ../ui/gcr-gnupg-renderer.c:203 -#: ../ui/gcr-key-renderer.c:387 +#: egg/egg-oid.c:115 ui/gcr-gnupg-renderer.c:205 ui/gcr-key-renderer.c:387 msgid "DSA" msgstr "DSA" -#: ../egg/egg-oid.c:103 +#: egg/egg-oid.c:116 msgid "SHA1 with DSA" msgstr "SHA1 med DSA" -#: ../egg/egg-oid.c:105 ../ui/gcr-key-renderer.c:389 +#: egg/egg-oid.c:118 ui/gcr-key-renderer.c:389 msgid "Elliptic Curve" msgstr "Eliptisk kurve" -#: ../egg/egg-oid.c:106 +#: egg/egg-oid.c:119 msgid "SHA1 with ECDSA" msgstr "SHA1 med ECDSA" -#: ../egg/egg-oid.c:107 +#: egg/egg-oid.c:120 msgid "SHA224 with ECDSA" msgstr "SHA224 med ECDSA" -#: ../egg/egg-oid.c:108 +#: egg/egg-oid.c:121 msgid "SHA256 with ECDSA" msgstr "SHA256 med ECDSA" -#: ../egg/egg-oid.c:109 +#: egg/egg-oid.c:122 msgid "SHA384 with ECDSA" msgstr "SHA384 med ECDSA" -#: ../egg/egg-oid.c:110 +#: egg/egg-oid.c:123 msgid "SHA512 with ECDSA" msgstr "SHA512 med ECDSA" +#: egg/egg-oid.c:125 +msgid "GOST R 34.11-94 with GOST R 34.10-2001" +msgstr "GOST R 34.11-94 med GOST R 34.10-2001" + +#: egg/egg-oid.c:126 +msgid "GOST R 34.10-2001" +msgstr "GOST R 34.10-2001" + +#: egg/egg-oid.c:127 +msgid "GOST R 34.10-2012 256-bit curve" +msgstr "GOST R 34.10-2012 256-bit kurve" + +#: egg/egg-oid.c:128 +msgid "GOST R 34.10-2012 512-bit curve" +msgstr "GOST R 34.10-2012 512-bit kurve" + +#: egg/egg-oid.c:129 +msgid "GOST R 34.11-2012/256 with GOST R 34.10-2012 256-bit curve" +msgstr "GOST R 34.11-2012/256 med GOST R 34.10-2012 256-bit kurve" + +#: egg/egg-oid.c:130 +msgid "GOST R 34.11-2012/512 with GOST R 34.10-2012 512-bit curve" +msgstr "GOST R 34.11-2012/512 med GOST R 34.10-2012 512-bit kurve" + #. Extended Key Usages -#: ../egg/egg-oid.c:113 +#: egg/egg-oid.c:133 msgid "Server Authentication" msgstr "Tjenerautentisering" -#: ../egg/egg-oid.c:114 +#: egg/egg-oid.c:134 msgid "Client Authentication" msgstr "Klientautentisering" -#: ../egg/egg-oid.c:115 +#: egg/egg-oid.c:135 msgid "Code Signing" msgstr "Kodesignering" -#: ../egg/egg-oid.c:116 +#: egg/egg-oid.c:136 msgid "Email Protection" msgstr "Beskyttelse av e-post" -#: ../egg/egg-oid.c:117 +#: egg/egg-oid.c:137 msgid "Time Stamping" msgstr "Tidsstempling" -#: ../gck/gck-module.c:344 +#: gck/gck-module.c:332 #, c-format msgid "Error loading PKCS#11 module: %s" msgstr "Feil under lasting av PKCS#11-modul: %s" -#: ../gck/gck-module.c:358 +#: gck/gck-module.c:346 #, c-format msgid "Couldn’t initialize PKCS#11 module: %s" msgstr "Kunne ikke initiere PKCS#11-modul: %s" -#: ../gck/gck-modules.c:62 +#: gck/gck-modules.c:62 #, c-format msgid "Couldn’t initialize registered PKCS#11 modules: %s" msgstr "Kunne ikke initiere registrerte PKCS#11-moduler: %s" -#: ../gck/gck-uri.c:224 -#, c-format +#: gck/gck-uri.c:224 msgid "The URI has invalid encoding." msgstr "URI har ugyldig koding." -#: ../gck/gck-uri.c:228 +#: gck/gck-uri.c:228 msgid "The URI does not have the “pkcs11” scheme." msgstr "URI har ikke skjema «pkcs11»." -#: ../gck/gck-uri.c:232 +#: gck/gck-uri.c:232 msgid "The URI has bad syntax." msgstr "URI har uygyldig syntaks." -#: ../gck/gck-uri.c:236 +#: gck/gck-uri.c:236 msgid "The URI has a bad version number." msgstr "URI har feil versjonsnummer." -#: ../gcr/gcr-callback-output-stream.c:60 -#: ../gcr/gcr-callback-output-stream.c:77 -#, c-format +#: gcr/gcr-callback-output-stream.c:56 gcr/gcr-callback-output-stream.c:73 msgid "The stream was closed" msgstr "Strømmen ble lukket" #. later #. later -#: ../gcr/gcr-certificate.c:350 ../gcr/gcr-gnupg-key.c:430 +#: gcr/gcr-certificate.c:350 gcr/gcr-gnupg-key.c:429 msgctxt "column" msgid "Name" msgstr "Navn" -#: ../gcr/gcr-certificate.c:352 +#: gcr/gcr-certificate.c:352 msgctxt "column" msgid "Issued By" msgstr "Utstedt av" #. later -#: ../gcr/gcr-certificate.c:354 +#: gcr/gcr-certificate.c:354 msgctxt "column" msgid "Expires" msgstr "Utløper" -#: ../gcr/gcr-certificate.c:1192 ../gcr/gcr-parser.c:325 -#: ../ui/gcr-certificate-renderer.c:102 ../ui/gcr-certificate-exporter.c:464 +#: gcr/gcr-certificate.c:1186 gcr/gcr-parser.c:346 +#: ui/gcr-certificate-renderer.c:103 ui/gcr-certificate-exporter.c:464 msgid "Certificate" msgstr "Sertifikat" -#: ../gcr/gcr-certificate-extensions.c:177 +#: gcr/gcr-certificate-extensions.c:190 msgid "Other Name" msgstr "Annet navn" -#: ../gcr/gcr-certificate-extensions.c:187 +#: gcr/gcr-certificate-extensions.c:200 msgid "XMPP Addr" msgstr "XMPP-adresse" -#: ../gcr/gcr-certificate-extensions.c:191 +#: gcr/gcr-certificate-extensions.c:204 msgid "DNS SRV" msgstr "DNS SRV" -#: ../gcr/gcr-certificate-extensions.c:203 ../ui/gcr-gnupg-renderer.c:421 -#: ../ui/gcr-gnupg-renderer.c:703 +#: gcr/gcr-certificate-extensions.c:216 ui/gcr-gnupg-renderer.c:423 +#: ui/gcr-gnupg-renderer.c:705 msgid "Email" msgstr "E-post" -#: ../gcr/gcr-certificate-extensions.c:211 +#: gcr/gcr-certificate-extensions.c:224 msgid "DNS" msgstr "DNS" -#: ../gcr/gcr-certificate-extensions.c:219 +#: gcr/gcr-certificate-extensions.c:232 msgid "X400 Address" msgstr "X400-adresse" -#: ../gcr/gcr-certificate-extensions.c:226 +#: gcr/gcr-certificate-extensions.c:239 msgid "Directory Name" msgstr "Navn på katalog" -#: ../gcr/gcr-certificate-extensions.c:234 +#: gcr/gcr-certificate-extensions.c:247 msgid "EDI Party Name" msgstr "Navn på EDI-partner" -#: ../gcr/gcr-certificate-extensions.c:241 +#: gcr/gcr-certificate-extensions.c:254 msgid "URI" msgstr "URI" -#: ../gcr/gcr-certificate-extensions.c:249 +#: gcr/gcr-certificate-extensions.c:262 msgid "IP Address" msgstr "IP-adresse" -#: ../gcr/gcr-certificate-extensions.c:257 +#: gcr/gcr-certificate-extensions.c:270 msgid "Registered ID" msgstr "Registrert ID" -#: ../gcr/gcr-certificate-request.c:415 -#, c-format +#: gcr/gcr-certificate-request.c:406 msgid "Unsupported key type for certificate request" msgstr "Ikke støttet nøkkeltype for sertifikatforespørsel" -#: ../gcr/gcr-certificate-request.c:502 ../gcr/gcr-certificate-request.c:587 -#, c-format +#: gcr/gcr-certificate-request.c:493 gcr/gcr-certificate-request.c:578 msgid "The key cannot be used to sign the request" msgstr "Nøkkelen kan ikke brukes til å signere forespørselen" -#: ../gcr/gcr-gnupg-importer.c:94 +#: gcr/gcr-gnupg-importer.c:95 msgid "GnuPG Keyring" msgstr "GnuPG nøkkelring" -#: ../gcr/gcr-gnupg-importer.c:96 +#: gcr/gcr-gnupg-importer.c:97 #, c-format msgid "GnuPG Keyring: %s" msgstr "GnuPG-nøkkelring: %s" -#: ../gcr/gcr-gnupg-key.c:143 ../gcr/gcr-parser.c:331 -#: ../ui/gcr-gnupg-renderer.c:87 +#: gcr/gcr-gnupg-key.c:143 gcr/gcr-parser.c:352 ui/gcr-gnupg-renderer.c:88 msgid "PGP Key" msgstr "PGP-nøkkel" -#: ../gcr/gcr-gnupg-key.c:432 +#: gcr/gcr-gnupg-key.c:431 msgctxt "column" msgid "Key ID" msgstr "Nøkkel-ID" -#: ../gcr/gcr-gnupg-process.c:864 +#: gcr/gcr-gnupg-process.c:867 #, c-format msgid "Gnupg process exited with code: %d" msgstr "Gnupg-prosessen avsluttet med kode: %d" -#: ../gcr/gcr-gnupg-process.c:871 +#: gcr/gcr-gnupg-process.c:874 #, c-format msgid "Gnupg process was terminated with signal: %d" msgstr "Gnupg-prosessen ble terminert med signal: %d" -#: ../gcr/gcr-gnupg-process.c:925 ../gcr/gcr-parser.c:2554 -#: ../gcr/gcr-parser.c:3160 ../gcr/gcr-system-prompt.c:931 +#: gcr/gcr-gnupg-process.c:928 gcr/gcr-parser.c:2598 gcr/gcr-parser.c:3192 +#: gcr/gcr-system-prompt.c:932 msgid "The operation was cancelled" msgstr "Operasjonen ble avbrutt" -#: ../gcr/gcr-parser.c:322 ../ui/gcr-key-renderer.c:361 +#: gcr/gcr-parser.c:343 ui/gcr-key-renderer.c:361 msgid "Private Key" msgstr "Privat nøkkel" -#: ../gcr/gcr-parser.c:328 ../ui/gcr-certificate-renderer.c:881 -#: ../ui/gcr-gnupg-renderer.c:736 ../ui/gcr-key-renderer.c:370 +#: gcr/gcr-parser.c:349 ui/gcr-certificate-renderer.c:887 +#: ui/gcr-gnupg-renderer.c:738 ui/gcr-key-renderer.c:370 msgid "Public Key" msgstr "Offentlig nøkkel" -#: ../gcr/gcr-parser.c:334 +#: gcr/gcr-parser.c:355 msgid "Certificate Request" msgstr "Sertifikatforespørsel" -#: ../gcr/gcr-parser.c:2557 +#: gcr/gcr-parser.c:2601 msgid "Unrecognized or unsupported data." msgstr "Ikke gjenkjente eller støttede data." -#: ../gcr/gcr-parser.c:2560 +#: gcr/gcr-parser.c:2604 msgid "Could not parse invalid or corrupted data." msgstr "Kunne ikke lese ugyldige eller korrupte data." -#: ../gcr/gcr-parser.c:2563 +#: gcr/gcr-parser.c:2607 msgid "The data is locked" msgstr "Data er låst" -#: ../gcr/gcr-prompt.c:225 +#: gcr/gcr-prompt.c:225 msgid "Continue" msgstr "Fortsett" -#: ../gcr/gcr-prompt.c:234 +#: gcr/gcr-prompt.c:234 msgid "Cancel" msgstr "Avbryt" -#: ../gcr/gcr-subject-public-key.c:405 +#: gcr/gcr-ssh-askpass.c:194 +msgid "Enter your OpenSSH passphrase" +msgstr "Oppgi passordfrase for OpenSSH" + +#: gcr/gcr-subject-public-key.c:405 msgid "Unrecognized or unavailable attributes for key" msgstr "Ikke gjenkjent eller utilgjengelige attributter for nøkkel" -#: ../gcr/gcr-subject-public-key.c:491 ../gcr/gcr-subject-public-key.c:577 +#: gcr/gcr-subject-public-key.c:491 gcr/gcr-subject-public-key.c:577 msgid "Couldn’t build public key" msgstr "Klarte ikke å bygge offentlig nøkkel" -#: ../gcr/gcr-system-prompt.c:911 +#: gcr/gcr-system-prompt.c:912 msgid "Another prompt is already in progress" msgstr "En annen dialog er allerede i gang" #. Translators: A pinned certificate is an exception which #. trusts a given certificate explicitly for a purpose and #. communication with a certain peer. -#: ../gcr/gcr-trust.c:364 -#, c-format +#: gcr/gcr-trust.c:364 msgid "Couldn’t find a place to store the pinned certificate" msgstr "Klarte ikke å finne en plass å lagre festet sertifikat" -#: ../ui/gcr-certificate-renderer.c:117 +#: ui/gcr-certificate-renderer.c:118 msgid "Basic Constraints" msgstr "Grunnleggende begrensninger" -#: ../ui/gcr-certificate-renderer.c:119 +#: ui/gcr-certificate-renderer.c:120 msgid "Certificate Authority" msgstr "Sertifikatautoritet" -#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:958 msgid "Yes" msgstr "Ja" -#: ../ui/gcr-certificate-renderer.c:120 ../ui/gcr-certificate-renderer.c:952 +#: ui/gcr-certificate-renderer.c:121 ui/gcr-certificate-renderer.c:958 msgid "No" msgstr "Nei" -#: ../ui/gcr-certificate-renderer.c:123 +#: ui/gcr-certificate-renderer.c:124 msgid "Max Path Length" msgstr "Maksimal lengde på sti" -#: ../ui/gcr-certificate-renderer.c:124 +#: ui/gcr-certificate-renderer.c:125 msgid "Unlimited" msgstr "Ubegrenset" -#: ../ui/gcr-certificate-renderer.c:143 +#: ui/gcr-certificate-renderer.c:144 msgid "Extended Key Usage" msgstr "Utvidet bruk av nøkkel" -#: ../ui/gcr-certificate-renderer.c:154 +#: ui/gcr-certificate-renderer.c:155 msgid "Allowed Purposes" msgstr "Tillatte formål" -#: ../ui/gcr-certificate-renderer.c:174 +#: ui/gcr-certificate-renderer.c:175 msgid "Subject Key Identifier" msgstr "Identifikator for subjektnøkkel" -#: ../ui/gcr-certificate-renderer.c:175 +#: ui/gcr-certificate-renderer.c:176 msgid "Key Identifier" msgstr "Identifikator for nøkkel" -#: ../ui/gcr-certificate-renderer.c:186 +#: ui/gcr-certificate-renderer.c:187 msgid "Digital signature" msgstr "Digital signatur" -#: ../ui/gcr-certificate-renderer.c:187 +#: ui/gcr-certificate-renderer.c:188 +msgid "Non repudiation" +msgstr "Ikke avvisning" + +#: ui/gcr-certificate-renderer.c:189 msgid "Key encipherment" msgstr "Metode for kryptering av nøkkel" -#: ../ui/gcr-certificate-renderer.c:188 +#: ui/gcr-certificate-renderer.c:190 msgid "Data encipherment" msgstr "Metode for kryptering av data" -#: ../ui/gcr-certificate-renderer.c:189 +#: ui/gcr-certificate-renderer.c:191 msgid "Key agreement" msgstr "Nøkkelavtale" -#: ../ui/gcr-certificate-renderer.c:190 +#: ui/gcr-certificate-renderer.c:192 msgid "Certificate signature" msgstr "Sertifikatsignatur" -#: ../ui/gcr-certificate-renderer.c:191 +#: ui/gcr-certificate-renderer.c:193 msgid "Revocation list signature" msgstr "Signatur for tilbaketrekkingsliste" -#: ../ui/gcr-certificate-renderer.c:216 +#: ui/gcr-certificate-renderer.c:194 +msgid "Encipher only" +msgstr "Kun kryptering" + +#: ui/gcr-certificate-renderer.c:195 +msgid "Decipher only" +msgstr "Kun dekryptering" + +#: ui/gcr-certificate-renderer.c:220 msgid "Key Usage" msgstr "Bruk av nøkkel" -#: ../ui/gcr-certificate-renderer.c:217 +#: ui/gcr-certificate-renderer.c:221 msgid "Usages" msgstr "Bruksområder" -#: ../ui/gcr-certificate-renderer.c:237 +#: ui/gcr-certificate-renderer.c:241 msgid "Subject Alternative Names" msgstr "Alternative navn på subjekt" -#: ../ui/gcr-certificate-renderer.c:264 +#: ui/gcr-certificate-renderer.c:268 msgid "Extension" msgstr "Utvidelse" -#: ../ui/gcr-certificate-renderer.c:268 +#: ui/gcr-certificate-renderer.c:272 msgid "Identifier" msgstr "Identifikator" -#: ../ui/gcr-certificate-renderer.c:269 -#: ../ui/gcr-certificate-request-renderer.c:269 ../ui/gcr-gnupg-renderer.c:412 -#: ../ui/gcr-gnupg-renderer.c:429 +#: ui/gcr-certificate-renderer.c:273 ui/gcr-certificate-request-renderer.c:268 +#: ui/gcr-gnupg-renderer.c:414 ui/gcr-gnupg-renderer.c:431 msgid "Value" msgstr "Verdi" -#: ../ui/gcr-certificate-renderer.c:287 +#: ui/gcr-certificate-renderer.c:291 msgid "Couldn’t export the certificate." msgstr "Klarte ikke å eksportere sertifikatet." -#: ../ui/gcr-certificate-renderer.c:521 -#: ../ui/gcr-certificate-request-renderer.c:310 +#: ui/gcr-certificate-renderer.c:527 ui/gcr-certificate-request-renderer.c:309 msgid "Identity" msgstr "Identitet" -#: ../ui/gcr-certificate-renderer.c:525 +#: ui/gcr-certificate-renderer.c:531 msgid "Verified by" msgstr "Verifisert av" -#: ../ui/gcr-certificate-renderer.c:532 ../ui/gcr-gnupg-renderer.c:717 +#: ui/gcr-certificate-renderer.c:538 ui/gcr-gnupg-renderer.c:719 msgid "Expires" msgstr "Utløper" #. The subject -#: ../ui/gcr-certificate-renderer.c:539 -#: ../ui/gcr-certificate-request-renderer.c:316 +#: ui/gcr-certificate-renderer.c:545 ui/gcr-certificate-request-renderer.c:315 msgid "Subject Name" msgstr "Navn på subjekt" #. The Issuer -#: ../ui/gcr-certificate-renderer.c:544 +#: ui/gcr-certificate-renderer.c:550 msgid "Issuer Name" msgstr "Navn på utsteder" #. The Issued Parameters -#: ../ui/gcr-certificate-renderer.c:549 +#: ui/gcr-certificate-renderer.c:555 msgid "Issued Certificate" msgstr "Utstedt sertifikat" -#: ../ui/gcr-certificate-renderer.c:554 -#: ../ui/gcr-certificate-request-renderer.c:327 +#: ui/gcr-certificate-renderer.c:560 ui/gcr-certificate-request-renderer.c:326 msgid "Version" msgstr "Versjon" -#: ../ui/gcr-certificate-renderer.c:568 +#: ui/gcr-certificate-renderer.c:574 msgid "Not Valid Before" msgstr "Ikke gyldig før" -#: ../ui/gcr-certificate-renderer.c:573 +#: ui/gcr-certificate-renderer.c:579 msgid "Not Valid After" msgstr "Ikke gyldig etter" #. Fingerprints -#: ../ui/gcr-certificate-renderer.c:578 +#: ui/gcr-certificate-renderer.c:584 msgid "Certificate Fingerprints" msgstr "Fingeravtrykk for sertifikat" #. Public Key Info -#: ../ui/gcr-certificate-renderer.c:584 -#: ../ui/gcr-certificate-request-renderer.c:330 -#: ../ui/gcr-certificate-request-renderer.c:376 +#: ui/gcr-certificate-renderer.c:590 ui/gcr-certificate-request-renderer.c:329 +#: ui/gcr-certificate-request-renderer.c:375 msgid "Public Key Info" msgstr "Informasjon om offentlig nøkkel" #. Signature -#: ../ui/gcr-certificate-renderer.c:599 ../ui/gcr-certificate-renderer.c:909 -#: ../ui/gcr-certificate-request-renderer.c:346 -#: ../ui/gcr-certificate-request-renderer.c:383 ../ui/gcr-gnupg-renderer.c:558 +#: ui/gcr-certificate-renderer.c:605 ui/gcr-certificate-renderer.c:915 +#: ui/gcr-certificate-request-renderer.c:345 +#: ui/gcr-certificate-request-renderer.c:382 ui/gcr-gnupg-renderer.c:560 msgid "Signature" msgstr "Signatur" -#: ../ui/gcr-certificate-renderer.c:616 +#: ui/gcr-certificate-renderer.c:622 msgid "Export Certificate…" msgstr "Eksporter sertifikat …" -#: ../ui/gcr-certificate-renderer.c:855 +#: ui/gcr-certificate-renderer.c:861 msgid "Key Algorithm" msgstr "Algoritme for nøkkel" -#: ../ui/gcr-certificate-renderer.c:860 +#: ui/gcr-certificate-renderer.c:866 msgid "Key Parameters" msgstr "Nøkkelparametere" -#: ../ui/gcr-certificate-renderer.c:868 ../ui/gcr-gnupg-renderer.c:351 +#: ui/gcr-certificate-renderer.c:874 ui/gcr-gnupg-renderer.c:353 msgid "Key Size" msgstr "Størrelse på nøkkel" -#: ../ui/gcr-certificate-renderer.c:876 +#: ui/gcr-certificate-renderer.c:882 msgid "Key SHA1 Fingerprint" msgstr "SHA1-fingeravtrykk for nøkkel" -#: ../ui/gcr-certificate-renderer.c:898 +#: ui/gcr-certificate-renderer.c:904 msgid "Signature Algorithm" msgstr "Algoritme for signatur" -#: ../ui/gcr-certificate-renderer.c:902 +#: ui/gcr-certificate-renderer.c:908 msgid "Signature Parameters" msgstr "Parametere for signatur" -#: ../ui/gcr-certificate-renderer.c:951 +#: ui/gcr-certificate-renderer.c:957 msgid "Critical" msgstr "Kritisk" #. The certificate request type -#: ../ui/gcr-certificate-request-renderer.c:94 -#: ../ui/gcr-certificate-request-renderer.c:305 -#: ../ui/gcr-certificate-request-renderer.c:320 -#: ../ui/gcr-certificate-request-renderer.c:363 -#: ../ui/gcr-certificate-request-renderer.c:368 +#: ui/gcr-certificate-request-renderer.c:95 +#: ui/gcr-certificate-request-renderer.c:304 +#: ui/gcr-certificate-request-renderer.c:319 +#: ui/gcr-certificate-request-renderer.c:362 +#: ui/gcr-certificate-request-renderer.c:367 msgid "Certificate request" msgstr "Sertifikatforespørsel" -#: ../ui/gcr-certificate-request-renderer.c:258 +#: ui/gcr-certificate-request-renderer.c:257 msgid "Attribute" msgstr "Attributt" -#: ../ui/gcr-certificate-request-renderer.c:262 -#: ../ui/gcr-certificate-request-renderer.c:321 -#: ../ui/gcr-certificate-request-renderer.c:369 ../ui/gcr-gnupg-renderer.c:589 -#: ../ui/gcr-gnupg-renderer.c:591 +#: ui/gcr-certificate-request-renderer.c:261 +#: ui/gcr-certificate-request-renderer.c:320 +#: ui/gcr-certificate-request-renderer.c:368 ui/gcr-gnupg-renderer.c:591 +#: ui/gcr-gnupg-renderer.c:593 msgid "Type" msgstr "Type" -#: ../ui/gcr-certificate-request-renderer.c:373 +#: ui/gcr-certificate-request-renderer.c:372 msgid "Challenge" msgstr "Utfordring" -#: ../ui/gcr-display-view.c:319 +#: ui/gcr-display-view.c:298 msgid "_Details" msgstr "_Detaljer" -#: ../ui/gcr-failure-renderer.c:159 +#: ui/gcr-failure-renderer.c:159 #, c-format msgid "Could not display “%s”" msgstr "Kunne ikke vise «%s»" -#: ../ui/gcr-failure-renderer.c:161 +#: ui/gcr-failure-renderer.c:161 msgid "Could not display file" msgstr "Kunne ikke vise fil" -#: ../ui/gcr-failure-renderer.c:166 +#: ui/gcr-failure-renderer.c:166 msgid "Reason" msgstr "Årsak" -#: ../ui/gcr-failure-renderer.c:216 -#, c-format +#: ui/gcr-failure-renderer.c:216 msgid "Cannot display a file of this type." msgstr "Kan ikke vise en fil av denne typen." -#: ../ui/gcr-gnupg-renderer.c:201 +#: ui/gcr-gnupg-renderer.c:203 msgid "Elgamal" msgstr "Elgamal" -#: ../ui/gcr-gnupg-renderer.c:214 +#: ui/gcr-gnupg-renderer.c:216 msgid "Encrypt" msgstr "Krypter" -#: ../ui/gcr-gnupg-renderer.c:216 +#: ui/gcr-gnupg-renderer.c:218 msgid "Sign" msgstr "Signer" -#: ../ui/gcr-gnupg-renderer.c:218 +#: ui/gcr-gnupg-renderer.c:220 msgid "Certify" msgstr "Sertifiser" -#: ../ui/gcr-gnupg-renderer.c:220 +#: ui/gcr-gnupg-renderer.c:222 msgid "Authenticate" msgstr "Autentiser" -#: ../ui/gcr-gnupg-renderer.c:222 +#: ui/gcr-gnupg-renderer.c:224 msgctxt "capability" msgid "Disabled" msgstr "Slått av" -#: ../ui/gcr-gnupg-renderer.c:253 ../ui/gcr-gnupg-renderer.c:412 -#: ../ui/gcr-key-renderer.c:391 ../ui/gcr-key-renderer.c:395 +#: ui/gcr-gnupg-renderer.c:255 ui/gcr-gnupg-renderer.c:414 +#: ui/gcr-key-renderer.c:391 ui/gcr-key-renderer.c:395 msgid "Unknown" msgstr "Ukjent" -#: ../ui/gcr-gnupg-renderer.c:255 +#: ui/gcr-gnupg-renderer.c:257 msgid "Invalid" msgstr "Ugyldig" -#: ../ui/gcr-gnupg-renderer.c:257 +#: ui/gcr-gnupg-renderer.c:259 msgctxt "ownertrust" msgid "Disabled" msgstr "Slått av" -#: ../ui/gcr-gnupg-renderer.c:259 +#: ui/gcr-gnupg-renderer.c:261 msgid "Revoked" msgstr "Trukket tilbake" -#: ../ui/gcr-gnupg-renderer.c:261 +#: ui/gcr-gnupg-renderer.c:263 msgid "Expired" msgstr "Utløpt" -#: ../ui/gcr-gnupg-renderer.c:263 +#: ui/gcr-gnupg-renderer.c:265 msgid "Undefined trust" msgstr "Udefinert tillitsforhold" -#: ../ui/gcr-gnupg-renderer.c:265 +#: ui/gcr-gnupg-renderer.c:267 msgid "Distrusted" msgstr "Uten tillit" -#: ../ui/gcr-gnupg-renderer.c:267 +#: ui/gcr-gnupg-renderer.c:269 msgid "Marginally trusted" msgstr "Marginal tillit" -#: ../ui/gcr-gnupg-renderer.c:269 +#: ui/gcr-gnupg-renderer.c:271 msgid "Fully trusted" msgstr "Full tillit" -#: ../ui/gcr-gnupg-renderer.c:271 +#: ui/gcr-gnupg-renderer.c:273 msgid "Ultimately trusted" msgstr "Absolutt tillit" -#: ../ui/gcr-gnupg-renderer.c:285 +#: ui/gcr-gnupg-renderer.c:287 msgid "The information in this key has not yet been verified" msgstr "Informasjonen i denne nøkkelen er ikke verifisert ennå" -#: ../ui/gcr-gnupg-renderer.c:288 +#: ui/gcr-gnupg-renderer.c:290 msgid "This key is invalid" msgstr "Denne nøkkelen er ugyldig" -#: ../ui/gcr-gnupg-renderer.c:291 +#: ui/gcr-gnupg-renderer.c:293 msgid "This key has been disabled" msgstr "Denne nøkkelen er deaktivert" -#: ../ui/gcr-gnupg-renderer.c:294 +#: ui/gcr-gnupg-renderer.c:296 msgid "This key has been revoked" msgstr "Denne nøkkelen er trukket tilbake" -#: ../ui/gcr-gnupg-renderer.c:297 +#: ui/gcr-gnupg-renderer.c:299 msgid "This key has expired" msgstr "Denne nøkkelen er utløpt" -#: ../ui/gcr-gnupg-renderer.c:302 +#: ui/gcr-gnupg-renderer.c:304 msgid "This key is distrusted" msgstr "Stoler ikke på denne nøkkelen" -#: ../ui/gcr-gnupg-renderer.c:305 +#: ui/gcr-gnupg-renderer.c:307 msgid "This key is marginally trusted" msgstr "Stoler marginalt på denne nøkkelen" -#: ../ui/gcr-gnupg-renderer.c:308 +#: ui/gcr-gnupg-renderer.c:310 msgid "This key is fully trusted" msgstr "Stoler på denne nøkkelen" -#: ../ui/gcr-gnupg-renderer.c:311 +#: ui/gcr-gnupg-renderer.c:313 msgid "This key is ultimately trusted" msgstr "Stoler helt og fullt på denne nøkkelen" -#: ../ui/gcr-gnupg-renderer.c:336 ../ui/gcr-gnupg-renderer.c:562 +#: ui/gcr-gnupg-renderer.c:338 ui/gcr-gnupg-renderer.c:564 msgid "Key ID" msgstr "Nøkkel-ID" -#: ../ui/gcr-gnupg-renderer.c:344 ../ui/gcr-gnupg-renderer.c:570 -#: ../ui/gcr-gnupg-renderer.c:617 ../ui/gcr-key-renderer.c:392 +#: ui/gcr-gnupg-renderer.c:346 ui/gcr-gnupg-renderer.c:572 +#: ui/gcr-gnupg-renderer.c:619 ui/gcr-key-renderer.c:392 msgid "Algorithm" msgstr "Algoritme" -#: ../ui/gcr-gnupg-renderer.c:359 ../ui/gcr-gnupg-renderer.c:436 -#: ../ui/gcr-gnupg-renderer.c:479 +#: ui/gcr-gnupg-renderer.c:361 ui/gcr-gnupg-renderer.c:438 +#: ui/gcr-gnupg-renderer.c:481 msgid "Created" msgstr "Laget" -#: ../ui/gcr-gnupg-renderer.c:368 ../ui/gcr-gnupg-renderer.c:445 -#: ../ui/gcr-gnupg-renderer.c:488 +#: ui/gcr-gnupg-renderer.c:370 ui/gcr-gnupg-renderer.c:447 +#: ui/gcr-gnupg-renderer.c:490 msgid "Expiry" msgstr "Utløper" -#: ../ui/gcr-gnupg-renderer.c:377 +#: ui/gcr-gnupg-renderer.c:379 msgid "Capabilities" msgstr "Evner" -#: ../ui/gcr-gnupg-renderer.c:390 +#: ui/gcr-gnupg-renderer.c:392 msgid "Owner trust" msgstr "Tillitsforhold til eier" -#: ../ui/gcr-gnupg-renderer.c:418 +#: ui/gcr-gnupg-renderer.c:420 msgid "Name" msgstr "Navn" -#: ../ui/gcr-gnupg-renderer.c:424 ../ui/gcr-gnupg-renderer.c:706 +#: ui/gcr-gnupg-renderer.c:426 ui/gcr-gnupg-renderer.c:708 msgid "Comment" msgstr "Kommentar" -#: ../ui/gcr-gnupg-renderer.c:464 +#: ui/gcr-gnupg-renderer.c:466 msgid "User Attribute" msgstr "Brukerattributt" -#: ../ui/gcr-gnupg-renderer.c:471 ../ui/gcr-key-renderer.c:398 +#: ui/gcr-gnupg-renderer.c:473 ui/gcr-key-renderer.c:398 msgid "Size" msgstr "Størrelse" -#: ../ui/gcr-gnupg-renderer.c:506 +#: ui/gcr-gnupg-renderer.c:508 msgid "Signature of a binary document" msgstr "Signatur for et binært dokument" -#: ../ui/gcr-gnupg-renderer.c:508 +#: ui/gcr-gnupg-renderer.c:510 msgid "Signature of a canonical text document" msgstr "Signatur på et tekstdokument" -#: ../ui/gcr-gnupg-renderer.c:510 +#: ui/gcr-gnupg-renderer.c:512 msgid "Standalone signature" msgstr "Frittstående signatur" -#: ../ui/gcr-gnupg-renderer.c:512 +#: ui/gcr-gnupg-renderer.c:514 msgid "Generic certification of key" msgstr "Generisk sertifisering av nøkkel" -#: ../ui/gcr-gnupg-renderer.c:514 +#: ui/gcr-gnupg-renderer.c:516 msgid "Persona certification of key" msgstr "Persona sertifisering av nøkkel" -#: ../ui/gcr-gnupg-renderer.c:516 +#: ui/gcr-gnupg-renderer.c:518 msgid "Casual certification of key" msgstr "Tilfeldig sertifisering av nøkkel" -#: ../ui/gcr-gnupg-renderer.c:518 +#: ui/gcr-gnupg-renderer.c:520 msgid "Positive certification of key" msgstr "Positiv sertifisering av nøkkel" -#: ../ui/gcr-gnupg-renderer.c:520 +#: ui/gcr-gnupg-renderer.c:522 msgid "Subkey binding signature" msgstr "Bindende signatur med undernøkkel" -#: ../ui/gcr-gnupg-renderer.c:522 +#: ui/gcr-gnupg-renderer.c:524 msgid "Primary key binding signature" msgstr "Bindende signatur med primærnøkkel" -#: ../ui/gcr-gnupg-renderer.c:524 +#: ui/gcr-gnupg-renderer.c:526 msgid "Signature directly on key" msgstr "Signatur direkte på nøkkelen" -#: ../ui/gcr-gnupg-renderer.c:526 +#: ui/gcr-gnupg-renderer.c:528 msgid "Key revocation signature" msgstr "Signatur for tilbaketrekkings av nøkkel" -#: ../ui/gcr-gnupg-renderer.c:528 +#: ui/gcr-gnupg-renderer.c:530 msgid "Subkey revocation signature" msgstr "Signatur for tilbaketrekking av undernøkkel" -#: ../ui/gcr-gnupg-renderer.c:530 +#: ui/gcr-gnupg-renderer.c:532 msgid "Certification revocation signature" msgstr "Signatur for tilbaketrekking av sertifisering" -#: ../ui/gcr-gnupg-renderer.c:532 +#: ui/gcr-gnupg-renderer.c:534 msgid "Timestamp signature" msgstr "Signatur for tidsstempel" -#: ../ui/gcr-gnupg-renderer.c:534 +#: ui/gcr-gnupg-renderer.c:536 msgid "Third-party confirmation signature" msgstr "Signatur for tredjeparts bekreftelse" -#: ../ui/gcr-gnupg-renderer.c:587 ../ui/gcr-gnupg-renderer.c:595 +#: ui/gcr-gnupg-renderer.c:589 ui/gcr-gnupg-renderer.c:597 msgid "Class" msgstr "Klasse" -#: ../ui/gcr-gnupg-renderer.c:589 +#: ui/gcr-gnupg-renderer.c:591 msgid "Local only" msgstr "Kun lokal" -#: ../ui/gcr-gnupg-renderer.c:591 +#: ui/gcr-gnupg-renderer.c:593 msgid "Exportable" msgstr "Eksporterbar" -#: ../ui/gcr-gnupg-renderer.c:609 +#: ui/gcr-gnupg-renderer.c:611 msgid "Revocation Key" msgstr "Nøkkel for tilbaketrekking" -#: ../ui/gcr-gnupg-renderer.c:623 ../ui/gcr-gnupg-renderer.c:647 -#: ../ui/gcr-gnupg-renderer.c:649 +#: ui/gcr-gnupg-renderer.c:625 ui/gcr-gnupg-renderer.c:649 +#: ui/gcr-gnupg-renderer.c:651 msgid "Fingerprint" msgstr "Fingeravtrykk" -#: ../ui/gcr-gnupg-renderer.c:738 +#: ui/gcr-gnupg-renderer.c:740 msgid "Public Subkey" msgstr "Offentlig undernøkkel" -#: ../ui/gcr-gnupg-renderer.c:740 +#: ui/gcr-gnupg-renderer.c:742 msgid "Secret Key" msgstr "Hemmelig nøkkel" -#: ../ui/gcr-gnupg-renderer.c:742 +#: ui/gcr-gnupg-renderer.c:744 msgid "Secret Subkey" msgstr "Hemmelig undernøkkel" -#: ../ui/gcr-import-button.c:116 +#: ui/gcr-import-button.c:116 msgid "Initializing…" msgstr "Initierer …" -#: ../ui/gcr-import-button.c:124 +#: ui/gcr-import-button.c:124 msgid "Import is in progress…" msgstr "Import pågår …" -#: ../ui/gcr-import-button.c:131 +#: ui/gcr-import-button.c:131 #, c-format msgid "Imported to: %s" msgstr "Importert til: %s" -#: ../ui/gcr-import-button.c:151 +#: ui/gcr-import-button.c:151 #, c-format msgid "Import to: %s" msgstr "Importer til: %s" -#: ../ui/gcr-import-button.c:164 +#: ui/gcr-import-button.c:164 msgid "Cannot import because there are no compatible importers" msgstr "Kan ikke importere fordi det finnes ingen kompatible importerere" -#: ../ui/gcr-import-button.c:173 +#: ui/gcr-import-button.c:173 msgid "No data to import" msgstr "Ingen data å importere" -#: ../ui/gcr-key-renderer.c:88 +#: ui/gcr-key-renderer.c:89 msgid "Key" msgstr "Nøkkel" -#: ../ui/gcr-key-renderer.c:355 +#: ui/gcr-key-renderer.c:355 msgid "Private RSA Key" msgstr "Privat RSA-nøkkel" -#: ../ui/gcr-key-renderer.c:357 +#: ui/gcr-key-renderer.c:357 msgid "Private DSA Key" msgstr "Privat DSA-nøkkel" -#: ../ui/gcr-key-renderer.c:359 +#: ui/gcr-key-renderer.c:359 msgid "Private Elliptic Curve Key" msgstr "Privat eliptisk kurve nøkkel" -#: ../ui/gcr-key-renderer.c:364 ../ui/gcr-key-renderer.c:366 +#: ui/gcr-key-renderer.c:364 ui/gcr-key-renderer.c:366 msgid "Public DSA Key" msgstr "Offentlig DSA-nøkkel" -#: ../ui/gcr-key-renderer.c:368 +#: ui/gcr-key-renderer.c:368 msgid "Public Elliptic Curve Key" msgstr "Offentlig eliptisk kurve nøkkel" -#: ../ui/gcr-key-renderer.c:377 +#: ui/gcr-key-renderer.c:377 #, c-format msgid "%u bit" msgid_plural "%u bits" msgstr[0] "%u bit" msgstr[1] "%u bits" -#: ../ui/gcr-key-renderer.c:378 +#: ui/gcr-key-renderer.c:378 msgid "Strength" msgstr "Styrke" #. Fingerprints -#: ../ui/gcr-key-renderer.c:402 +#: ui/gcr-key-renderer.c:402 msgid "Fingerprints" msgstr "Fingeravtrykk" -#: ../ui/gcr-key-renderer.c:406 +#: ui/gcr-key-renderer.c:406 msgid "SHA1" msgstr "SHA1" -#: ../ui/gcr-key-renderer.c:411 +#: ui/gcr-key-renderer.c:411 msgid "SHA256" msgstr "SHA256" #. Add our various buttons -#: ../ui/gcr-pkcs11-import-dialog.c:114 ../ui/gcr-prompt-dialog.c:500 -#: ../ui/gcr-certificate-exporter.c:228 ../ui/gcr-certificate-exporter.c:305 +#: ui/gcr-pkcs11-import-dialog.c:104 ui/gcr-prompt-dialog.c:556 +#: ui/gcr-certificate-exporter.c:229 ui/gcr-certificate-exporter.c:306 msgid "_Cancel" msgstr "A_vbryt" -#: ../ui/gcr-pkcs11-import-dialog.c:116 ../ui/gcr-prompt-dialog.c:503 +#: ui/gcr-pkcs11-import-dialog.c:106 ui/gcr-prompt-dialog.c:559 msgid "_OK" msgstr "_OK" -#: ../ui/gcr-pkcs11-import-dialog.c:189 +#: ui/gcr-pkcs11-import-dialog.c:179 msgid "Automatically chosen" msgstr "Automatisk valgt" -#: ../ui/gcr-pkcs11-import-dialog.c:273 -#: ../ui/gcr-pkcs11-import-interaction.c:152 -#: ../ui/gcr-pkcs11-import-interaction.c:170 -#, c-format +#: ui/gcr-pkcs11-import-dialog.c:263 ui/gcr-pkcs11-import-interaction.c:142 +#: ui/gcr-pkcs11-import-interaction.c:160 msgid "The user cancelled the operation" msgstr "Bruker avbrøt operasjonen" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:1 +#: ui/gcr-pkcs11-import-dialog.ui:31 msgid "In order to import, please enter the password." msgstr "Vennligst oppgi passordet for å importere." #. The password label -#: ../ui/gcr-pkcs11-import-dialog.ui.h:2 ../ui/gcr-prompt-dialog.c:561 +#: ui/gcr-pkcs11-import-dialog.ui:66 ui/gcr-prompt-dialog.c:617 msgid "Password:" msgstr "Passord:" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:3 +#: ui/gcr-pkcs11-import-dialog.ui:80 msgid "Token:" msgstr "Tegn:" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:4 ../ui/gcr-unlock-renderer.c:69 -#: ../ui/gcr-unlock-renderer.c:124 +#: ui/gcr-pkcs11-import-dialog.ui:143 ui/gcr-unlock-renderer.c:70 +#: ui/gcr-unlock-renderer.c:124 msgid "Unlock" msgstr "Lås opp" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:5 +#: ui/gcr-pkcs11-import-dialog.ui:178 msgid "Label:" msgstr "Etikett:" -#: ../ui/gcr-pkcs11-import-dialog.ui.h:6 +#: ui/gcr-pkcs11-import-dialog.ui:233 msgid "Import settings" msgstr "Innstillinger for import" #. The confirm label -#: ../ui/gcr-prompt-dialog.c:578 +#: ui/gcr-prompt-dialog.c:634 msgid "Confirm:" msgstr "Bekreft:" -#: ../ui/gcr-prompt-dialog.c:646 +#: ui/gcr-prompt-dialog.c:702 msgid "Passwords do not match." msgstr "Passordene er ikke like." -#: ../ui/gcr-prompt-dialog.c:653 +#: ui/gcr-prompt-dialog.c:709 msgid "Password cannot be blank" msgstr "Passordet kan ikke være tomt" -#: ../ui/gcr-prompter.desktop.in.in.h:1 +#: ui/gcr-prompter.desktop.in.in:3 msgid "Access Prompt" msgstr "Tilgangsdialog" -#: ../ui/gcr-prompter.desktop.in.in.h:2 +#: ui/gcr-prompter.desktop.in.in:4 msgid "Unlock access to passwords and other secrets" msgstr "Lås opp tilgang til passord og andre hemmeligheter" -#: ../ui/gcr-certificate-exporter.c:225 +#: ui/gcr-certificate-exporter.c:226 msgid "A file already exists with this name." msgstr "En fil med dette navnet eksisterer allerede." -#: ../ui/gcr-certificate-exporter.c:226 +#: ui/gcr-certificate-exporter.c:227 msgid "Do you want to replace it with a new file?" msgstr "Vil du erstatte den med en ny fil?" -#: ../ui/gcr-certificate-exporter.c:229 +#: ui/gcr-certificate-exporter.c:230 msgid "_Replace" msgstr "E_rstatt" -#: ../ui/gcr-certificate-exporter.c:259 -#, c-format +#: ui/gcr-certificate-exporter.c:260 msgid "The operation was cancelled." msgstr "Operasjonen ble avbrutt." -#: ../ui/gcr-certificate-exporter.c:303 +#: ui/gcr-certificate-exporter.c:304 msgid "Export certificate" msgstr "Eksporter sertifikat" -#: ../ui/gcr-certificate-exporter.c:306 +#: ui/gcr-certificate-exporter.c:307 msgid "_Save" msgstr "_Lagre" -#: ../ui/gcr-certificate-exporter.c:315 +#: ui/gcr-certificate-exporter.c:316 msgid "Certificate files" msgstr "Sertifikatfiler" -#: ../ui/gcr-certificate-exporter.c:326 +#: ui/gcr-certificate-exporter.c:327 msgid "PEM files" msgstr "PEM-filer" -#: ../ui/gcr-unlock-options-widget.ui.h:1 +#: ui/gcr-unlock-options-widget.ui:16 msgid "Automatically unlock this keyring whenever I’m logged in" msgstr "Lås opp denne nøkkelringen automatisk når jeg er logget inn" -#: ../ui/gcr-unlock-options-widget.ui.h:2 +#: ui/gcr-unlock-options-widget.ui:31 msgid "Lock this keyring when I log out" msgstr "Lås denne nøkkelringen når jeg logger ut" -#: ../ui/gcr-unlock-options-widget.ui.h:3 +#: ui/gcr-unlock-options-widget.ui:53 msgid "Lock this keyring after" msgstr "Lås denne nøkkelringen etter" -#: ../ui/gcr-unlock-options-widget.ui.h:4 +#: ui/gcr-unlock-options-widget.ui:67 msgid "Lock this keyring if idle for" msgstr "Lås denne nøkkelringen hvis inaktiv i" -#. Translators: The -#: ../ui/gcr-unlock-options-widget.ui.h:6 +#. Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'. +#: ui/gcr-unlock-options-widget.ui:103 msgid "minutes" msgstr "minutter" -#: ../ui/gcr-unlock-renderer.c:67 +#: ui/gcr-unlock-renderer.c:68 #, c-format msgid "Unlock: %s" msgstr "Lås opp: %s" -#: ../ui/gcr-unlock-renderer.c:122 +#: ui/gcr-unlock-renderer.c:122 msgid "Password" msgstr "Passord" -#: ../ui/gcr-unlock-renderer.c:274 +#: ui/gcr-unlock-renderer.c:274 #, c-format msgid "" "The contents of “%s” are locked. In order to view the contents, enter the " @@ -1074,48 +1115,52 @@ msgstr "" "Innholdet i «%s» er låst. Du må oppgi korrekt passord for å vise innholdet." -#: ../ui/gcr-unlock-renderer.c:277 +#: ui/gcr-unlock-renderer.c:277 msgid "" "The contents are locked. In order to view the contents, enter the correct " "password." msgstr "Innholdet er låst. Du må oppgi korrekt passord for å vise innholdet." -#: ../ui/gcr-viewer-tool.c:40 +#: ui/gcr-viewer.desktop.in.in:3 +msgid "View file" +msgstr "Vis fil" + +#: ui/gcr-viewer-tool.c:40 msgid "GCR Certificate and Key Viewer" msgstr "Visning av GCR-sertifikat og nøkkel" -#: ../ui/gcr-viewer-tool.c:47 +#: ui/gcr-viewer-tool.c:47 msgid "Show the application's version" msgstr "Vis programmets versjon" -#: ../ui/gcr-viewer-tool.c:49 +#: ui/gcr-viewer-tool.c:49 msgid "[file...]" msgstr "[fil …]" -#: ../ui/gcr-viewer-tool.c:100 +#: ui/gcr-viewer-tool.c:100 msgid "- View certificate and key files" msgstr "- Vis sertifikat- og nøkkelfiler" -#: ../ui/gcr-viewer-tool.c:114 ../ui/gcr-viewer-widget.c:684 +#: ui/gcr-viewer-tool.c:114 ui/gcr-viewer-widget.c:669 msgid "Certificate Viewer" msgstr "Sertifikatvisning" -#: ../ui/gcr-viewer-widget.c:202 +#: ui/gcr-viewer-widget.c:189 msgid "The password was incorrect" msgstr "Passordet var feil" -#: ../ui/gcr-viewer-window.c:75 +#: ui/gcr-viewer-window.c:74 msgid "Imported" msgstr "Importert" -#: ../ui/gcr-viewer-window.c:79 +#: ui/gcr-viewer-window.c:78 msgid "Import failed" msgstr "Import feilet" -#: ../ui/gcr-viewer-window.c:106 +#: ui/gcr-viewer-window.c:105 msgid "Import" msgstr "Importer" -#: ../ui/gcr-viewer-window.c:115 +#: ui/gcr-viewer-window.c:114 msgid "_Close" msgstr "L_ukk" diff -Nru gcr-3.38.1/README gcr-3.40.0/README --- gcr-3.38.1/README 2021-01-12 22:55:54.636056000 +0000 +++ gcr-3.40.0/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -GCR is a library for displaying certificates, and crypto UI, accessing -key stores. It also provides the viewer for crypto files on the GNOME -desktop. - -GCK is a library for accessing PKCS#11 modules like smart cards, in a -(G)object oriented way. - - -DEBUG TRACING -============== - -The Gcr and Gck libraries contain statements which help debug flow -and logic. In many cases these help you track down problems. - -Use the environment variable G_MESSAGES_DEBUG='all' or G_MESSAGES_DEBUG='xxx' -to display either all messages or a specific categories of debug messages. You -can separate categories in this list with spaces, commas or semicolons. Gcr -library uses category 'Gcr', while Gck library uses category 'Gck'. - -Example to display all debug messages: - - $ G_MESSAGES_DEBUG=all gcr-viewer /path/to/certificate.crt - (gcr-viewer:9418): Gcr-DEBUG: gcr_pkcs11_initialize_async: starting initialize of registered modules - ... - -Example to display debug messages for a specific category: - - $ G_MESSAGES_DEBUG="Gcr" gcr-viewer /path/to/certificate.crt - (gcr-viewer:9503): Gcr-DEBUG: gcr_pkcs11_initialize_async: starting initialize of registered modules - ... - -For the Gck debug messages simply replace 'Gcr' with 'Gck' in the above -examples. diff -Nru gcr-3.38.1/README.md gcr-3.40.0/README.md --- gcr-3.38.1/README.md 1970-01-01 00:00:00.000000000 +0000 +++ gcr-3.40.0/README.md 2021-03-27 08:40:56.289531500 +0000 @@ -0,0 +1,60 @@ +GCR +=== +GCR is a library for displaying certificates and crypto UI, accessing +key stores. It also provides the viewer for crypto files on the GNOME +desktop. + +GCK is a library for accessing PKCS#11 modules like smart cards, in a +(G)object oriented way. + +Building +-------- + +You can build GCR using [Meson] with the following build commands (replace +`$BUILDDIR` with your chosed build directory). + +``` +$ meson $BUILDDIR +$ meson compile -C $BUILDDIR +$ meson install -C $BUILDDIR +``` + +Contributing +------------ +The code and issue tracker of GCR can be found at the GNOME GitLab instance at +https://gitlab.gnome.org/GNOME/gcr. + +If you would like to get involved with GNOME projects, please also visit our +[Newcomers page] on the Wiki. + +Debug tracing +------------- +The Gcr and Gck libraries contain statements which help debug flow +and logic. In many cases these help you track down problems. + +Use the environment variable `G_MESSAGES_DEBUG='all'` or +`G_MESSAGES_DEBUG='xxx'` to display either all messages or a specific categories +of debug messages. You can separate categories in this list with spaces, commas +or semicolons. Gcr library uses category 'Gcr', while Gck library uses category +'Gck'. + +``` +# Example to display all debug messages: +$ G_MESSAGES_DEBUG=all gcr-viewer /path/to/certificate.crt + +# Example to display debug messages for a specific category: +$ G_MESSAGES_DEBUG="Gcr" gcr-viewer /path/to/certificate.crt +``` + +For the Gck debug messages simply replace 'Gcr' with 'Gck' in the above +examples. + +More information +---------------- +To discuss issues with developers and other users, you can post to the +[GNOME Discourse instance](https://discourse.gnome.org). + + + +[Meson]: https://mesonbuild.com +[Newcomers page]: https://wiki.gnome.org/TranslationProject/JoiningTranslation diff -Nru gcr-3.38.1/schema/Makefile.am gcr-3.40.0/schema/Makefile.am --- gcr-3.38.1/schema/Makefile.am 2021-01-12 22:55:54.692056700 +0000 +++ gcr-3.40.0/schema/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - -gsettings_SCHEMAS = \ - schema/org.gnome.crypto.pgp.gschema.xml - -@GSETTINGS_RULES@ - -convert_DATA = \ - schema/org.gnome.crypto.pgp.convert \ - schema/org.gnome.crypto.pgp_keyservers.convert - -convertdir = \ - $(datarootdir)/GConf/gsettings - -EXTRA_DIST += \ - $(convert_DATA) \ - $(gsettings_SCHEMAS) \ - $(gsettings_SCHEMAS:.xml=.valid) \ - $(NULL) diff -Nru gcr-3.38.1/schema/org.gnome.crypto.pgp.gschema.xml gcr-3.40.0/schema/org.gnome.crypto.pgp.gschema.xml --- gcr-3.38.1/schema/org.gnome.crypto.pgp.gschema.xml 2021-01-12 22:55:54.692056700 +0000 +++ gcr-3.40.0/schema/org.gnome.crypto.pgp.gschema.xml 2021-03-27 08:40:56.346531000 +0000 @@ -26,7 +26,7 @@ The ID of the last secret key used to sign a message. - ['ldap://keyserver.pgp.com'] + ['ldap://keyserver.pgp.com', 'hkps://keys.openpgp.org'] PGP key servers A list of key server URIs to search for remote PGP keys. A display name can be included, by appending a space and then the name. diff -Nru gcr-3.38.1/ui/frob-import-button.c gcr-3.40.0/ui/frob-import-button.c --- gcr-3.38.1/ui/frob-import-button.c 2021-01-12 22:55:54.695056700 +0000 +++ gcr-3.40.0/ui/frob-import-button.c 2021-03-27 08:40:56.349531000 +0000 @@ -70,14 +70,14 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; - res = g_simple_async_result_new (G_OBJECT (importer), callback, user_data, - mock_importer_import_async); + task = g_task_new (importer, cancellable, callback, user_data); + g_task_set_source_tag (task, mock_importer_import_async); g_printerr ("Import %p\n", importer); - g_simple_async_result_complete_in_idle (res); - g_object_unref (res); + g_task_return_boolean (task, TRUE); + g_clear_object (&task); } @@ -86,7 +86,7 @@ GAsyncResult *result, GError **error) { - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error); + return g_task_propagate_boolean (G_TASK (result), error); } diff -Nru gcr-3.38.1/ui/frob-prompt.c gcr-3.40.0/ui/frob-prompt.c --- gcr-3.38.1/ui/frob-prompt.c 2021-01-12 22:55:54.695056700 +0000 +++ gcr-3.40.0/ui/frob-prompt.c 2021-03-27 08:40:56.349531000 +0000 @@ -25,9 +25,12 @@ #include "gcr/gcr-base.h" #include +#ifdef GDK_WINDOWING_X11 #include - -#include +#endif +#ifdef GDK_WINDOWING_WAYLAND +#include +#endif static const gchar *file_name = NULL; static gchar *prompt_type = NULL; @@ -42,6 +45,45 @@ return FALSE; } +#ifdef GDK_WINDOWING_X11 +static void +set_caller_window_x11 (GcrPrompt *prompt, GdkWindow *window) +{ + gchar *caller_id = NULL; + + if (!GDK_IS_X11_WINDOW (window)) + return; + + caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window)); + gcr_prompt_set_caller_window (prompt, caller_id); + g_free (caller_id); +} +#endif + +#ifdef GDK_WINDOWING_WAYLAND +static void +on_window_wl_export_handle (GdkWindow *window, + const char *handle, + gpointer user_data) +{ + GcrPrompt *prompt = GCR_PROMPT (user_data); + + g_return_if_fail (handle); + + gcr_prompt_set_caller_window (prompt, handle); +} + +static void +set_caller_window_wl (GcrPrompt *prompt, GdkWindow *window) +{ + if (!GDK_IS_WAYLAND_WINDOW (window)) + return; + + if (!gdk_wayland_window_export_handle (window, on_window_wl_export_handle, prompt, NULL)) + g_warning ("Couldn't export Wayland window handle"); +} +#endif + static void prompt_perform (GtkWidget *parent) { @@ -54,7 +96,6 @@ const gchar *key; const gchar *password; GcrPromptReply reply; - gchar *caller_id = NULL; gboolean cont = TRUE; GMainLoop *loop; gchar *type; @@ -63,7 +104,7 @@ file = g_key_file_new (); if (!g_key_file_load_from_file (file, file_name, G_KEY_FILE_NONE, &error)) - errx (1, "couldn't load prompt info: %s", error->message); + g_error ("couldn't load prompt info: %s", error->message); if (!prompt_type || g_str_equal (prompt_type, "dialog")) prompt = g_object_new (GCR_TYPE_PROMPT_DIALOG, NULL); @@ -72,15 +113,21 @@ else if (g_str_equal (prompt_type, "private")) prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.PrivatePrompter", 5, NULL, &error); else - errx (2, "invalid type: %s", prompt_type); + g_error ("invalid type: %s", prompt_type); if (error != NULL) - errx (1, "couldn't create prompt: %s", error->message); + g_error ("couldn't create prompt: %s", error->message); if (parent) { - caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (gtk_widget_get_window (parent))); - gcr_prompt_set_caller_window (GCR_PROMPT (prompt), caller_id); - g_free (caller_id); + GdkWindow *window; + + window = gtk_widget_get_window (parent); +#ifdef GDK_WINDOWING_X11 + set_caller_window_x11 (prompt, window); +#endif +#ifdef GDK_WINDOWING_WAYLAND + set_caller_window_wl (prompt, window); +#endif } loop = g_main_loop_new (NULL, FALSE); @@ -99,7 +146,7 @@ continue; spec = g_object_class_find_property (G_OBJECT_GET_CLASS (prompt), key); if (spec == NULL) - errx (1, "couldn't find property %s on prompt %s", + g_error ("couldn't find property %s on prompt %s", key, G_OBJECT_TYPE_NAME (prompt)); g_value_init (&value, spec->value_type); switch (spec->value_type) { @@ -113,7 +160,7 @@ g_value_set_boolean (&value, g_key_file_get_boolean (file, groups[i], key, NULL)); break; default: - errx (1, "unsupported type %s for property %s", + g_error ("unsupported type %s for property %s", g_type_name (spec->value_type), key); break; } @@ -128,18 +175,18 @@ if (g_strcmp0 (type, "password") == 0) { password = gcr_prompt_password_run (prompt, NULL, &error); if (error != NULL) - errx (1, "couldn't prompt for password: %s", error->message); + g_error ("couldn't prompt for password: %s", error->message); g_print ("prompt password: %s\n", password); g_print ("password strength: %d\n", gcr_prompt_get_password_strength (prompt)); cont = (password != NULL); } else if (g_strcmp0 (type, "confirm") == 0) { reply = gcr_prompt_confirm_run (prompt, NULL, &error); if (error != NULL) - errx (1, "couldn't prompt for confirm: %s", error->message); + g_error ("couldn't prompt for confirm: %s", error->message); g_print ("prompt confirm: %d\n", reply); cont = (reply != GCR_PROMPT_REPLY_CANCEL); } else { - errx (1, "unsupported prompt type: %s", type); + g_error ("unsupported prompt type: %s", type); } g_free (type); @@ -199,12 +246,12 @@ g_option_context_add_group (context, gtk_get_option_group (TRUE)); if (!g_option_context_parse (context, &argc, &argv, &error)) - errx (2, "%s", error->message); + g_error ("%s", error->message); g_option_context_free (context); if (argc < 2) - errx (2, "specify file"); + g_error ("specify file"); file_name = argv[1]; if (prompt_window) { diff -Nru gcr-3.38.1/ui/frob-system-prompt.c gcr-3.40.0/ui/frob-system-prompt.c --- gcr-3.38.1/ui/frob-system-prompt.c 2021-01-12 22:55:54.696056600 +0000 +++ gcr-3.40.0/ui/frob-system-prompt.c 2021-03-27 08:40:56.349531000 +0000 @@ -23,23 +23,57 @@ #include "gcr/gcr.h" -#include "egg/egg-testing.h" - #include +#ifdef GDK_WINDOWING_X11 #include +#endif +#ifdef GDK_WINDOWING_WAYLAND +#include +#endif #include #include #include static void +run_prompt (GcrPrompt *prompt) +{ + const char *password; + GError *error = NULL; + + password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error); + if (error != NULL) { + g_warning ("couldn't prompt for password: %s", error->message); + g_error_free (error); + g_object_unref (prompt); + return; + } + + g_print ("password: %s\n", password); + g_object_unref (prompt); +} + +static void +on_gdk_wl_window_exported (GdkWindow *window, + const char *handle, + gpointer user_data) +{ + GcrPrompt *prompt = GCR_PROMPT (user_data); + + g_return_if_fail (handle); + + gcr_prompt_set_caller_window (prompt, handle); + run_prompt (prompt); +} + +static void on_prompt_clicked (GtkToolButton *button, gpointer user_data) { GcrPrompt *prompt; GError *error = NULL; - const gchar *password; GtkWidget *parent = user_data; + GdkWindow *window; gchar *caller_id; prompt = gcr_system_prompt_open (-1, NULL, &error); @@ -48,27 +82,30 @@ g_error_free (error); return; } - g_object_add_weak_pointer (G_OBJECT (prompt), (gpointer *)&prompt); gcr_prompt_set_title (GCR_PROMPT (prompt), "This is the title"); gcr_prompt_set_message (GCR_PROMPT (prompt), "This is the message"); gcr_prompt_set_description (GCR_PROMPT (prompt), "This is the description"); - caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (gtk_widget_get_window (parent))); - gcr_prompt_set_caller_window (GCR_PROMPT (prompt), caller_id); - g_free (caller_id); - - password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error); - if (error != NULL) { - g_warning ("couldn't prompt for password: %s", error->message); - g_error_free (error); - g_object_unref (prompt); - return; + window = gtk_widget_get_window (parent); +#ifdef GDK_WINDOWING_X11 + if (GDK_IS_X11_WINDOW (window)) { + caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window)); + gcr_prompt_set_caller_window (prompt, caller_id); + g_free (caller_id); + } +#endif +#ifdef GDK_WINDOWING_WAYLAND + if (GDK_IS_WAYLAND_WINDOW (window)) { + if (!gdk_wayland_window_export_handle (window, on_gdk_wl_window_exported, prompt, NULL)) { + g_warning ("Couldn't export Wayland window handle"); + } else { + return; /* Don't run the prompt before the async method finished */ + } } +#endif - g_print ("password: %s\n", password); - g_object_unref (prompt); - g_assert (prompt == NULL); + run_prompt (prompt); } static gboolean diff -Nru gcr-3.38.1/ui/gcr-dialog-util.c gcr-3.40.0/ui/gcr-dialog-util.c --- gcr-3.38.1/ui/gcr-dialog-util.c 2021-01-12 22:55:54.698056700 +0000 +++ gcr-3.40.0/ui/gcr-dialog-util.c 2021-03-27 08:40:56.350531000 +0000 @@ -27,7 +27,6 @@ typedef struct { GtkDialog *dialog; - gint response_id; gboolean was_modal; gboolean destroyed; gulong response_sig; @@ -49,11 +48,11 @@ } static void -complete_async_result (GSimpleAsyncResult *res) +complete_task (GTask *task, int response_id) { - DialogRunClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + DialogRunClosure *closure = g_task_get_task_data (task); - g_object_ref (res); + g_object_ref (task); if (!closure->destroyed) { if (!closure->was_modal) @@ -69,17 +68,17 @@ closure->destroy_sig = 0; } - g_simple_async_result_complete (res); - g_object_unref (res); + g_task_return_int (task, response_id); + g_clear_object (&task); } static void on_dialog_unmap (GtkDialog *dialog, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); + GTask *task = G_TASK (user_data); - complete_async_result (res); + complete_task (task, GTK_RESPONSE_NONE); } static void @@ -87,11 +86,8 @@ gint response_id, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - DialogRunClosure *closure = g_simple_async_result_get_op_res_gpointer (res); - - closure->response_id = response_id; - complete_async_result (res); + GTask *task = G_TASK (user_data); + complete_task (task, response_id); } static gint @@ -99,8 +95,8 @@ GdkEventAny *event, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - complete_async_result (res); + GTask *task = G_TASK (user_data); + complete_task (task, GTK_RESPONSE_NONE); return TRUE; /* Do not destroy */ } @@ -108,8 +104,8 @@ on_dialog_destroy (GtkDialog *dialog, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - DialogRunClosure *closure = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + DialogRunClosure *closure = g_task_get_task_data (task); /* complete will be called by run_unmap_handler */ closure->destroyed = TRUE; @@ -121,18 +117,17 @@ GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *res; + GTask *task; DialogRunClosure *closure; g_return_if_fail (GTK_IS_DIALOG (dialog)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - res = g_simple_async_result_new (G_OBJECT (dialog), callback, user_data, - _gcr_dialog_util_run_async); - closure = g_new0 (DialogRunClosure, 1); + task = g_task_new (dialog, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_dialog_util_run_async); + closure = g_new0 (DialogRunClosure, 1); closure->dialog = g_object_ref (dialog); - closure->response_id = GTK_RESPONSE_NONE; closure->was_modal = gtk_window_get_modal (GTK_WINDOW (dialog)); if (!closure->was_modal) gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); @@ -140,29 +135,29 @@ if (!gtk_widget_get_visible (GTK_WIDGET (dialog))) gtk_widget_show (GTK_WIDGET (dialog)); - g_simple_async_result_set_op_res_gpointer (res, closure, dialog_run_closure_free); + g_task_set_task_data (task, closure, dialog_run_closure_free); closure->response_sig = g_signal_connect_data (dialog, "response", G_CALLBACK (on_dialog_response), - g_object_ref (res), + g_object_ref (task), (GClosureNotify)g_object_unref, 0); closure->unmap_sig = g_signal_connect_data (dialog, "unmap", G_CALLBACK (on_dialog_unmap), - g_object_ref (res), + g_object_ref (task), (GClosureNotify)g_object_unref, 0); closure->delete_sig = g_signal_connect_data (dialog, "delete-event", G_CALLBACK (on_dialog_delete), - g_object_ref (res), + g_object_ref (task), (GClosureNotify)g_object_unref, 0); closure->destroy_sig = g_signal_connect_data (dialog, "destroy", G_CALLBACK (on_dialog_destroy), - g_object_ref (res), + g_object_ref (task), (GClosureNotify)g_object_unref, 0); - g_object_unref (res); + g_clear_object (&task); } @@ -170,11 +165,7 @@ _gcr_dialog_util_run_finish (GtkDialog *dialog, GAsyncResult *result) { - DialogRunClosure *closure; - - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (dialog), - _gcr_dialog_util_run_async), GTK_RESPONSE_NONE); + g_return_val_if_fail (g_task_is_valid (result, dialog), GTK_RESPONSE_NONE); - closure = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); - return closure->response_id; + return g_task_propagate_int (G_TASK (result), NULL); } diff -Nru gcr-3.38.1/ui/gcr-import-button.c gcr-3.40.0/ui/gcr-import-button.c --- gcr-3.38.1/ui/gcr-import-button.c 2021-01-12 22:55:54.700056600 +0000 +++ gcr-3.40.0/ui/gcr-import-button.c 2021-03-27 08:40:56.351531000 +0000 @@ -524,7 +524,7 @@ */ signals[IMPORTING] = g_signal_new ("importing", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrImportButtonClass, importing), - NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** diff -Nru gcr-3.38.1/ui/gcr-live-search.c gcr-3.40.0/ui/gcr-live-search.c --- gcr-3.38.1/ui/gcr-live-search.c 2021-01-12 22:55:54.701056700 +0000 +++ gcr-3.40.0/ui/gcr-live-search.c 2021-03-27 08:40:56.351531000 +0000 @@ -491,8 +491,7 @@ G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, + NULL, NULL, NULL, G_TYPE_NONE, 0); signals[KEYNAV] = g_signal_new ("key-navigation", diff -Nru gcr-3.38.1/ui/gcr.pc.in gcr-3.40.0/ui/gcr.pc.in --- gcr-3.38.1/ui/gcr.pc.in 2021-01-12 22:55:54.705056700 +0000 +++ gcr-3.40.0/ui/gcr.pc.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ -datarootdir=@datarootdir@ -datadir=@datadir@ -sysconfdir=@sysconfdir@ - -Name: gcr-@GCR_MAJOR@ -Description: GObject and GUI library for high level crypto parsing and display -Version: @VERSION@ -Requires: gck-@GCK_MAJOR@ gcr-ui-@GCR_MAJOR@ gcr-base-@GCR_MAJOR@ diff -Nru gcr-3.38.1/ui/gcr-pkcs11-import-interaction.c gcr-3.40.0/ui/gcr-pkcs11-import-interaction.c --- gcr-3.38.1/ui/gcr-pkcs11-import-interaction.c 2021-01-12 22:55:54.702056600 +0000 +++ gcr-3.40.0/ui/gcr-pkcs11-import-interaction.c 2021-03-27 08:40:56.352531000 +0000 @@ -149,19 +149,19 @@ GAsyncResult *result, gpointer user_data) { - GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data); - GckBuilder *builder = g_simple_async_result_get_op_res_gpointer (res); + GTask *task = G_TASK (user_data); + GckBuilder *builder = g_task_get_task_data (task); if (_gcr_pkcs11_import_dialog_run_finish (GCR_PKCS11_IMPORT_DIALOG (source), result)) { _gcr_pkcs11_import_dialog_get_supplements (GCR_PKCS11_IMPORT_DIALOG (source), builder); + g_task_return_boolean (task, TRUE); } else { - g_simple_async_result_set_error (res, G_IO_ERROR, G_IO_ERROR_CANCELLED, - _("The user cancelled the operation")); + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("The user cancelled the operation")); } - g_simple_async_result_complete (res); - g_object_unref (res); + g_clear_object (&task); } static void @@ -172,26 +172,27 @@ gpointer user_data) { GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); - GSimpleAsyncResult *res; + GTask *task; g_return_if_fail (self->dialog != NULL); - res = g_simple_async_result_new (G_OBJECT (interaction), callback, user_data, - _gcr_pkcs11_import_interaction_supplement_async); + task = g_task_new (interaction, cancellable, callback, user_data); + g_task_set_source_tag (task, _gcr_pkcs11_import_interaction_supplement_async); /* If dialog was already shown, then short circuit */ if (self->supplemented) { - g_simple_async_result_complete_in_idle (res); + g_task_return_boolean (task, TRUE); } else { self->supplemented = TRUE; - g_simple_async_result_set_op_res_gpointer (res, gck_builder_ref (builder), - (GDestroyNotify)gck_builder_unref); + g_task_set_task_data (task, gck_builder_ref (builder), + (GDestroyNotify) gck_builder_unref); _gcr_pkcs11_import_dialog_run_async (self->dialog, cancellable, - on_dialog_run_async, g_object_ref (res)); + on_dialog_run_async, + g_object_ref (task)); } - g_object_unref (res); + g_clear_object (&task); } static GTlsInteractionResult @@ -202,10 +203,9 @@ GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (interaction), - _gcr_pkcs11_import_interaction_supplement_async), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (g_task_is_valid (result, interaction), G_TLS_INTERACTION_UNHANDLED); - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) + if (!g_task_propagate_boolean (G_TASK (result), error)) return G_TLS_INTERACTION_FAILED; return G_TLS_INTERACTION_HANDLED; diff -Nru gcr-3.38.1/ui/gcr-prompt-dialog.c gcr-3.40.0/ui/gcr-prompt-dialog.c --- gcr-3.38.1/ui/gcr-prompt-dialog.c 2021-01-12 22:55:54.703056600 +0000 +++ gcr-3.40.0/ui/gcr-prompt-dialog.c 2021-03-27 08:40:56.352531000 +0000 @@ -27,7 +27,12 @@ #include "gcr-secure-entry-buffer.h" #include +#ifdef GDK_WINDOWING_X11 #include +#endif +#ifdef GDK_WINDOWING_WAYLAND +#include +#endif #include /** @@ -128,28 +133,22 @@ G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_prompt_dialog_prompt_iface); ); -static void -update_transient_for (GcrPromptDialog *self) +#ifdef GDK_WINDOWING_X11 +static gboolean +update_transient_for_x11 (GcrPromptDialog *self, GdkWindow *window) { - GdkDisplay *display; - GdkWindow *transient_for; - GdkWindow *window; gint64 handle; gchar *end; + GdkDisplay *display; + GdkWindow *transient_for; - if (self->pv->caller_window == NULL || g_str_equal (self->pv->caller_window, "")) { - gtk_window_set_modal (GTK_WINDOW (self), FALSE); - return; - } - - window = gtk_widget_get_window (GTK_WIDGET (self)); - if (window == NULL) - return; + if (!GDK_IS_X11_WINDOW (window)) + return FALSE; handle = g_ascii_strtoll (self->pv->caller_window, &end, 10); if (!end || *end != '\0') { g_warning ("couldn't parse caller-window property: %s", self->pv->caller_window); - return; + return FALSE; } display = gtk_widget_get_display (GTK_WIDGET (self)); @@ -157,9 +156,59 @@ if (transient_for == NULL) { g_warning ("caller-window property doesn't represent a window on current display: %s", self->pv->caller_window); - } else { - gdk_window_set_transient_for (window, transient_for); - g_object_unref (transient_for); + return FALSE; + } + + gdk_window_set_transient_for (window, transient_for); + g_object_unref (transient_for); + return TRUE; +} +#endif + +#ifdef GDK_WINDOWING_WAYLAND +static gboolean +update_transient_for_wl (GcrPromptDialog *self, GdkWindow *window) +{ + if (!GDK_IS_WAYLAND_WINDOW (window)) + return FALSE; + + if (gdk_wayland_window_set_transient_for_exported (window, self->pv->caller_window)) { + g_debug ("Succesfully set transient for WL window %s", self->pv->caller_window); + return TRUE; + } + + g_warning ("caller-window property doesn't represent a window on current display: %s", + self->pv->caller_window); + return FALSE; +} +#endif + +static void +update_transient_for (GcrPromptDialog *self) +{ + GdkWindow *window; + gboolean success = FALSE; + + if (self->pv->caller_window == NULL || g_str_equal (self->pv->caller_window, "")) { + gtk_window_set_modal (GTK_WINDOW (self), FALSE); + return; + } + + window = gtk_widget_get_window (GTK_WIDGET (self)); + if (window == NULL) + return; + +#ifdef GDK_WINDOWING_X11 + if (!success) + success |= update_transient_for_x11 (self, window); +#endif +#ifdef GDK_WINDOWING_WAYLAND + if (!success) + success |= update_transient_for_wl (self, window); +#endif + + if (!success) { + g_warning ("Couldn't set transient to caller window"); } gtk_window_set_modal (GTK_WINDOW (self), TRUE); diff -Nru gcr-3.38.1/ui/gcr-prompter-tool.c gcr-3.40.0/ui/gcr-prompter-tool.c --- gcr-3.38.1/ui/gcr-prompter-tool.c 2021-01-12 22:55:54.703056600 +0000 +++ gcr-3.40.0/ui/gcr-prompter-tool.c 2021-03-27 08:40:56.352531000 +0000 @@ -27,8 +27,6 @@ #include #include -#include -#include #include #include diff -Nru gcr-3.38.1/ui/gcr-renderer.c gcr-3.40.0/ui/gcr-renderer.c --- gcr-3.38.1/ui/gcr-renderer.c 2021-01-12 22:55:54.703056600 +0000 +++ gcr-3.40.0/ui/gcr-renderer.c 2021-03-27 08:40:56.352531000 +0000 @@ -113,7 +113,7 @@ */ signals[DATA_CHANGED] = g_signal_new ("data-changed", GCR_TYPE_RENDERER, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrRendererIface, data_changed), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + NULL, NULL, NULL, G_TYPE_NONE, 0); initialized = TRUE; } diff -Nru gcr-3.38.1/ui/gcr-unlock-renderer.c gcr-3.40.0/ui/gcr-unlock-renderer.c --- gcr-3.38.1/ui/gcr-unlock-renderer.c 2021-01-12 22:55:54.704056700 +0000 +++ gcr-3.40.0/ui/gcr-unlock-renderer.c 2021-03-27 08:40:56.353531000 +0000 @@ -216,7 +216,7 @@ signals[UNLOCK_CLICKED] = g_signal_new ("unlock-clicked", GCR_TYPE_UNLOCK_RENDERER, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrUnlockRendererClass, unlock_clicked), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + NULL, NULL, NULL, G_TYPE_NONE, 0); } static void diff -Nru gcr-3.38.1/ui/icons/16x16/Makefile.am gcr-3.40.0/ui/icons/16x16/Makefile.am --- gcr-3.38.1/ui/icons/16x16/Makefile.am 2021-01-12 22:55:54.705056700 +0000 +++ gcr-3.40.0/ui/icons/16x16/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -include $(srcdir)/../Makefile.decl - -icondir = $(datadir)/icons/hicolor/16x16/apps -icon_DATA = $(ICONS_SMALL:=.png) -EXTRA_DIST = $(icon_DATA) diff -Nru gcr-3.38.1/ui/icons/22x22/Makefile.am gcr-3.40.0/ui/icons/22x22/Makefile.am --- gcr-3.38.1/ui/icons/22x22/Makefile.am 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/22x22/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -include $(srcdir)/../Makefile.decl - -icondir = $(datadir)/icons/hicolor/22x22/apps -icon_DATA = $(ICONS_SMALL:=.png) -EXTRA_DIST = $(icon_DATA) diff -Nru gcr-3.38.1/ui/icons/24x24/Makefile.am gcr-3.40.0/ui/icons/24x24/Makefile.am --- gcr-3.38.1/ui/icons/24x24/Makefile.am 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/24x24/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -include $(srcdir)/../Makefile.decl - -icondir = $(datadir)/icons/hicolor/24x24/apps -icon_DATA = $(ICONS_SMALL:=.png) -EXTRA_DIST = $(icon_DATA) diff -Nru gcr-3.38.1/ui/icons/256x256/Makefile.am gcr-3.40.0/ui/icons/256x256/Makefile.am --- gcr-3.38.1/ui/icons/256x256/Makefile.am 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/256x256/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -include $(srcdir)/../Makefile.decl - -icondir = $(datadir)/icons/hicolor/256x256/apps -icon_DATA = $(ICONS_HIRES:=.png) -EXTRA_DIST = $(icon_DATA) diff -Nru gcr-3.38.1/ui/icons/32x32/Makefile.am gcr-3.40.0/ui/icons/32x32/Makefile.am --- gcr-3.38.1/ui/icons/32x32/Makefile.am 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/32x32/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -include $(srcdir)/../Makefile.decl - -icondir = $(datadir)/icons/hicolor/32x32/apps -icon_DATA = $(ICONS_SMALL:=.png) -EXTRA_DIST = $(icon_DATA) diff -Nru gcr-3.38.1/ui/icons/48x48/Makefile.am gcr-3.40.0/ui/icons/48x48/Makefile.am --- gcr-3.38.1/ui/icons/48x48/Makefile.am 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/48x48/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -include $(srcdir)/../Makefile.decl - -icondir = $(datadir)/icons/hicolor/48x48/apps -icon_DATA = $(ICONS_SMALL:=.png) -EXTRA_DIST = $(icon_DATA) diff -Nru gcr-3.38.1/ui/icons/Makefile.am gcr-3.40.0/ui/icons/Makefile.am --- gcr-3.38.1/ui/icons/Makefile.am 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ - -SUBDIRS += \ - ui/icons/16x16 \ - ui/icons/22x22 \ - ui/icons/24x24 \ - ui/icons/32x32 \ - ui/icons/48x48 \ - ui/icons/256x256 - -EXTRA_DIST += \ - ui/icons/src \ - ui/icons/render-icons.py - -if WITH_UPDATE_ICON_CACHE - -gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor - -install-data-hook: - @-if test -z "$(DESTDIR)"; then \ - echo "Updating Gtk icon cache."; \ - $(gtk_update_icon_cache); \ - else \ - echo "*** Icon cache not updated. After install, run this:"; \ - echo "*** $(gtk_update_icon_cache)"; \ - fi -endif - -render: - cd $(srcdir) && ./ui/icons/render-icons.py diff -Nru gcr-3.38.1/ui/icons/Makefile.decl gcr-3.40.0/ui/icons/Makefile.decl --- gcr-3.38.1/ui/icons/Makefile.decl 2021-01-12 22:55:54.706056600 +0000 +++ gcr-3.40.0/ui/icons/Makefile.decl 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -NULL = - -ICONS_SMALL = \ - gcr-gnupg \ - gcr-key \ - gcr-key-pair \ - gcr-password \ - gcr-smart-card \ - $(NULL) - -ICONS_HIRES = \ - gcr-gnupg \ - gcr-password \ - gcr-smart-card \ - $(NULL) diff -Nru gcr-3.38.1/ui/Makefile.am gcr-3.40.0/ui/Makefile.am --- gcr-3.38.1/ui/Makefile.am 2021-01-12 22:55:54.694056500 +0000 +++ gcr-3.40.0/ui/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,366 +0,0 @@ - -ui_incdir = $(includedir)/gcr-@GCR_MAJOR@/ui - -check-ui-symbols: gcr-ui-expected.abi gcr-ui-actual.abi - $(AM_V_GEN) diff -U0 --ignore-blank-lines gcr-ui-expected.abi gcr-ui-actual.abi || \ - (echo "check-symbols: Symbols have CHANGED. Fix gcr-ui.symbols"; exit 1) - -ui_BUILT_SOURCES = \ - ui/gcr-enum-types.c ui/gcr-enum-types.h \ - ui/gcr-resources.c ui/gcr-resources.h - -BUILT_SOURCES += \ - $(ui_BUILT_SOURCES) - -libgcr_ui_@GCR_MAJOR@_la_CFLAGS = \ - -DGCK_API_SUBJECT_TO_CHANGE \ - -DGCR_API_SUBJECT_TO_CHANGE \ - -DP11_KIT_API_SUBJECT_TO_CHANGE \ - -DG_LOG_DOMAIN=\"Gcr\" \ - -DGCR_COMPILATION \ - $(P11_KIT_CFLAGS) \ - $(GTK_CFLAGS) - -libgcr_ui_@GCR_MAJOR@_la_LDFLAGS = \ - -version-info $(GCR_LT_RELEASE) \ - -no-undefined \ - -export-symbols-regex '^_gcr_.*|^gcr_.*|^SECMEM_.*' - -libgcr_ui_@GCR_MAJOR@_la_LIBADD = \ - libegg.la \ - libgcr-base-$(GCR_MAJOR).la \ - libgck-@GCK_MAJOR@.la \ - $(GLIB_LIBS) \ - $(LIBGCRYPT_LIBS) \ - $(P11_KIT_LIBS) \ - $(GTK_LIBS) \ - $(NULL) - -# libgcr-3.so (and friends) symlink to libgcr-ui-3.so for compatibility raisons -install-exec-hook: - $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so - $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so.@GCR_CURRENT@ - $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libgcr-ui-@GCR_MAJOR@.so` $(DESTDIR)$(libdir)/libgcr-@GCR_MAJOR@.so.@GCR_CURRENT@.0.0 - -lib_LTLIBRARIES += \ - libgcr-ui-@GCR_MAJOR@.la - -ui_HEADER_FILES = \ - ui/gcr-ui.h \ - ui/gcr-certificate-basics-widget.h \ - ui/gcr-certificate-details-widget.h \ - ui/gcr-certificate-renderer.h \ - ui/gcr-certificate-widget.h \ - ui/gcr-collection-model.h \ - ui/gcr-combo-selector.h \ - ui/gcr-deprecated.h \ - ui/gcr-failure-renderer.h \ - ui/gcr-key-renderer.h \ - ui/gcr-key-widget.h \ - ui/gcr-import-button.h \ - ui/gcr-list-selector.h \ - ui/gcr-prompt-dialog.h \ - ui/gcr-renderer.h \ - ui/gcr-secure-entry-buffer.h \ - ui/gcr-tree-selector.h \ - ui/gcr-unlock-options-widget.h \ - ui/gcr-viewer.h \ - ui/gcr-viewer-widget.h - -ui_inc_HEADERS = \ - $(ui_HEADER_FILES) \ - ui/gcr-enum-types.h - -ui_PUBLIC_FILES = \ - ui/gcr-certificate-renderer.c ui/gcr-certificate-renderer.h \ - ui/gcr-certificate-widget.c ui/gcr-certificate-widget.h \ - ui/gcr-collection-model.c ui/gcr-collection-model.h \ - ui/gcr-combo-selector.c ui/gcr-combo-selector.h \ - ui/gcr-failure-renderer.c ui/gcr-failure-renderer.h \ - ui/gcr-key-renderer.c ui/gcr-key-renderer.h \ - ui/gcr-key-widget.c ui/gcr-key-widget.h \ - ui/gcr-import-button.c ui/gcr-import-button.h \ - ui/gcr-list-selector.c ui/gcr-list-selector.h \ - ui/gcr-prompt-dialog.c ui/gcr-prompt-dialog.h \ - ui/gcr-renderer.c ui/gcr-renderer.h \ - ui/gcr-secure-entry-buffer.c ui/gcr-secure-entry-buffer.h \ - ui/gcr-tree-selector.c ui/gcr-tree-selector.h \ - ui/gcr-unlock-options-widget.c ui/gcr-unlock-options-widget.h \ - ui/gcr-viewer.c ui/gcr-viewer.h \ - ui/gcr-viewer-widget.c ui/gcr-viewer-widget.h \ - ui/gcr-ui.h \ - $(NULL) - -ui_PRIVATE_FILES = \ - ui/eggimagemenuitem.c ui/eggimagemenuitem.h \ - ui/gcr-certificate-basics-widget.c ui/gcr-certificate-basics-widget.h \ - ui/gcr-certificate-details-widget.c ui/gcr-certificate-details-widget.h \ - ui/gcr-certificate-exporter.c ui/gcr-certificate-exporter.h \ - ui/gcr-certificate-renderer-private.h \ - ui/gcr-certificate-request-renderer.c ui/gcr-certificate-request-renderer.h \ - ui/gcr-deprecated.h \ - ui/gcr-dialog-util.c ui/gcr-dialog-util.h \ - ui/gcr-display-scrolled.c ui/gcr-display-scrolled.h \ - ui/gcr-display-view.c ui/gcr-display-view.h \ - ui/gcr-gnupg-renderer.c ui/gcr-gnupg-renderer.h \ - ui/gcr-list-selector-private.h \ - ui/gcr-live-search.c ui/gcr-live-search.h \ - ui/gcr-pkcs11-import-dialog.c ui/gcr-pkcs11-import-dialog.h \ - ui/gcr-pkcs11-import-interaction.c ui/gcr-pkcs11-import-interaction.h \ - ui/gcr-unlock-renderer.c ui/gcr-unlock-renderer.h \ - ui/gcr-viewer-window.c ui/gcr-viewer-window.h \ - $(NULL) - -libgcr_ui_@GCR_MAJOR@_la_SOURCES = \ - $(ui_PUBLIC_FILES) \ - $(ui_PRIVATE_FILES) \ - $(NULL) - -nodist_libgcr_ui_@GCR_MAJOR@_la_SOURCES = \ - $(ui_BUILT_SOURCES) - -ui/gcr-enum-types.h: $(ENUM_TEMPLATE_H) $(ui_HEADER_FILES) - $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ - -ui/gcr-enum-types.c: $(ENUM_TEMPLATE_C) $(ui_HEADER_FILES) - $(AM_V_GEN) $(GLIB_MKENUMS) --template $^ > $@ - -ui_RESOURCES = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/ui --generate-dependencies $(srcdir)/ui/gcr.gresource.xml) - -ui/gcr-resources.h: ui/gcr.gresource.xml - $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/ui --generate-header --internal - -ui/gcr-resources.c: ui/gcr.gresource.xml $(ui_RESOURCES) - $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/ui --generate-source --internal - -gcr-ui-$(GCR_MAJOR).pc: ui/gcr-ui.pc - $(AM_V_GEN) cp ui/gcr-ui.pc gcr-ui-$(GCR_MAJOR).pc -gcr-$(GCR_MAJOR).pc: ui/gcr.pc - $(AM_V_GEN) cp ui/gcr.pc gcr-$(GCR_MAJOR).pc - -if HAVE_INTROSPECTION - -INTROSPECTION_GIRS += GcrUi-@GCR_MAJOR@.gir - -GcrUi-@GCR_MAJOR@.gir: libgcr-ui-@GCR_MAJOR@.la Gcr-@GCR_MAJOR@.gir - -GcrUi_@GCR_MAJOR@_gir_PACKAGES = gtk+-3.0 p11-kit-1 -GcrUi_@GCR_MAJOR@_gir_EXPORT_PACKAGES = gcr-ui-@GCR_MAJOR@ -GcrUi_@GCR_MAJOR@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gtk-3.0 -GcrUi_@GCR_MAJOR@_gir_LIBS = libgcr-base-@GCR_MAJOR@.la libgcr-ui-@GCR_MAJOR@.la -GcrUi_@GCR_MAJOR@_gir_CFLAGS = -I$(srcdir) -I$(builddir) -DGCR_COMPILATION -DGCR_API_SUBJECT_TO_CHANGE -GcrUi_@GCR_MAJOR@_gir_FILES = $(ui_PUBLIC_FILES) -GcrUi_@GCR_MAJOR@_gir_SCANNERFLAGS = \ - --add-include-path=$(builddir)/gck \ - --add-include-path=$(builddir)/gcr \ - --include-uninstalled=Gck-@GCK_MAJOR@.gir \ - --include-uninstalled=Gcr-@GCR_MAJOR@.gir \ - --c-include "ui/gcr-ui.h" \ - --identifier-prefix Gcr --symbol-prefix gcr - -gir_DATA += GcrUi-@GCR_MAJOR@.gir - -if ENABLE_VAPIGEN - -gcr-ui-@GCR_MAJOR@.vapi: GcrUi-@GCR_MAJOR@.gir ui/GcrUi-@GCR_MAJOR@.metadata gcr-ui-@GCR_MAJOR@.deps gck-@GCK_MAJOR@.vapi gcr-@GCR_MAJOR@.vapi - -VAPIGEN_VAPIS += gcr-ui-@GCR_MAJOR@.vapi - -gcr_ui_@GCR_MAJOR@_vapi_DEPS = glib-2.0 gio-2.0 gck-@GCK_MAJOR@ gcr-@GCR_MAJOR@ gtk+-3.0 -gcr_ui_@GCR_MAJOR@_vapi_METADATADIRS = $(srcdir)/ui -gcr_ui_@GCR_MAJOR@_vapi_VAPIDIRS = $(builddir) -gcr_ui_@GCR_MAJOR@_vapi_GIRDIRS = $(builddir) -gcr_ui_@GCR_MAJOR@_vapi_FILES = GcrUi-@GCR_MAJOR@.gir - -gcr-ui-$(GCR_MAJOR).deps: Makefile.am - $(AM_V_GEN) echo $(gcr_ui_@GCR_MAJOR@_vapi_DEPS) | tr ' ' '\n' > $@ - -EXTRA_DIST += \ - ui/GcrUi-@GCR_MAJOR@.metadata - -endif # ENABLE_VAPIGEN - -endif # HAVE_INTROSPECTION - -pkgconfig_DATA += \ - gcr-$(GCR_MAJOR).pc \ - gcr-ui-$(GCR_MAJOR).pc - -gcr-ui-expected.abi: ui/gcr-ui.symbols - $(AM_V_GEN) cpp -P $< | sort > $@ - -bin_PROGRAMS = gcr-viewer - -gcr_viewer_SOURCES = \ - ui/gcr-viewer-tool.c - -gcr_viewer_CFLAGS = \ - $(P11_KIT_CFLAGS) \ - $(GTK_CFLAGS) \ - -DGCR_API_SUBJECT_TO_CHANGE - -gcr_viewer_LDADD = \ - libgcr-ui-$(GCR_MAJOR).la \ - libgcr-base-$(GCR_MAJOR).la \ - libgck-@GCK_MAJOR@.la \ - $(GLIB_LIBS) \ - $(GTK_LIBS) - -viewer_desktop_in_in = ui/gcr-viewer.desktop.in.in -viewer_desktop_in = $(viewer_desktop_in_in:.desktop.in.in=.desktop.in) -viewer_desktop = $(viewer_desktop_in:.desktop.in=.desktop) -$(viewer_desktop_in): $(viewer_desktop_in_in) - $(AM_V_GEN) sed 's|@bindir[@]|$(bindir)|g' $< > $@ -$(viewer_desktop): $(viewer_desktop_in) - $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ - -libexec_PROGRAMS += gcr-prompter - -gcr_prompter_SOURCES = \ - ui/gcr-prompter-tool.c - -gcr_prompter_CFLAGS = \ - -DGCR_API_SUBJECT_TO_CHANGE \ - $(P11_KIT_CFLAGS) \ - $(GTK_CFLAGS) - -gcr_prompter_LDADD = \ - libgcr-ui-$(GCR_MAJOR).la \ - libgcr-base-$(GCR_MAJOR).la \ - libgck-@GCK_MAJOR@.la \ - $(GTK_LIBS) - -prompter_desktop_in_in = ui/gcr-prompter.desktop.in.in -prompter_desktop_in = $(prompter_desktop_in_in:.desktop.in.in=.desktop.in) -prompter_desktop = $(prompter_desktop_in:.desktop.in=.desktop) -$(prompter_desktop_in): $(prompter_desktop_in_in) - $(AM_V_GEN) sed 's|@libexecdir[@]|$(libexecdir)|g' $< > $@ -$(prompter_desktop): $(prompter_desktop_in) - $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ - -desktop_in_in_files = $(viewer_desktop_in_in) $(prompter_desktop_in_in) -desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in) -desktopdir = $(datadir)/applications -desktop_DATA = \ - $(prompter_desktop) \ - $(viewer_desktop) - -EXTRA_DIST += \ - ui/gcr.pc.in \ - ui/gcr-ui.pc.in \ - ui/gcr-ui.symbols \ - ui/gcr.gresource.xml \ - $(ui_RESOURCES) \ - $(mime_DATA) \ - $(desktop_in_in_files) \ - ui/fixtures - -CLEANFILES += \ - $(desktop_DATA) \ - gcr-ui-actual.abi \ - gcr-ui-expected.abi \ - $(desktop_in_files) \ - $(NULL) - -# The new mime system -mimedir = $(datadir)/mime/packages -mime_DATA = ui/gcr-crypto-types.xml - -if WITH_UPDATE_MIME - -update_mime_database_cmd = update-mime-database $(datadir)/mime/ - -install-data-hook: update_mime_database -uninstall-hook: update_mime_database - -update_mime_database: - @-if test -z "$(DESTDIR)"; then \ - echo "Updating MIME database."; \ - $(update_mime_database_cmd); \ - else \ - echo "*** MIME database not updated. After (un)install, run this:"; \ - echo "*** $(update_mime_database_cmd)"; \ - fi - -endif # WITH_UPDATE_MIME - -gcr-ui-actual.abi: .libs/libgcr-ui-@GCR_MAJOR@.so - $(AM_V_GEN) $(NM) -D -g --defined-only $< | \ - cut -d ' ' -f 3 | grep -Ev '^(__bss_start|_edata|_end|_gcr_)' | sort > $@ - -ui_CFLAGS = \ - -DGCR_API_SUBJECT_TO_CHANGE \ - -DGCK_API_SUBJECT_TO_CHANGE \ - -DGCR_COMPILATION \ - $(LIBGCRYPT_CFLAGS) \ - $(P11_KIT_CFLAGS) \ - $(GTK_CFLAGS) - -ui_LIBS = \ - libgcr-ui-@GCR_MAJOR@.la \ - libgcr-base-@GCR_MAJOR@.la \ - libegg.la \ - libgck-testable.la \ - $(LIBGCRYPT_LIBS) \ - $(P11_KIT_LIBS) \ - $(GTK_LIBS) - -# ------------------------------------------------------------------ - -noinst_PROGRAMS += \ - frob-certificate \ - frob-combo-selector \ - frob-gnupg-selector \ - frob-import-button \ - frob-key \ - frob-tree-selector \ - frob-prompt \ - frob-request \ - frob-system-prompt \ - frob-unlock \ - frob-unlock-options - -frob_certificate_SOURCES = ui/frob-certificate.c -frob_certificate_CFLAGS = $(ui_CFLAGS) -frob_certificate_LDADD = $(ui_LIBS) - -frob_combo_selector_SOURCES = ui/frob-combo-selector.c -frob_combo_selector_CFLAGS = $(ui_CFLAGS) -frob_combo_selector_LDADD = $(ui_LIBS) - -frob_gnupg_selector_SOURCES = ui/frob-gnupg-selector.c -frob_gnupg_selector_CFLAGS = $(ui_CFLAGS) -frob_gnupg_selector_LDADD = $(ui_LIBS) - -frob_import_button_SOURCES = ui/frob-import-button.c -frob_import_button_CFLAGS = $(ui_CFLAGS) -frob_import_button_LDADD = $(ui_LIBS) - -frob_key_SOURCES = ui/frob-key.c -frob_key_CFLAGS = $(ui_CFLAGS) -frob_key_LDADD = $(ui_LIBS) - -frob_prompt_SOURCES = ui/frob-prompt.c -frob_prompt_CFLAGS = $(ui_CFLAGS) -frob_prompt_LDADD = $(ui_LIBS) - -frob_request_SOURCES = ui/frob-request.c -frob_request_CFLAGS = $(ui_CFLAGS) -frob_request_LDADD = $(ui_LIBS) - -frob_system_prompt_SOURCES = ui/frob-system-prompt.c -frob_system_prompt_CFLAGS = $(ui_CFLAGS) -frob_system_prompt_LDADD = $(ui_LIBS) - -frob_tree_selector_SOURCES = ui/frob-tree-selector.c -frob_tree_selector_CFLAGS = $(ui_CFLAGS) -frob_tree_selector_LDADD = $(ui_LIBS) - -frob_unlock_SOURCES = \ - ui/frob-unlock.c ui/gcr-viewer-window.c -frob_unlock_CFLAGS = $(ui_CFLAGS) -frob_unlock_LDADD = $(ui_LIBS) - -frob_unlock_options_SOURCES = ui/frob-unlock-options.c -frob_unlock_options_CFLAGS = $(ui_CFLAGS) -frob_unlock_options_LDADD = $(ui_LIBS) diff -Nru gcr-3.38.1/ui/meson.build gcr-3.40.0/ui/meson.build --- gcr-3.38.1/ui/meson.build 2021-01-12 22:55:54.710056800 +0000 +++ gcr-3.40.0/ui/meson.build 2021-03-27 08:40:56.357531000 +0000 @@ -84,7 +84,6 @@ gck_dep, gcr_base_dep, gtk_dep, - gtk_x11_dep, ] gcr_ui_cflags = [