#!/usr/bin/perl -w use strict; ## Copyright (C) 2015 Intel Corporation ## # ## ## This software falls under the GNU General Public License. ## ## Please read the COPYING file for more information ## # # # This software reads a XML file and a list of valid interal # references to replace Docbook tags with links. # # The list of "valid internal references" must be one-per-line in the following format: # API-struct-foo # API-enum-bar # API-my-function # # The software walks over the XML file looking for xml tags representing possible references # to the Document. Each reference will be cross checked against the "Valid Internal Reference" list. If # the referece is found it replaces its content by a tag. # # usage: # kernel-doc-xml-ref -db filename # xml filename > outputfile # read arguments if ($#ARGV != 2) { usage(); } #Holds the database filename my $databasefile; my @database; #holds the inputfile my $inputfile; my $errors = 0; my %highlights = ( "(.*?)", "\"\" . convert_function(\$1, \$line) . \"\"", "(.*?)", "\"\" . convert_struct(\$1) . \"\"", "(.*?)(.*?)", "\"\" . convert_param(\$1) . \"\$2\"", "(.*?)(.*?)", "\"\" . convert_param(\$1) . \"\$2\""); while($ARGV[0] =~ m/^-(.*)/) { my $cmd = shift @ARGV; if ($cmd eq "-db") { $databasefile = shift @ARGV } else { usage(); } } $inputfile = shift @ARGV; sub open_database { open (my $handle, '<', $databasefile) or die "Cannot open $databasefile"; chomp(my @lines = <$handle>); close $handle; @database = @lines; } sub process_file { open_database(); my $dohighlight; foreach my $pattern (keys %highlights) { $dohighlight .= "\$line =~ s:$pattern:$highlights{$pattern}:eg;\n"; } open(FILE, $inputfile) or die("Could not open $inputfile") or die ("Cannot open $inputfile"); foreach my $line () { eval $dohighlight; print $line; } } sub trim($_) { my $str = $_[0]; $str =~ s/^\s+|\s+$//g; return $str } sub has_key_defined($_) { if ( grep( /^$_[0]$/, @database)) { return 1; } return 0; } # Gets a content and add it a hyperlink if possible. sub convert_function($_) { my $arg = $_[0]; my $key = $_[0]; my $line = $_[1]; $key = trim($key); $key =~ s/[^A-Za-z0-9]/-/g; $key = "API-" . $key; # We shouldn't add links to prototype if (!has_key_defined($key) || $line =~ m/\s+$head$tail"; } # Converting a struct text to link sub convert_struct($_) { my $arg = $_[0]; my $key = $_[0]; $key =~ s/(struct )?(\w)/$2/g; $key =~ s/[^A-Za-z0-9]/-/g; $key = "API-struct-" . $key; if (!has_key_defined($key)) { return $arg; } my ($head, $tail) = split_pointer($arg); return "$head$tail"; } # Identify "object *" elements sub split_pointer($_) { my $arg = $_[0]; if ($arg =~ /(.*?)( ?\* ?)/) { return ($1, $2); } return ($arg, ""); } sub convert_param($_) { my $type = $_[0]; my $keyname = convert_key_name($type); if (!has_key_defined($keyname)) { return $type; } my ($head, $tail) = split_pointer($type); return "$head$tail"; } # DocBook links are in the API-- format # This method gets an element and returns a valid DocBook reference for it. sub convert_key_name($_) { #Pattern $2 is optional and might be uninitialized no warnings 'uninitialized'; my $str = $_[0]; $str =~ s/(const|static)? ?(struct)? ?([a-zA-Z0-9_]+) ?(\*|&)?/$2 $3/g ; # trim $str =~ s/^\s+|\s+$//g; # spaces and _ to - $str =~ s/[^A-Za-z0-9]/-/g; return "API-" . $str; } sub usage { print "Usage: $0 -db database filename\n"; print " xml source file(s) > outputfile\n"; exit 1; } # starting point process_file(); if ($errors) { print STDERR "$errors errors\n"; } exit($errors); ctrl'>
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2017-02-01 17:45:02 +0000
committerIngo Molnar <mingo@kernel.org>2017-02-01 21:17:49 +0100
commitc8f325a59cfc718d13a50fbc746ed9b415c25e92 (patch)
treed53fbdac9d0781e39a13b2ac6b2bd258cf3b4140 /drivers/usb/musb/omap2430.c
parentbf29bddf0417a4783da3b24e8c9e017ac649326f (diff)
efi/fdt: Avoid FDT manipulation after ExitBootServices()
Some AArch64 UEFI implementations disable the MMU in ExitBootServices(), after which unaligned accesses to RAM are no longer supported. Commit: abfb7b686a3e ("efi/libstub/arm*: Pass latest memory map to the kernel") fixed an issue in the memory map handling of the stub FDT code, but inadvertently created an issue with such firmware, by moving some of the FDT manipulation to after the invocation of ExitBootServices(). Given that the stub's libfdt implementation uses the ordinary, accelerated string functions, which rely on hardware handling of unaligned accesses, manipulating the FDT with the MMU off may result in alignment faults. So fix the situation by moving the update_fdt_memmap() call into the callback function invoked by efi_exit_boot_services() right before it calls the ExitBootServices() UEFI service (which is arguably a better place for it anyway) Note that disabling the MMU in ExitBootServices() is not compliant with the UEFI spec, and carries great risk due to the fact that switching from cached to uncached memory accesses halfway through compiler generated code (i.e., involving a stack) can never be done in a way that is architecturally safe. Fixes: abfb7b686a3e ("efi/libstub/arm*: Pass latest memory map to the kernel") Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Riku Voipio <riku.voipio@linaro.org> Cc: <stable@vger.kernel.org> Cc: mark.rutland@arm.com Cc: linux-efi@vger.kernel.org Cc: matt@codeblueprint.co.uk Cc: leif.lindholm@linaro.org Cc: linux-arm-kernel@lists.infradead.org Link: http://lkml.kernel.org/r/1485971102-23330-2-git-send-email-ard.biesheuvel@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/usb/musb/omap2430.c')