~ubuntu-branches/ubuntu/precise/nvidia-graphics-drivers-340-updates/precise-updates

« back to all changes in this revision

Viewing changes to debian/nvidia_supported

  • Committer: Package Import Robot
  • Author(s): Alberto Milone
  • Date: 2015-08-27 16:59:02 UTC
  • Revision ID: package-import@ubuntu.com-20150827165902-je7xc80q6s7yttng
Tags: 340.93-0ubuntu0.0.0.1
* Initial release (replaces nvidia-graphics-drivers-331-updates).
* SECURITY UPDATE:
  - CVE-2015-5950 (LP: #1489391).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
set -e
 
3
 
 
4
# This is a nasty kluge, but it seems to work. Better check the output when
 
5
# upgrading to a new release of the nvidia driver, though.
 
6
 
 
7
if [ "$#" -ne 4 ]; then
 
8
  >&2 printf 'USAGE: %s modulename packagename README.txt nv-kernel.o\n' "$0"
 
9
  exit 1
 
10
fi
 
11
 
 
12
device_ids() {
 
13
  local modname="$1"; shift
 
14
  local pkgname="$1"; shift
 
15
  local readme="$1"; shift
 
16
  local object="$1"; shift
 
17
 
 
18
  local ret=1
 
19
 
 
20
  local symbols="$(mktemp)"
 
21
  local readme_list="$(mktemp)"
 
22
  local object_list="$(mktemp)"
 
23
  local diff="$(mktemp)"
 
24
 
 
25
  sed -nr '/^Appendix .\. Supported NVIDIA /,/legacy/ {
 
26
    s/.*   0x([0-9a-fA-F]{4}) 0x([0-9a-fA-F]{4})(   .*|$)/\1 \2/p
 
27
  }' "$readme" | tr A-F a-f | sort | uniq >"$readme_list"
 
28
  sed -nr '/^Appendix .\. Supported NVIDIA /,/legacy/ {
 
29
    s/.*   0x([0-9a-fA-F]{4})(   .*|$)/\1/p
 
30
  }' "$readme" | tr A-F a-f | sort | uniq >>"$readme_list"
 
31
 
 
32
  local readme_length="$(grep -Ec . "$readme_list")"
 
33
 
 
34
  objdump --section=.rodata --syms "$object" |
 
35
  sed -nr '/SYMBOL TABLE/,/^$/ {
 
36
    s/^([0-9a-f]+)\s+l\s+O\s+\S+\s+([0-9a-f]+)\s+\S+.*/\2 \1/p
 
37
  }' |
 
38
  sort -nr >"$symbols" # The list is probably among the larger symbols.
 
39
 
 
40
  while read length start; do
 
41
    [ "$((0x$length))" -gt 0 ] || continue
 
42
 
 
43
    objdump --section=.rodata --full-contents \
 
44
      --start-address="0x$start" \
 
45
      --stop-address="$((0x$start+0x$length))" "$object" |
 
46
    sed -nr 's/^ [0-9a-f]+ ([0-9a-f]{2})([0-9a-f]{2}).*/\2\1/p' |
 
47
    sort | uniq | (grep -vx 0000 || :) >"$object_list"
 
48
 
 
49
    local object_length="$(grep -Ec . "$object_list")"
 
50
 
 
51
    diff -u "$readme_list" "$object_list" | tail -n +3 >"$diff"
 
52
    local num_deletions="$(grep -Ec '^-' "$diff")"
 
53
    local num_additions="$(grep -Ec '^\+' "$diff")"
 
54
 
 
55
    # Some thresholds for now.
 
56
    if [ "$num_deletions" -eq 0 ] &&
 
57
       [ "$num_additions" -le "$(($readme_length*3/2))" ]; then
 
58
      >&2 printf 'DEBUG: readme:%d object:%d deletions:%d additions:%d\n' \
 
59
        "$readme_length" "$object_length" "$num_deletions" "$num_additions"
 
60
      ret=0
 
61
      break
 
62
    fi
 
63
  done <"$symbols"
 
64
 
 
65
  if [ "$ret" -eq 0 ]; then
 
66
    printf '%s\n' '# List generated by nvidia_supported. Do not edit manually.'
 
67
 
 
68
    while read id; do
 
69
      printf 'alias pci:v%08Xd%08Xsv*sd*bc03sc*i* %s %s\n' \
 
70
        0x10de "0x$id" "$modname" "$pkgname"
 
71
    done <"$object_list"
 
72
 
 
73
  else
 
74
    >&2 printf '%s\n' 'Failed to find the list. Using README.txt to get the list'
 
75
 
 
76
    # We failed to extract the ids from the blob. Use the ones in README.txt
 
77
    # as a fallback
 
78
    printf '%s\n' '# List generated by nvidia_supported. Do not edit manually.'
 
79
    while read id sid; do
 
80
      if [ -z "$sid" ]; then
 
81
        printf 'alias pci:v%08Xd%08Xsv*sd*bc03sc*i* %s %s\n' \
 
82
          0x10de "0x$id" "$modname" "$pkgname"
 
83
      else
 
84
        printf 'alias pci:v%08Xd%08Xsv*sd%08Xbc03sc*i* %s %s\n' \
 
85
          0x10de "0x$id" "0x$sid" "$modname" "$pkgname"
 
86
      fi
 
87
    done <"$readme_list"
 
88
 
 
89
    ret=0
 
90
  fi
 
91
 
 
92
  rm -f "$symbols" "$readme_list" "$object_list" "$diff"
 
93
 
 
94
  return "$ret"
 
95
}
 
96
 
 
97
device_ids "$@"
 
98
 
 
99
# vim:set et sw=2 sts=2: